2013-07-16 70 views
11

我在庫中有一些提交:混帳:刪除早提交,但保持最近的變化

,如:

A - Added Feature A 
B - Removed Feature B 
C - Redesigned Feature C 
D - Added Feature D 
E - Added Feature D 

其中E是最近提交我做了。現在我想擺脫我使用功能C所做的更改,但我希望保留使用D和E添加的更改。

我希望你能幫助我。

謝謝

+2

的可能重複的[GIT中:刪除選擇提交對儲存日誌條目(http://stackoverflow.com/questions/495345/git-removing-selected-commit-log-entries-for- a-repository) – jszakmeister

+1

@jszakmeister:不完全一樣,鏈接的文章想壓縮提交,而OP想要在這裏刪除它們 – CharlesB

+1

@CharlesB不完全正確。壓縮B和C是一種選擇,在OP的問題中刪除提交也是一種選擇。答案中包含兩個方向。 – jszakmeister

回答

7

如果您只想「擺脫變化」(如問題主體中指定的那樣)而不是實際「刪除提交」(如標題中指定的那樣),那麼一個簡單的選項是添加一個新的承諾,完全與早先的承諾完全相反。

這不是萬無一失的,它可能會導致因自作的修改衝突,但它不會改變歷史,讓你記錄下逆轉及其原因,並與其他工作副本打得很好。

git revert是用來做一組提交的這種邪惡雙胞胎的工具。

0

這樣做,請按照下列步驟操作:

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.

20

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將處理剩下的部分(您可能必須根據提交的性質修復一些衝突,並將其還原正試圖刪除)。

需要注意的是,如果您已經推送了您的代碼並且其他人已經將其拉出,上述內容將無法正常工作,因爲下次有人將您的分支簽出時,提交將返回到此處。交互式資料庫會將提交刪除,但沒有記錄,所以其他克隆不知道它們已被刪除。下一次他們推動,他們會嘗試並重新設置它們,因爲本地克隆「看到」原點沒有您刪除的對象(提交)。

+1

這裏更好解釋一下。這應該被接受的答案。 –

+0

@CyrilCHAPON - 儘管我同意這是一個很好的答案(對問題標題),但IMO並不一定是正確答案(在正文中)。 IMO @ aib的答案是首選,因爲rebasing具有破壞性(重寫歷史記錄 - 正如本答案中所述,但沒有突出顯示IMO)。有時候,這是唯一的答案,但是國際海事組織的重組只能作爲最後的手段在主分支上使用。 –

1

如果您只在本地進行更改,您可能最好關注重新貼標籤答案。如果你已經在任何地方發佈了更改,那麼你不想重新綁定,因爲這會改變歷史,這意味着其他人也必須重新綁定,否則你會再次合併你的違規提交。

如果其他人有你的提交,做乾淨的事情是恢復有問題的改變,而不是乾脆切除它。使用git revert COMMIT_ID創建一個新的提交,撤銷在COMMIT_ID中應用的更改。

0
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控制檯,你會看到你的提交沒有更多的日誌和他們的文件上演。

0

如果您在Windows中使用TortoiseGit,你可以在Git的文件夾,單擊鼠標右鍵然後單擊TortoiseGit > Show log。您可以查看之前完成的所有提交,然後檢查您想要恢復的提交。

點擊提交,你可以在下面看到更改後的文件。點擊要恢復的文件右鍵,然後點擊revert to parent revision

How to revert commits