天天看點

Git學習筆記5 merge沖突時二選一

常常有這樣一種情況,程式員甲在Git branch了一個項目,然後花了1個月在 branch 中開發了幾個功能,解決了一些bug,最後一步必然是把這個branch merge回master,然後解決沖突,再進行交給QA前的最後調試。解決沖突是個很痛苦的過程,如果高效解決 merge conflict 是所有版本控制系統花大力氣的地方之一,這裡就不贅述,隻介紹如何在merge 沖突時使用 Git 指令簡單地在發生沖突的兩個檔案版本中進行二選一。

假設原來有檔案A,程式員甲把A進行了完全的重寫,而甲在自己的branch工作的同時,他的同僚程式員乙則對A進行了一個優化。這樣,當甲想要merge的時候,A檔案就有很多的沖突,可能多達幾百行。

$ git merge master

   Auto-merged xxx/A.java

   CONFLICT (content) : Merge conflict in xxx/A.java

   Automatic merge failed; fix conflicts and then commit the result.

這時候兩個程式員達成一緻,最後應該完全采用甲的版本,因為乙隻是在原基礎上優化,而甲進行了全方面的重寫。在這種情況下,git checkout 指令的   - -theirs 和 - -ours 就派上用場了。前者表示保留甲 想要merge的版本,後者表示保留master branch中的版本,即乙的版本。

$ git checkout - -ours xxx/A.java // 抛棄甲的版本,保留乙的

$ git checkout - -theirs xxx/A.java // 抛棄乙的版本,完全采用甲的

這兩個參數隻适用于 Git 1.6.1及更新的版本。

在1.6.1 以前版本中,雖然沒有這兩個參數,但也有辦法

1、實作 - - theirs

$ git reset - - xxx/A.java

$ git checkout MERGE_HEAD - - xxx/A.java

2、實作 - - ours

$ git reset - - xxx/A.java

$ git checkout ORIG_HEAD - - xxx/A.java