我在庫中有一些提交:混帳:刪除早提交,但保持最近的變化
,如:
A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D
其中E是最近提交我做了。現在我想擺脫我使用功能C所做的更改,但我希望保留使用D和E添加的更改。
我希望你能幫助我。
謝謝
我在庫中有一些提交:混帳:刪除早提交,但保持最近的變化
,如:
A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D
其中E是最近提交我做了。現在我想擺脫我使用功能C所做的更改,但我希望保留使用D和E添加的更改。
我希望你能幫助我。
謝謝
如果您只想「擺脫變化」(如問題主體中指定的那樣)而不是實際「刪除提交」(如標題中指定的那樣),那麼一個簡單的選項是添加一個新的承諾,完全與早先的承諾完全相反。
這不是萬無一失的,它可能會導致因自作的修改衝突,但它不會改變歷史,讓你記錄下逆轉及其原因,並與其他工作副本打得很好。
git revert
是用來做一組提交的這種邪惡雙胞胎的工具。
這就是所謂的墊底:你想要的-i
開關。
讀:https://www.atlassian.com/git/tutorial/rewriting-git-history#!rebase-i
一個類似的問題/答案,請參閱:https://stackoverflow.com/a/2938393/2536029
這樣做,請按照下列步驟操作:
git rebase -i HEAD~3
然後將提交C到成爲第一個在底部,您將有
D - Added Feature D
E - Added Feature D
C - Redesigned Feature C
you sav e和退出,然後
git reset HEAD^
這將撤消承諾C.
Interactive rebase是你的朋友!
正如其他人所說:
$ git rebase -i HEAD~5
...其中-i
是交互式標誌,並HEAD~5
手段包括在互動變基過去5個提交。
當你編輯了作爲發行上述的結果,看看在打開文件的註釋:
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
爲你的鍵位是如果刪除線在這裏,COMMIT會迷路。
因此,刪除引用您想要刪除的提交的行,保存並關閉,然後git將處理剩下的部分(您可能必須根據提交的性質修復一些衝突,並將其還原正試圖刪除)。
需要注意的是,如果您已經推送了您的代碼並且其他人已經將其拉出,上述內容將無法正常工作,因爲下次有人將您的分支簽出時,提交將返回到此處。交互式資料庫會將提交刪除,但沒有記錄,所以其他克隆不知道它們已被刪除。下一次他們推動,他們會嘗試並重新設置它們,因爲本地克隆「看到」原點沒有您刪除的對象(提交)。
這裏更好解釋一下。這應該被接受的答案。 –
@CyrilCHAPON - 儘管我同意這是一個很好的答案(對問題標題),但IMO並不一定是正確答案(在正文中)。 IMO @ aib的答案是首選,因爲rebasing具有破壞性(重寫歷史記錄 - 正如本答案中所述,但沒有突出顯示IMO)。有時候,這是唯一的答案,但是國際海事組織的重組只能作爲最後的手段在主分支上使用。 –
如果您只在本地進行更改,您可能最好關注重新貼標籤答案。如果你已經在任何地方發佈了更改,那麼你不想重新綁定,因爲這會改變歷史,這意味着其他人也必須重新綁定,否則你會再次合併你的違規提交。
如果其他人有你的提交,做乾淨的事情是恢復有問題的改變,而不是乾脆切除它。使用git revert COMMIT_ID
創建一個新的提交,撤銷在COMMIT_ID
中應用的更改。
git reabse -i HEAD~3
你將有你的3名單最後提交信息
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D
您只需插入X git的復位HEAD ^之前要撤消,要撤消提交C,提交所以將會是這樣的
C - Redesigned Feature C
x git reset HEAD^
D - Added Feature D
E - Added Feature D
退出rebase控制檯,你會看到你的提交沒有更多的日誌和他們的文件上演。
的可能重複的[GIT中:刪除選擇提交對儲存日誌條目(http://stackoverflow.com/questions/495345/git-removing-selected-commit-log-entries-for- a-repository) – jszakmeister
@jszakmeister:不完全一樣,鏈接的文章想壓縮提交,而OP想要在這裏刪除它們 – CharlesB
@CharlesB不完全正確。壓縮B和C是一種選擇,在OP的問題中刪除提交也是一種選擇。答案中包含兩個方向。 – jszakmeister