2013-09-24 39 views
1

考慮以下情形:如何在最近的合併之後僅對提交進行重新綁定?

  1. 我從主簽出一個分支
  2. 我做了一些提交
  3. 我做了一些更多的提交
  4. 現在我想變基從提交我的合併更新的主
  5. 點4,以便來自點2的提交不受影響。

所以,如果我有開始:

 (1)   (2) 
x--x--x--x--x--x--x   master 
     \  \ 
     y--y--Y--y--y  dev 
      (2)(3) (4) 

我想:

 (1)   (2) 
x--x--x--x--x--x--x    master 
     \   \ 
     y--y--------Y'--y'--y' dev 
      (2)  (5)  (5) 

如果我只是做git rebase master將重訂無論是從2和4款和刪除合併3.這不是我想要的。

還有選擇做git merge master,然後git rebase -i -p前合併從3提交和3合併後移至上次合併,並做修正/壁球入合併從3 更新:這是行不通的那很容易。 Git拒絕壓縮兩個合併。這個問題:git rebase interactive: squash merge commits together

+0

我的回答代表(除了我錯誤地引用了運營爲'合併--onto':它是'重訂--onto')。我已經更新了答案,以便更接近你想要的東西。 – VonC

+0

你會得到什麼錯誤信息? – VonC

+0

拒絕壓縮合並:987ab25995f24554cc7ce1451919327e09c5a18b – Alexey

回答

2

你開始從:

 (1) 
x--x--x--x--x--x--x   master 
     \  \ 
     y--y--Y--y--y  dev 
      (2)(3) (4) 

做一個git rebase --onto

git branch dev1 Y^ 
git rebase --onto master Y^ dev 

Y^引用合併的第一父提交Y:這裏 'y',而不是 'x'。
見「Ancestry References」:

的第一個親是你在當你合併的分支,二是承諾在您在合併分支

你最終會搭配:

 (1) 
x--x--x--x--x--x--x    master 
     \   \ 
     y--y  Y'--y'--y' dev 
      (2)  (5) 
     (dev1) 

這將一分爲二的初始dev分支,對master上應用只有最後dev提交,而保持第一個dev提交不變,現在由分支dev1引用。

你可以嘗試:

git rebase -p --onto master `Y^` dev 

,看看是否能保持y之間的關係(即Y^)和新基期數Y'。但我懷疑這是可能的。

-p用於--preserve-merge

1

我最終會做以下幾點:

git rebase -i -p Y^ 

在文件與合併(第一行後大概)添加下面一行行後:

exec sh -c "git merge master; git reset --soft HEAD^^; git rev-parse master > .git/MERGE_HEAD; git commit -C `git rev-parse HEAD`" 
+1

我從http://stackoverflow.com/a/4138485/126529 – Alexey

+0

得到它聽起來不錯。比我的答案更精確。 +1 – VonC

2

用我和VonC的答案使得更自動化的解決方案:

git checkout -b tmp Y 
git merge master 
git reset --soft HEAD^^ 
git rev-parse master > .git/MERGE_HEAD 
git commit -C Y 
git checkout - 
git rebase --onto tmp Y 
git branch -d tmp 

Y - 是合併承諾被擴展。

而且它的工作原理是這樣的:

x--x--x--x--x--x--x   master 
     \  \ 
     y--y--Y--y--y  dev 

x--x--x--x--x--x--x   master 
     |  \ 
     \  Y    tmp 
     \ /\ 
     y--y y--y  dev 

x--x--x--x--x--x--x   master 
     |  \  \ 
     \  Y-----Y'  tmp 
     \ /\ 
     y--y y--y  dev 

x--x--x--x--x--x--x   master 
     |   \ 
     |  -------Y'  tmp 
     \ /
     y--y--Y--y--y  dev 

x--x--x--x--x--x--x   master 
     |   \ 
     |  -------Y'  tmp 
     \ /  \ 
     y--y   y--y dev 

x--x--x--x--x--x--x   master 
     \   \ 
     y--y--------Y'--y--y dev 
相關問題