簡體   English   中英

我需要在我的主分支中彈出並刪除“中間”提交。我該怎么做?

[英]I need to pop up and trash away a “middle” commit in my master branch. How can I do it?

例如,在下面的主分支中,我需要刪除提交af5c7bf16e6f04321f966b4231371b21475bc4da,這是由於之前的rebase導致的第二個:

commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Tue Apr 12 23:50:15 2011 +0200

    add generic config/initializers/omniauth.example.rb

commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Fri Apr 22 00:15:50 2011 +0200

    show github user info if logged

commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Fri Apr 22 17:20:48 2011 +0200

    add multiple .container at blueprint layout

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Thu Apr 21 19:55:57 2011 +0200

    add %h1 Fantastic Logo + .right for 'Sign in with Github'

我需要保持健康

  • 第一次提交60b413512e616997c8b929012cf9ca56bf5c9113,
  • 第三次提交e6523efada4d75084e81971c4dc2aec621d45530
  • 最后一次提交414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

“扔掉”只是第二次提交af5c7bf16e6f04321f966b4231371b21475bc4da

我怎樣才能做到這一點? 在此先感謝Luca

Rebaserevert是選項。 Rebase實際上會從歷史記錄中刪除提交,因此看起來第二次提交從未存在過。 如果您將主分支推送到任何其他存儲庫,這將是一個問題。 如果在這種情況下嘗試推送一個rebase,git會給你一個拒絕非快進合並錯誤。

當分支與其他repos共享時,Revert是正確的解決方案。 git revert af5c7bf16將進行一個新的提交,簡單地反轉af5c7bf16引入的更改。 這種方式歷史不會被重寫,你保持清楚的錯誤記錄,其他的回購將接受推動。

這是一個很好的擦除方法: git rebase -i <commit>^這會將您帶到要刪除的提交之前的提交。 交互式編輯器將顯示返回該點的所有提交的列表。 您可以選擇,壓縮等。在這種情況下, 刪除要刪除的提交行並保存文件。 Rebase將完成其工作。

如果rebase是一個選項,你可以改變並刪除它:

$ git rebase -i 414ceffc^

如果不能選擇rebase,你可以恢復它:

$ git revert af5c7bf16

盡管這里收到了原始答案的所有功勞,但我並沒有發現它們能夠令人滿意地回答這個問題。 如果您發現自己處於需要從歷史中間刪除提交或提交集合的情況,我建議這樣做:

  • 在包含所有提交的分支的頭部創建一個新分支並切換到它。
  • 將新分支恢復到您想要從中開始新基礎的點。
  • 然后,(這里是關鍵點) 櫻桃選擇你之后實際想要從原始分支到新分支的后續提交,並跳過你不再需要的提交(即你要刪除的提交)。
  • 如果需要,將原始分支重命名為指示其舊代碼的內容,然后將新分支重命名為原始分支的名稱。
  • 最后,將您的更改推送到遠程倉庫(如果使用的話)。 您可能需要使用“強制推送”。 如果您的協作者在修改版本時遇到問題,那么他們可能最容易從遠程源再次克隆回購。 無論如何,如果您正在從歷史中間刪除提交,您可能會想要與他們交談!

這里有關於Cherry Picking的信息: 使用git意味着采摘櫻桃是什么意思?

這里有一些用Tortoise Git做的(正如我剛才所做的那樣)。 在這些操作中使用gui實用程序肯定更容易! Cherry挑選使用TortoiseGit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM