2012-10-03 225 views
14

你可以通過git命令撤銷過去的提交,它已經被合併到你的git倉庫中嗎?或者是否必須手動撤消在該提交中所做的所有更改?撤消git commit

+1

曾經作過'git的一看犯--amend'到modifiy上次提交或'混帳revert'在這裏你可以設置你要回滾提交的ID。妍可以找到提交的帶有'混帳log' ID [Git的修改(http://git-scm.com/book/en/Git-Basics-Undoing-Things) [Git的還原(HTTP:// gitready。 com/intermediate/2009/03/16/rolling-back-changes-with-revert.html) – dasheddot

回答

19

你可以隨時恢復的變化從一個單一的承諾做:

git revert <commit-id> 

注意,這將創建一個新的提交,撤銷只是這些變化

例如git log --oneline

d806fc9 two 
18cdfa2 bye 
62c332e hello 
c7811ee initial 

說我要恢復變化承諾18cdfa2

git revert 18cdfa2 

我們現在有:git log -1 -p

commit fb9d6627a71636503fc9a1eb4f725937c783ecee 
Author: Seth <[email protected](none)> 
Date: Wed Oct 3 10:32:46 2012 +0200 

    Revert "bye" 

    This reverts commit 18cdfa27c964b66b624be1030250757b745d6866. 

diff --git a/a b/a 
index 0907563..3b18e51 100644 
--- a/a 
+++ b/a 
@@ -1 +1 @@ 
-bye world 
+hello world 
10

你總是可以做git revert <commit-hash>撤消git的承諾。但是,這在大多數情況下是沒有用的,因爲它創建了一個新的提交,添加到你的git reflog。

當我必須退後一步是我的分支恢復到較早的階段我最常做的。爲此,請執行git reflog並查找要移至的HEAD位置。

[email protected]:~/myrepo$ git reflog -3 
8d386b8 [email protected]{0}: commit: I did something I don't want 
2a59955 [email protected]{1}: commit: Feedback from PR #792 
1023102 [email protected]{2}: checkout: moving from one branch to another 

現在,說我想要移動到提交哈希2a59955,並撤消在8d386b8所有更改。我會這樣做:

Update: git reset --soft [email protected]{1} 

這將重置我的分支到初始狀態。這樣做不僅會取消所有更改,還會停止跟蹤可能在此提交中添加的所有文件。無論如何,這是撤銷單個提交中所有更改的最有效方法。

這將撤消所有更改。有一個硬復位意味着時光倒流(至少從git的角度來看)。使用--hard代替--soft這個

+1

我認爲它有助於部分*因爲它創建了一個新的提交。如果你想撤消你的撤消呢?如果你後來想知道你已經完成恢復,該怎麼辦? 另外,還應該提到+提交,因爲重置不會像這樣改變提交歷史。 – eis

+0

是的,它不,我同意重要的是有一個還原提交的歷史。當您想要退回並從最後一個狀態重新開始時,重置會有所幫助。此外,重置仍保留在日誌中,並不像您完全抹掉提交。 – rizwaniqbal

+3

SOFT!你使用SOFT!你用這個命令丟失你的改變。我正在尋找如何撤消一個提交太多(該死的,intellij)的提交,所以這是對下一個人的警告。 – cmp