2015-05-31 203 views
5

在這裏,我有我的回購提交日誌。你可以看到「Merge branch ... into ...」提交,並且在提交之後,分支被合併。刪除Git中的合併提交

我需要刪除該合併提交,但不會放棄更改。 默認重新綁定不顯示這些合併提交。

enter image description here

+0

所以,你想要做一個軟復位? –

+0

不,我不想重置任何更改。我只想「隱藏」合併分支提交。因爲他們有雙倍。一個是合併,另一個是提交。 –

+0

可能重複的[git刪除合併提交從歷史記錄](http://stackoverflow.com/questions/17577409/git-remove-merge-commit-from-history) – Makoto

回答

8

如果你想申請的提交的變化,而不包括合併提交(這是羅蘭·史密斯指出,通常被認爲是不好的做法),您可以使用git rebase具有以下流程:

  1. 簽出您希望更改處於打開狀態的分支(假設主人):git checkout master
  2. 將主人重置爲您要撤消合併之前的提交:git reset --hard <hash of prior commit>。確保您正在處理的分支上沒有未提交的更改,或者此命令將其清除。
  3. 簽出包含您希望「合併」爲主的更新的分支,而不實際合併(我們稱之爲dev):git checkout dev
  4. Rebase dev到主。這會使dev的HEAD提交上游到主指向的最近提交:git rebase master(有關更多信息,請參閱the docs)。
  5. 修復在重新綁定期間產生的任何合併衝突(它們也會在正常合併中發生)。
  6. 經過重新設計的分支現在應該完成所有提交後的最後一次提交。爲了把這個轉移到主,請檢查出主(git checkout master)併合並新分支git merge dev。這會將更改拖放到主服務器上,而無需添加合併提交。
  7. 一旦確定更新的master分支看起來沒問題,您也必須更新任何遠程存儲庫上的分支。由於您正在撤消之前的歷史記錄,因此當您推送分支時,您必須使用--force(或-f)標誌作爲遠程回購,以接受更改,即:git push origin master --force

這就是它的全部。在完成此操作之後,從主服務器分支的dev上的提交現在應該在上面的預合併提交的上游。

注意:運行rebase將永久更新已更改分支的提交歷史記錄。爲了安全起見,我建議採取以下兩種方法中的一種:

  1. Per @ Dacav的建議,在更新任何內容之前跟蹤每個分支的提交哈希。如果事情變成梨形,那麼運行git reset --hard <original_commit_hash>將分支放回原始提交。
  2. 使兩個分支的備份副本你衍合那些在原來指向提交前:

    git的結帳-b master_bk git的結帳-b dev_bk

+0

其實你不需要備份副本。 Rebase會更新提交歷史,但舊的分支將保留在歷史記錄中。你只需要寫下原始分支的SHA標識符,如果出現問題,你可以用'git reset --hard'將分支重置到原來的位置。 – Dacav

+0

好點!我會更新答案,以反映這個選項以及 – DIMMSum

+0

@Dacav假設他們沒有得到垃圾收集。通常不是問題,但值得采取防範措施。 – hvd