2009-02-04 63 views
20

在Subversion中,使用「svn merge -r a:b mybranch」可以輕鬆合併來自分支的一系列變更集/差異。但在git中,我發現只能從分支中選擇一個提交來將該補丁應用於我當前的工作分支。所以我想知道是否有一種快速的方法來將bugfix分支中的兩個標籤之間的所有提交應用到我當前的主分支?git修補分支的子範圍的最佳方法是什麼?

回答

44

執行您正在查找的操作的最簡單方法是使用git rebase。這是一個配方。假設標籤A是您要選擇的補丁系列基礎上的提交,並且標籤B是系列中最終補丁的提交。另外,假設br是當前分支的名稱和應該應用新補丁序列的分支。

# Checkout a new temporary branch at the current location 
git checkout -b tmp 

# Move the br branch to the head of the new patchset 
git branch -f br B 

# Rebase the patchset onto tmp, the old location of br 
git rebase --onto tmp A br 
+0

@Charles Bailey:太棒了! – jscoot 2009-02-04 10:51:49

+1

應該指出的是,你不能以這種方式保留關於這些提交的來源的信息。 – 2009-02-04 23:13:42

4

據我所知,你不能git合併這樣。合併旨在加入兩個有共同歷史的分支,而不是用於提取幾個提交或補丁序列。我覺得櫻桃採摘基本上是你要求的。

您可以使用git的櫻桃(不櫻桃採摘!)來找出哪些承諾應被插入到您的分支,然後git的櫻桃採摘他們。你也可以明確地要求git cherry-pick來記錄這些提交的來源,以防你從公共分支中挑選。這可能是解決這個問題的最好方法。 (另一個可能是通過git format-patch將它們導出,然後使用git-am/git-apply導入它們,但這可能會比較慢,再加上它不會記錄提交的來源。)

編輯:「公共」(分支)應理解爲不受歷史編輯限制的內容。當然,您可以在開發閉源軟件時沒有公開代碼就這樣做。

5

我發現做到這一點最簡單的方法是:

git cherry-pick starthash..endhash 

注意這兩個點都沒有空格從哈希標籤,它們分隔條件。

相關問題