协慌网

登录 贡献 社区

如何撤消 Git 中最近的提交?

我不小心将错误的文件提交 Git 了,但我还没有将提交推送到服务器。

如何从本地库中撤消这些提交?

答案

撤消提交和重做

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. 这是您要撤消的内容
  2. 这会使您的工作树(磁盘上的文件状态)保持不变但撤消提交并保留您未提交的更改(因此它们将显示为 “ git status ” 未提交的更改 “,并且您需要在提交之前再次添加它们)。如果你只是想更多的变化添加到先前的承诺,或修改提交信息1,你可以使用git reset --soft HEAD~代替,这就好比是git reset HEAD~其中HEAD~相同HEAD~1 )但是现有的更改会暂停。
  3. 对工作树文件进行更正。
  4. git add您想要包含在新提交中的任何内容。
  5. 提交更改,重用旧的提交消息。 reset将旧头复制到.git/ORIG_HEAD ; 使用-c ORIG_HEAD commit将打开一个编辑器,该编辑器最初包含来自旧提交的日志消息,并允许您对其进行编辑。如果您不需要编辑消息,则可以使用-C选项。

但请注意,如果您已向索引添加任何新更改,则使用commit --amend会将它们添加到您之前的提交中。

如果代码已经推送到您的服务器并且您有权覆盖历史记录(rebase),那么:

git push origin master --force

你也可以看看这个答案:

如何将 HEAD 移回以前的位置? (独立头)

上面的答案将向您展示git reflog ,它用于找出您希望恢复的 SHA-1。一旦找到要撤消的点,就可以使用上面解释的命令序列。


1但是,请注意,如果您在提交消息中犯了错误,则无需重置为先前的提交。更简单的选择是git reset (为了更新你之后所做的任何更改),然后是git commit --amend ,这将打开预先填充了最后一次提交消息的默认提交消息编辑器。

1
liyaoheng
贡献值 20
贡献次数 1

如果你不知道如何工作,撤销提交有点可怕。但是如果你理解的话,这实际上非常容易。

假设你有这个,其中 C 是你的 HEAD,(F)是你文件的状态。

(F)
A-B-C
    ↑
  master

你想要提交 C 并且永远不会再看到它 。你做这个:

git reset --hard HEAD~1

结果是:

(F)
A-B
  ↑
master

现在 B 是 HEAD。因为您使用了--hard ,所以您的文件将重置为它们在提交 B 时的状态。

啊,但是假设提交 C 不是灾难,但只是有点偏。您希望撤消提交,但在进行更好的提交之前,请保留更改以进行一些编辑。从这里开始,用 C 作为你的 HEAD:

(F)
A-B-C
    ↑
  master

你可以做到这一点,离开--hard

git reset HEAD~1

在这种情况下,结果是:

(F)
A-B-C
  ↑
master

在这两种情况下,HEAD 只是指向最新提交的指针。当你执行git reset HEAD~1 ,你告诉 Git 将 HEAD 指针移回一次提交。但是(除非你使用--hard )你保留文件原样。所以现在git status显示你已经检查过 C 的变化。你没有丢失任何东西!

对于最轻微的触摸,您甚至可以撤消提交但保留文件和索引

git reset --soft HEAD~1

这不仅会使您的文件单独存在,甚至会使您的索引单独存在。当你执行git status ,你会看到索引中的文件和以前一样。实际上,在这个命令之后,你可以执行git commit然后你将重做你刚刚提交的同一个提交。

还有一件事: 假设你在第一个例子中销毁了一个提交但后来发现你需要它呢?运气好,对吗?

不, 还是有办法把它找回来。输入git reflog ,你会看到你已经移动的(部分)提交 sha 的列表。找到你销毁的提交,并执行以下操作:

git checkout -b someNewBranchName shaYouDestroyed

你现在已经复活了这个提交。提交实际上并没有在 Git 中被摧毁大约 90 天,所以你通常可以回去拯救一个你并不想要摆脱的东西。

我花了一段时间才弄明白,所以也许这会帮助别人......

根据您是否已将提交公开(推送到远程存储库),有两种方法可以 “撤消” 上次提交:

如何撤消本地提交

假设我在本地提交,但现在想删除该提交。

git log
    commit 101: bad commit    # latest commit, this would be called 'HEAD'
    commit 100: good commit   # second to last commit, this is the one we want

要将所有内容恢复到上次提交之前的状态,我们需要在HEAD之前reset为提交:

git reset --soft HEAD^     # use --soft if you want to keep your changes
git reset --hard HEAD^     # use --hard if you don't care about keeping the changes you made

现在git log将显示我们的上一次提交已被删除。

如何撤消公共提交

如果您已将提交公开,则需要创建一个新的提交,它将 “还原” 您在先前提交(当前 HEAD)中所做的更改。

git revert HEAD

您的更改现在将被还原并准备好您提交:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

有关更多信息,请查看Git Basics - Undoing Things