1. git cherry-pick與git rebase
進行兩個獨立分支的代碼合並時有兩個比較常用的命令,分別是
git cherry-pick <commit-id>和
git rebase。
cherry-pick主要可以用於拷貝某個單獨的patch,它的靈活性更大,而rebase主要用於整個分支的一次性合並。git rebase的使用語法為:
git rebase <upstream-branch-name> <to-branch-name>
執行上述命令的過程為:
- 切換到to-branch分支;
- 將to-branch中比upstream-branch多的commit先撤銷掉,並將這些commit放在一塊臨時存儲區(.git/rebase);
- 將upstream-branch中比to-branch多的commit應用到to-branch上,此刻to-branch和upstream-branch的代碼狀態一致;
- 將存放的臨時存儲區的commit重新應用到to-branch上;
- 結束。
執行完上述第3步后,to-branch的代碼狀態已經改變,接着執行第4步時則可能會產生合並沖突。
2. 合並沖突的解決辦法
解決合並沖突幾個常見的辦法是:
- 手動編輯沖突文件,手動刪除或者保留沖突的代碼;
- 對於“both added”、“both deleted”、“both modified”等類型的沖突,若想完整地保留某一方的修改可以執行git checkout --ours(或者--theirs) <文件名>來選擇想要保留的版本。需要注意的是由於git rebase 是先撤銷再應用commit,所以這里的ours指的是upstream-branch,theirs指的是我們將要應用的臨時commit。
- 對於“added by us/them”、“deleted by us/them”等類型的沖突需要使用git rm <file-name>和git add <file-name>來刪除/添加file。在此過程中需要特別注意誰是us,誰是them。
沖突解決完之后,使用git add <file-name>來標記沖突已解決,最后執行git rebase --continue繼續。如果中間遇到某個補丁不需要應用,可以用下面命令忽略:
git rebase --skip
如果想回到rebase執行之前的狀態,可以執行:
git rebase --abort