2017-08-09 29 views
2

假定以下git分支:A - >乙 - 「ç - > d - >電子 - >的F - 」G能否合成在GIT中的分支即跳過單個變化設定

我已經通過確定git bisect提交C引入了一個錯誤,但是恢復由分支頂部的C引入的更改並不能解決問題。這表明在該分支的後續提交中還存在其他錯誤。

是否有合成以下分支的方法:A→B→D1→E1→F1→G1,其中1表示提交C中引入的更改不存在?然後,我會在該分支上運行git bisect以確定找到其他錯誤。 [希望這不會需要重複多次]

回答

4

是:

git checkout -b newbranch <specifier-for-B> 
git cherry-pick <specifier-for-C>..<specifier-for-G> 

這些<specifier>可以均爲原始哈希ID或分支機構名稱或分支名稱與~number來算回來number第一 - 提交,等等。訣竅是創建一個新的分支,以最後的好提交爲結束,然後挑選剩餘的可能不錯的提交,不包括已知錯誤提交。

一旦你有了這個新的分支,你可以使用git rebase -igit rebase --onto <target> <exclude>刪除更多的提交,如果你喜歡。

+1

注,順便說一句,[Jonathan.Brink的方法](https://stackoverflow.com/a/45600474/1256452)基本上是相同的,除了他開始與新分支在舊分支相同的技巧,然後讓你刪除提交。如果你不得不重複刪除這可能會感覺更方便。儘管如此,它確實需要一個互動的重建步驟(或花哨的'rebase - ath'步法)。 – torek

2

您可以交互重新綁定並移除該提交。

首先創建測試分支:

git checkout -b test 

接下來,開始底墊:

git rebase -i C^ # the parent of C 

當你在交互式屏幕變基,刪除包含提交C行。

這將使save分支有效匹配A -> B -> D1 -> E1 -> F1 -> G1,您可以繼續測試。

如果發現C是唯一承諾您需要刪除,另一種選擇是恢復,所以你並不需要推動這一改變已經被推送的提交任何歷史:

git checkout master # get back to where you started 
git revert C  # will create a revertion commit 
git push   # will only push 1 new commit, the inverse of C