2013-07-23 55 views
6

不時,我們可以在我們提交一個特性分支到我們的基準,發現在某些情況下,它可以去可怕的錯誤,這樣的改變需要被還原的問題跑,而不會失去所有其他的,因爲隨後提交完成。但是,有人需要繼續在原始分支上工作。如何從功能分支中撤消提交給主線的更改,但讓分支保持最新狀態?

我不想使用git rebase主線改變歷史(因爲這會引發各種問題,全部由自己),但是當我在主線上做git revert然後儘快git merge運行在分支上,爲了完成對系統的任何其他更改,所有完成的工作都會消失。

我該怎麼做才能保持分支上的變化不變?

+0

這是您正在恢復的合併提交嗎?如果是這樣,看看http://stackoverflow.com/questions/1078146/re-doing-a-reverted-merge-in-git – jszakmeister

+1

啊,我看到了問題,你正在合併主線到你的分支。我認爲我上面提供的鏈接可以幫你解決問題。你只需要在你的分支上「恢復回覆」。 – jszakmeister

+0

ohh。好的,那裏提到的一些東西看起來很有幫助 –

回答

5

我假設你不想做任何重定和重置,這是合併的方法。

假設您有兩個分支masterfeature。 所以,你已經決定合併功能爲master

$ git merge feature 

現在,你對主所有feature變化。我假設最困難的情況 - 在兩個分支合併後提交。但是,突然你看到feature沒有任何作用,一切都被打破,並決定恢復它。你的歷史就是(你可以看到它與git log --graph feature master):

* commit 838f29fda2333bdbfc0d1be44d2387e6119dc4e8 
| 
|  f3 
|  
| * commit 58d1e3f0e032cc77d4ab2bbf0bdfe6407b96b7e6 
| | 
| |  m3 
| |  
| * commit afb600fe382befe095f9b8a6e9eef98be25c929b 
| |\ Merge: 5cddc52 8660a59 
| |/ 
|/| 
| |  Merge branch 'feature' 
| | 
* | commit 8660a59eeb13f9b3447846ba6977140f7c86c7a4 
| | 
| |  f2 
| | 
* | commit 6f76e2288d69808b97981340198fd8044ab47630 
| | 
| |  f1 
| | 
| * commit 5cddc528de424a01d1d18552ddea93435618e2f7 
| | 
| |  m2 
| | 
| * commit fa6ebb76f9f0308f7dcd1148503534668fa15358 
|/ 
| 
|  m1 
| 
* commit 4e3aa05d6f46eb14bbbc253a42325e9a53a3393e 

通知的提交F3和M3已經合併後已經完成。因此,您需要仔細刪除中出現的僅來自feature的更改。

要做到這一點,您可以在master上恢復合併提交,並保留主基地(參數-m1)。爲了實現它,我創建基於合併點的新分支,在其還原:

$ git checkout -b feature-revert afb600fe 
$ git revert -m1 HEAD 

現在,我們已經在分支feature-revert上次取消的變化。現在,它是簡單的只是把它放到主通過合併:

$ git checkout master 
$ git merge feature-revert 

所以,此刻的master沒有從任何feature。但是,如果稍後想要重新合併該功能,則所有還原的更改都將在master中丟失,因爲它們已合併並被還原。

爲了解決這個問題,您應該恢復該還原(他 - 他),然後把它合併到feature

$ git checkout feature-revert 
$ git revert HEAD 
$ git checkout feature 
$ git merge feature-revert 

我想我們不需要分支了,因爲我們合併它了,但你可以繼續,如果你想:

$ git branch -d feature-revert 

你應該知道,該合併回彙集了來自master所有變更爲feature通常正常的工作流程。

現在,在feature中進行修復後,您可以像往常一樣隨時將其合併到master中。

0

您是否嘗試過在功能分支上執行git revert,然後將其合併到主設備中?

這樣基線保持不變,您可以繼續使用您的功能分支。

+0

如果我這樣做,我將如何保持這些變化?這不會消除變化嗎?如果我立即恢復了恢復,後續合併是否會起作用,還是會再次刪除更改? –

1

當您的git revert更改時,它會創建一個新的提交,其樹沒有這些更改。

雖然這些更改不是刪除了,但它們的原始提交仍然存在。

所以,只要:

  • git revert您的合併提交對主(記得要選擇正確的父母)。現在,主人沒有從您的功能分支中引入破碎的代碼
  • 修復功能分支
  • 恢復主人上的第一個還原。這將重新推出該功能的狀態,你合併了它最初
  • 合併功能分支修復過

here(或者如果安裝在本地的git文檔相同文件)更多細節。

您的歷史結束了看起來像:

--- a -- ... -- Mi ... ~Mi ... ~~Mi -- Mx [master] 
     \  /     /
     f1 ... fi -- fj ........ x -- fx  [feature] 

其中Mi是從功能分支原來的合併,~Mi是逆轉,當你注意到這個問題,fj .. fx是後續修復的特性分支,~~Mi~Mi的回覆等。

+0

但是一旦我把git還原了,我就不能將主控合併回到我需要做的功能分支。 –

+0

是的,你可以,只是_revert返回first_。這是上面的項目符號列表中的第三點,在圖中用'~~ Mi'表示(並在下面的段落中進行了描述),並且在鏈接文檔中的Linus引用之下顯示。 – Useless

+0

無法通過'git rebase --no-ff a'重新創建分支,按照鏈接的文檔,其中a是分支點? – Hasturkun

相關問題