>[info] git merge
功能:合并分支。
現在,我們把`dev`分支的工作成果合并到`master`分支上:
~~~
$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
~~~
`git merge`命令用于合并指定分支到當前分支。
### 想合并,就要先把自己的工作能完成。
~~~
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master)
$ git merge dev
error: Your local changes to the following files would be overwritten by merge:
test
Please commit your changes or stash them before you merge.
Aborting
~~~
如果當前分支有工作未完成(工作區不是干凈的:有未添加到暫存區的修改或者暫存區有內容),那么就會報錯:
~~~
錯誤:您的本地更改以下文件將會被合并覆蓋:
測試
請提交您的更改或隱藏他們之前合并。
流產
~~~
這也能解答我們另一個疑問:
>[info] 疑問:“工作目錄會切換成解決沖突的模式。”什么意思,如果此時工作區還有工作(有未提交到暫存區的修改和暫存區內容)怎么辦?丟失嗎?
> 答:不先完成工作,你壓根就不能進行合并操作哈。
* * * * *
### 如果兩個分支都對同一個文件進行了修改:
~~~
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master)
$ git merge dev
Auto-merging test
CONFLICT (content): Merge conflict in test
Automatic merge failed; fix conflicts and then commit the result.
~~~
那么就會報錯:
~~~
編碼測試
在測試沖突(內容):合并沖突
自動合并失敗;解決沖突,然后提交結果。
~~~
此時看一下狀態:
~~~
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master|MERGING)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 7 commits.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: test
no changes added to commit (use "git add" and/or "git commit -a")
~~~
打開沖突的文件看看(工作區進入解決沖突模式):
~~~
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master|MERGING)
$ cat test
1
2
xa
sd
<<<<<<< HEAD
master
master2
master3
=======
up test 1
up test 2
>>>>>>> dev
~~~
我們發現:
~~~
……
<<<<<<< HEAD
master
master2
master3
=======
up test 1
up test 2
>>>>>>> dev
……
~~~
<<<<<<< HEAD 內容 >>>>>>> dev 包裹的就是沖突的部分,=======用于分割兩部分上面HEAD表示當前分支,下面一部分表示dev部分的內容。(細心的你應該發現了命令提示符后面的`(master|MERGING)`了吧)
根據提示我們手動編輯文件解決沖突后在提交(`git add`,`git commit`)就可以完成合并了。
我們先試一下不`git add`,直接`git commit`看有什么效果:
~~~
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master|MERGING)
$ git commit -m 'master merge dev'
U test
error: Committing is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.
~~~
好吧,被發現了:
~~~
錯誤:承諾是不可能的因為你有unmerged文件。
提示:解決他們在工作樹中,然后使用“git添加/ rm <文件>”
提示:適當的分辨率和做出承諾。
致命:退出,因為一個未解決的沖突。
~~~
我們猜想是不是這段沖突代碼還有什么作用,能監視到我們并沒有做更改操作嗎?ok,不管沖突,`git add`再直接提交,試一下猜想:
~~~
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master|MERGING)
$ git add test
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master|MERGING)
$ git commit -m 'master merge dev'
[master cb8e75d] master merge dev
~~~
哈哈,我并沒有進行任何編輯呢,看來git并沒有監視我們是否解決沖突了,它只是將沖突給我們看下,讓我們自己決定,那么沖突代碼并沒有其他作用,只是方便我們對照解決沖突部分。(不過它也不能“監視”呢,不然要是我們代碼就是有這個用于標記沖突部分的關鍵字呢是吧)
### 來討論一個問題:合并時,什么情況會產生沖突?(B為A的分支,將B合并到A)
1. A,B兩個分支都同一個文件進行了修改
2. A,B修改了各自的文件,但不是你同一個文件
3. A修改了文件,B沒有任何修改
4. B修改了文件,A沒有任何修改
5. A新增了新的文件,B沒有新增文件
6. B新增了新的文件,A沒有新增文件
7. A,B都新增了文件,各自新增的文件名不同
8. A,B都新增了文件,各自新增的文件名有相同的
9. A刪除了某文件,B沒有刪除文件
10. B刪除了某文件,A沒有刪除文件
11. A,B都刪除了某文件,各自刪除的文件名不同
12. A,B都刪除了某文件,各自刪除的文件名有相同的
……???
到底什么時候沖突,什么時候不沖突,每種情況下是怎么解決沖突的。
1. 沖突:對沖突文件進行手動編輯解決(git將文件差異對比放在沖突文件中了),然后在提交,工作目錄會切換成解決沖突的模式。
疑問:“工作目錄會切換成解決沖突的模式。”什么意思,如果此時工作區還有工作(有未提交到暫存區的修改和暫存區內容)怎么辦?丟失嗎?
2. 不知道
3. 不知道
4. 不知道
5. 不知道
6. 不知道
7. 不知道
8. 不知道
9. 不知道
10. 不知道
11. 不知道
12. 不知道
合并竟然把工作區(工作目錄,未添加到暫存區的修改,暫存區)也合并過來了。
切換分支,并不會改變工作區哦,看來工作區不是屬于分支的哦。(這可能就解釋了上面那句荒誕的問題了)
不帶參數時什么效果
----
~~~
什么時候會有修改沖突?
A的f上一個版本,等于B的f當前版本,或者B的f上一個版本,等于A的f當前版本,此時沒有沖突,新版f直接覆蓋舊版。
除此之外,都需要解決沖突
而git能基于行的版本跟蹤!
~~~
- 說明
- git配置
- git與github的關系
- 基礎概念
- git命令
- git init
- git status
- git diff
- git log
- git reflog
- git add
- git commit
- git reset
- git checkout
- git rm
- git stash
- git remote
- git push
- git clone
- git branch
- git fetch
- git merge
- git rebase
- git pull
- git tag
- 建立版本庫
- 分支合并
- 遠程庫別名
- Pull requests
- 擴展知識
- 功能文件
- 差異看法
- 注意細節
- github移動端
- git工作系統理解
- 倉庫嵌套問題
- 倉庫的使用問題
- 常用命令
- 學習資料
- 學習總結
- 示例文件
- README.md
- CONTRIBUTING.md
- .gitignore
- coding
- 大小寫問題
- 如何貢獻
- 使用賬號密碼clone
- git目錄分析
- HEAD
- 代碼部署問題
- 開發流程
- 指定公鑰文件