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繼續。若是中間遇到某個補丁不須要應用,能夠用下面命令忽略:
若是想回到rebase執行以前的狀態,能夠執行: