1. 程式人生 > >mzy git學習,分支衝突,以及衝突解決(五)

mzy git學習,分支衝突,以及衝突解決(五)

衝突解決:

先嚐試製造衝突:

首先我:git checkout -b mzy
建立一個mzy的分支
然後在其中修改readme.txt檔案,隨便加上一點東西。
vim readme.txt   write... wq


然後:

git add readme.txt
git commit -m "mzy分支上修改"


這時我的master分支還是指向上一個版本的,但是我的mzy分支已經迭代了一個版本了。
但是現在如果切換回master分支,並且使用git merge mzy,這時因為master和mzy仍然
只是簡單的前後相鄰的兩個單線性版本,所以直接merge不會有任何問題。


 


但是我現在要做的是製造衝突!
所以我先git checkout master,首先切換到了master分支
我又vim readme.txt,把其中的內容隨便修改了一下。
然後在master分支上:

git add readme.txt
git commit -m "在master主分支上修改提交readme.txt"


現在關係就複雜了,就不是簡單的線性關係了,而是有了分叉。

現在再次,在master主分支上試圖合併mzy分支:
git merge mzy,發現:

$ git merge mzy
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.


告訴我們,當前分支和我們要合併的mzy分支有衝突,必須手動合併,自動合併失敗了!
git status,檢視當前git的狀態

$ git status
On branch master
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:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")


發現現在提示,在我們嘗試合併master分支和mzy分支的時候,因為其中對相同的readme.txt檔案有修改所以不能自動合併
提示有unmerged paths,讓我們手動去解決它。


然後我們開啟 readme.txt,發現其中有:
 

git 是一個好工具,就是門檻比較高。
<<<<<<< HEAD
這是我在master上add,commit的內容
=======
這是我在mzy上add,commit的內容
>>>>>>> mzy

 

可以看出git在這種無法自動處理的衝突上,使用了
<<<<<<<
=======
>>>>>>>
進行標識
<<<<<<<HEAD:固定的表示當前HEAD指向的,不一定是master。
=======:用於衝突之間分隔
>>>>>>>:被合併分支名稱
內容一定是當前分支在HEAD下,被合併分支在後面。


手動修改這些檔案,去掉其中的分隔符號,並且把內容修改成你想要的樣子,
再次 git add readme.txt,git commit -m "合併分支mzy,並且解決了衝突"

但是要注意,只有當前分支會產生修改,被合併的分支是不會發生改變的!

現在提示:[master 3b15b8e] conflict fixed 合併成功!


我們可以讓日誌顯示格式改一改,看到其中的合併步驟:
git log --graph --pretty=oneline --abbrev-commit
<
或者直接使用簡單的:git log --graph[這樣會顯示很長]
或者:git log --graph --pretty=oneline
[這樣會把全部顯示commitId,沒有reflog那種簡潔]
最好的還是:
git log    --graph      --pretty=oneline   --abbrev-commit
檢視日誌  分支合併圖    一行顯示       縮減commitId的長度

>
 

$ git log --graph --pretty=oneline --abbrev-commit
*   3b15b8e (HEAD -> master) conflict fixed
|\
| * dbee345 (mzy) AND simple
* | b1d6af5 在主分支上進行提交
|/
* fd4ceae 修改了readme.txt檔案
* c5687b8 刪除test.txt[C
* b71048d 提交test.txt
* 88726c9 提交了readme.txt中的修改
* e4deff9 git change readme.txt add tracks change of files
* 9a3670d add LICENSE to res
* c3e7dc7 加上了GPL
* c17e52f 加上了一些新玩意兒distributed
* 9f6ffb9 第一次提交readme.txt

finish, 衝突解決!

問:


是不是如果沒有 git merge mzy,那麼status就不會顯示衝突?

是的,如果你的分支都在各自工作,沒有merge,就算相同的檔案中都各自有修改,git status都是不會提醒的,
只有你合併的時候,才會出現衝突,各個分支其實是互不干擾的!


如果,是修改的兩個不同的檔案還會有衝突嗎?但是應該還是有分支的吧?不是線性的?
 

不會有衝突,是的,還是發散出了分支的,但是不會衝突了,因為修改的是不同的檔案!
當我們在master上進行merge分支的時候:
$ git merge mzy
Already up to date.(已經是最新的了。)
直接就提示成功了!