2013-10-14 62 views
3

我需要恢復整個分支合併爲單一提交像這樣的方式:恢復整個分支在一個提交

  [topic] 
    o---o---o-------X 
    /
    |  [master] 
---o---o---o 

的承諾X必須有國家像主題的master~2(原點分支)

我的解決辦法是:

git rev-list --reverse master..topic | while read SHA; do 
    git revert -n ${SHA} 
done 
git commit -m "Reverted topic branch" 

有沒有更好的(短)的解決方案?

的目的想象我有一種基於幾乎混帳流回購。

   [release-3] 
     o---o---o---o 
    /  \  [fix-for-rc-3] 
    /   o---o---o 
    /
    |  [development] 
---o---o---o 

我有一個development分公司,即將到來的release-3分支和所謂的hot-fix-feature-for-rc-3分支。在這個分支中,我正在做一些醜陋的黑客來完成我的發佈,但我根本不希望它在development中,因爲更多的「正確」解決方案已經降落在此處,但由於某種原因無法應用到release-3分支。所以,我必須做到以下幾點...

        [release-3] 
     o---o---o---o--------------------M 
    /  \  [fix-for-rc-3]/
    /   o---o---o----------------X 
    /         \ 
    |          \[development] 
---o---o---o---------------------------------D 

我必須合併fix-for-rc-3release-3(M點),然後做一個「恢復 - 所有這狗屎」提交(X點),並把它合併做development(D點),所以這段代碼永遠不會到達這裏,即使整個release-3分支合併到development,然後釋放完成。

這就是爲什麼我需要恢復整個分支...

的問題

雖然其根源問題得到解決,但仍有問題得到一個分支原因叉點」,如果topic是已合併到releasemerge-base將失敗。

+1

您實際上並不需要恢復更改以實現此目的。您可以使用「我們的」策略將'fix-for-rc-3'合併到'development'中。或者更好的是,使用「我們的」策略將'release-3'合併到'development'中。 –

+0

@kan不會全部通過上述工作流創建,不是嗎? 'release-3'中的每個提交都是分支合併。我所需要做的就是將它們全部合併爲'development'(可能帶有'-s ors')。 – Olegas

+0

@JohnBartholomew據我所知,他需要合併到'development'的'release-3'中,然後使用'ours'將'fix-for-rc-3'合併到一起。然後將'fix-for-rc-3'合併到'release-3'中。 – kan

回答

3

您可以創建新的commit恢復到分支這樣的基礎:

# on "topic" branch 
git read-tree $(git merge-base topic master) 
git commit -m "Reverted topic branch" 
git checkout -- . # update working copy to match the committed tree 

在你的榜樣使用,要還原的變化,使您可以合併分支回到master(或development,因爲它在你的例子中被調用),而實際上並沒有包含來自topic分支的任何更改。但是,這可以通過使用「我們的」合併策略添加恢復提交來完成。從git-merge documentation

我們

這解決任何數量的頭,但由此產生的合併的樹始終是當前分支頭,有效地忽略來自所有其他分支的所有更改。它是用來取代側枝的舊發展歷史。請注意,這與遞歸合併策略的-Xours選項不同。

例如:

git checkout master 
git merge -s ours topic 
+0

不工作。然後我做了提交,git說「沒有提交,工作目錄乾淨」。我同意他的看法 - 我的工作目標改變了,但是中轉區域很乾淨,所以沒什麼可提交的。 – Olegas

+0

@ Olegas:你剛纔給出了上面的命令嗎? 'git checkout'命令末尾的' - .'非常重要。 –

+0

@ Olegas:'git checkout - .'應該用它檢出的所有內容更新索引。 (這種結帳「寫入」索引。)但是,如上所述,這不會刪除項目,因此您可能需要首先在工作目錄中「rm -r」中的所有內容,然後使用「git status」看看是否有東西要刪除。 – torek

2

你可以閱讀的提交到索引樹的信息,然後提交索引。這樣,新的提交將具有與舊的提交完全相同的樹狀態。

git checkout topic 
git read-tree master~2 
git commit -m 'revert complete branch' 

請問爲什麼你這樣做?你想解決什麼問題?有一個分支,然後完全恢復的目的是什麼?

+0

添加了一個關於這個目的...... – Olegas

1

什麼是「合併」與「我們」的戰略?

$ git checkout master~2 
...... 
HEAD is now at 06a96da... c2 
$ git merge -s ours topic 
Merge made by the 'ours' strategy. 
[email protected]:/tmp/g$ git checkout topic 
Warning: you are leaving 1 commit behind, not connected to 
any of your branches: 

    cdaad73 Merge branch 'topic' into HEAD 
.... 
Switched to branch 'topic' 
$ git merge cdaad73 
Updating 0b980be..cdaad73 
Fast-forward 

相較於其他解決方案這個解決方案是更好,因爲它創建合併提交其明確表示,它指向提交到要恢復到確切的歷史。

-1

我不知道,如果我弄清楚了,但不應該那麼簡單嗎?

git checkout topic 
git reset --hard master~2 
+0

在現實世界中(不是一個小例子)我實際上不知道我必須倒回多少提交 – Olegas

+0

所以,我可以使用合併基礎,但我需要一個新的提交,而不是重置。 – Olegas

+0

@Olegas當然,你可以使用其他所有的裁判而不是'master〜2'。例如,使用'git merge-base'來找到共同的祖先。 「需要一個新的承諾」對我來說很清楚。但是,我會放棄整個分支並從頭創建它。 – KingCrunch

相關問題