2012-10-03 183 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