2013-07-13 64 views
1

我合併了一個相對較老的分支,並且合併的結果是一團糟。由於某些未知的原因,當我運行git合併時,它會自動獲取一些已過時的代碼,這些代碼已經在另一個分支中更新併合併到master中。如何在git中手動合併分支?

這個古老的分支都有,我想和這樣做類似

git difftool oldbranch 

和手動複製了一個可視化difftool的變化只有很少的變化比清理造成自動的混亂容易得多合併。

該方法的問題是,它弄亂了我的歷史/網絡/樹,因爲它沒有顯示分支被合併。

問題是我如何手動合併分支在git中而不依賴於自動合併(最好是使用圖形差異/合併工具)?

回答

2

這個古老的分支都有,我想和這樣做類似

git difftool oldbranch

和手動複製了一個可視化difftool的變化比清理殘局方便很多隻有幾個變化自動合併造成的。

由於這個分支是舊的,只有一些你想要的改變,你可以做的就是嘗試將改變重新映射到master,然後合併到更新的分支中。

但是,既然你提到老分支不知何故也帶來了你不想要的舊變化,那麼讓我們對你變基點的東西稍微有所選擇。

讓我們假設您實際上想要的所有更改都是在原分支的原始提交中,我們將其稱爲分支old。因此,對於old歷史看起來有點像這樣:

I   J   master 
o---------o----------o 
      \ 
      \ 
      o K 
       \ 
       \ 
       o L 
       \ 
        \ 
        o old 

比方說,你想通過old合併提交Lmaster,但不知何故J是一個壞的承諾包括已經在master修正,但不知何故當您運行

# With master checked out 
git merge old 

讓我們也假設K也有「壞」的承諾,你不希望添加到master仍然被合併。

然後,你可以做的是使一個新的分支關閉當前提交的master,並選擇性地通過old變基承諾L到新的分支:

# Make a new branch off current commit of master 
git branch new-branch master 

# Now rebase L through old onto new-branch 
git rebase --onto new-branch K old 

這告訴Git是採取的提交Kold,並將它們以不同的形式複製到new-branch的末端,而不包括K,因爲它是該範圍的專用末端(根據數字行,這將類似於(K, old])。

所以,現在你的分支是這樣的:

I   J   master 
o---------o----------o 
      \   \ 
      \   \ 
      o K  o L` 
       \   \ 
       \   \ 
       o L  o new-branch (same commit as where old branch was at) 
       \ 
        \ 
        o old 

現在你可以使用一個快進或快不進合併在新的分支合併:

# From master branch, use fast-forward merge 
git merge new-branch 

# Or force a merge-commit with non-fast-forward 
git merge --no-ff new-branch 

代替使用rebase,你也可以通過使用cherry-pick代替new-branch來提高選擇性,這將允許你選擇一系列提交以及單個提交,從而爲你提供更細化的控制。

1

如果你真的想要走這條路,你可以手動合併,然後用

git merge -s ours oldbranch 

爲合併這將標誌着分支,但不應用任何變化掌握。

+0

這看起來像會起作用,但看起來很髒。 – 2013-07-13 17:36:03