** 轉(zhuǎn)載地址 **:http://my.oschina.net/u/1757458/blog/349827
摘要
git conflict 通常有三種 樹沖突匙监、內(nèi)容沖突埋凯、邏輯沖突。
沖突的產(chǎn)生
? 很多命令都可能出現(xiàn)沖突嫩絮,但從根本上來講载矿,都是merge 和 patch(應(yīng)用補(bǔ)栋辶伞)時產(chǎn)生沖突。
? 而rebase就是重新設(shè)置基準(zhǔn)桩卵,然后應(yīng)用補(bǔ)丁的過程验靡,所以也會沖突。
? git pull會自動merge雏节,repo sync會自動rebase胜嗓,所以git pull和repo sync也會產(chǎn)生沖突。當(dāng)然git rebase就更不用說了
沖突的類型
1.樹沖突
? 方法文件名修改造成的沖突钩乍,稱為樹沖突辞州。
? 比如,a用戶把文件改名為a.c寥粹,b用戶把同一個文件改名為b.c变过,那么b將這兩個commit合并時埃元,會產(chǎn)生沖突。
? $ git status added by us: b.c both deleted: origin-name.c added by them: a.c
? 如果最終確定用b.c媚狰,那么解決辦法如下:
? git rm a.cgit rm origin-name.cgit add b.cgit commit
? 執(zhí)行前面兩個git rm時岛杀,會告警“file-name : needs merge”,可以不必理會崭孤。
?
? 樹沖突也可以用git mergetool來解決类嗤,但整個解決過程是在交互式問答中完成的,用d 刪除不要的文件辨宠,用c保留需要的文件遗锣。
? 最后執(zhí)行g(shù)it commit提交即可。
2.邏輯沖突
? git自動處理(合并/應(yīng)用補(bǔ)杜砀)成功黄伊,但是邏輯上是有問題的。
? 比如另外一個人修改了文件名派殷,但我還使用老的文件名,這種情況下自動處理是能成功的墓阀,但實(shí)際上是有問題的毡惜。
? 又比如,函數(shù)返回值含義變化斯撮,但我還使用老的含義经伙,這種情況自動處理成功,但可能隱藏著重大BUG勿锅。這種問題帕膜,主要通過自動化測試來保障。所以最好是能夠?qū)懗霰容^完備的自動化測試用例溢十。
? 這種沖突的解決垮刹,就是做一次BUG修正。不是真正解決git報(bào)告的沖突张弛。
3.內(nèi)容沖突
? 兩個用戶修改了同一個文件的同一塊區(qū)域荒典,git會報(bào)告內(nèi)容沖突。我們常見的都是這種吞鸭。
沖突情況
? 當(dāng)我們merge還是pull完后如果有沖突的話就會出現(xiàn)下面這個狀態(tài)
出現(xiàn)CONFLICT 沖突我們就必須去查看對應(yīng)的文件而不是直接add . 再次commit寺董,這樣git會直接把兩個沖突的文件合并,然后提交
沖突處理
? 當(dāng)兩條分支對同一個文件的同一個文本塊進(jìn)行了不同的修改刻剥,并試圖合并時遮咖,Git不能自動合并的,稱之為沖突(conflict)造虏。解決沖突需要人工處理御吞。
? 比如當(dāng)前在master分支麦箍,想把dev分支merge過來,結(jié)果產(chǎn)生了一個沖突魄藕,打開文件內(nèi)容可以看到這么一個沖突:
? <<<<<<< HEAD
? test in master
? =======
? test in dev
? >>>>>>> dev
? <<<<<<<標(biāo)記沖突開始内列,后面跟的是當(dāng)前分支中的內(nèi)容。
? HEAD指向當(dāng)前分支末梢的提交背率。
? =======之后话瞧,>>>>>>>之前是要merge過來的另一條分支上的代碼。
? >>>>>>>之后的dev是該分支的名字寝姿。
? 對于簡單的合并交排,手工編輯,然后去掉這些標(biāo)記饵筑,最后像往常的提交一樣先add再commit即可埃篓。
git 刪除已經(jīng) add 文件
使用 git rm 命令即可,有兩種選擇
? git rm --cached "文件路徑"根资,不刪除物理文件架专,僅將該文件從緩存中刪除;
? git rm --f "文件路徑"玄帕,不僅將該文件從緩存中刪除部脚,還會將物理文件刪除(不會回收到垃圾桶)。
Git工作方法
? git branch working #建立一個自己的分支裤纹,如取名working
? git checkout working #確保使用的是工作分支
? git add .
? git commit -m"$1" -a #提交代碼到本地委刘,工作分支增加一個版本,這里的$1是運(yùn)行腳本的第一個參數(shù)
? git checkout master git pull origin master #切換回默認(rèn)分支鹰椒,并將默認(rèn)分支和中央最新版本合并
? git merge working #在本地合并你的這次修改到默認(rèn)分支
? git push origin master #提交到中央版本庫锡移,接下來還是要切換回工作分支的
? git checkout working --force