2009-07-03 63 views
134

我在這裏遇到了一些問題:我在Git中有一個特定於問題的分支28s,那是我在一般的develop分支中合併的。原來我做得太快了,所以我用git-revert來取消合併。然而,現在是合併28sdevelop的時候了,但git-merge命令看到了原始合併,並且愉快地宣佈一切正常,並且分支已經合併了。現在我該怎麼做?創建一個「還原」還原「28s - >開發」「'提交?似乎不是一個好辦法,但目前我無法想象任何其他方法。在Git中重新執行還原合併

樹結構的樣子:

Git log output

+0

這是什麼GUI? – 2009-07-03 16:01:18

+3

這是GitX(http://gitx.frim.nl)。 – 2009-07-06 06:56:16

回答

110

你必須 「恢復的復歸」。取決於你是如何回覆的,可能並不像聽起來那麼容易。看看official document on this topic

---o---o---o---M---x---x---W---x---Y 
      /
     ---A---B-------------------C---D 

允許:

---o---o---o---M---x---x-------x-------* 
      /     /
     ---A---B-------------------C---D 

但所有這一切工作的?當然可以。你可以恢復合併,從純粹的技術角度來看,git很自然地做到了,並且沒有真正的問題。
它只是把它從「合併前的狀態」改爲 「合併後的狀態」,就是這樣。
沒什麼複雜的,沒什麼奇怪的, 沒什麼真正危險的。 Git會做甚至沒有考慮它。

所以從技術角度,有什麼不對從工作流程的角度恢復合併,但 它的東西,你通常應該儘量避免

如果有可能,例如,如果發現得到了合併 到主樹的問題,,而不是恢復合併,儘量真的很難

  • 平分問題然後修復它,
  • 或嘗試恢復導致它的單個提交。

是的,它更復雜,不,它並不總是去上班(有時 的答案是:「哎呀,我真不應該把它合併,因爲它不是 準備好着呢,我真的需要撤消合併的所有「)。因此,那麼你真的應該恢復合併,但是當你想重新合併時,你現在需要通過恢復恢復來做到這一點。

+5

良好的鏈接(+1)。我冒昧地在您的答案中複製部分文件,以便讀者立即看到本案中的相關選項。如果您不同意,請隨時恢復。 – VonC 2009-07-03 11:00:28

+3

我們剛碰到一個案例,我們需要做到這一點,發現這裏的樂趣並不完全停止。這是一個長期合併的分支,因此我們需要繼續更新它。我的方法在這裏:http://tech.patientslikeme.com/2010/09/29/dealing-with-git-merge-revisions/ – jdwyah 2010-09-29 15:07:51

+0

我跟着@ jdwyah的博客文章,這是光榮的(嚴重的是,這真是太棒了,它只是工作)。 – hellatan 2013-08-20 21:52:17

2

而不是使用git-revert你可以在devel分支扔都用這個命令離開(撤銷)錯誤的合併提交(而不僅僅是恢復它)的。

git checkout devel 
git reset --hard COMMIT_BEFORE_WRONG_MERGE 

這也將相應地調整工作目錄的內容。 注意

  • 保存在開發分支(因爲錯誤的合併)的變化,因爲他們太 將由git-reset刪除。所有提交之後,您指定爲 的git reset參數將會消失!
  • 此外,如果您的更改已從其他存儲庫 中取出,則不要執行此操作,因爲重置將重寫歷史記錄。

我推薦在試用之前仔細研究git-reset手冊頁。

現在,復位後,你可以在devel重新申請更改,然後做

git checkout devel 
git merge 28s 

這將是從28s真正合併到devel像最初的一個(也就是現在的 從Git的刪除歷史)。

29

讓我們假設你有這樣的歷史

---o---o---o---M---W---x-------x-------* 
      /      
     ---A---B 

其中A,B未能提交和W - 正在恢復中號

的所以我纔開始修復發現的問題我不W的摘櫻桃承諾我的分支

git cherry-pick -x W 

然後我恢復W¯¯提交我的分支

git revert W 

之後我可以繼續修復。

最終的歷史可能看起來像:

---o---o---o---M---W---x-------x-------* 
      /     / 
     ---A---B---W---W`----------C---D 

當我發PR它會清楚地表明,PR是撤銷還原並增加了一些新的提交。

2

要恢復的復歸沒有搞砸了您的工作流程太多:

  • 創建開發
  • 還原的還原承諾上的本地副本開發
  • 合併是複製到的本地垃圾副本你功能分支,並將你的功能分支推送到你的git服務器。

當您準備好時,您的功能分支應該能夠正常合併。這裏唯一的缺點是你會在歷史中有一些額外的合併/還原提交。

1

我剛剛在面對同樣的問題時發現了這篇文章。我發現上面的wayyy可怕的做重置困難等我最終會刪除我不想要的東西,並將無法取回它。

取而代之,我檢出了我希望分支返回的提交。 git checkout 123466t7632723。然後轉換成分支git checkout my-new-branch。然後我刪除了我不再需要的分支。當然,這隻有在你能夠拋棄你搞砸的分支時纔有用。