如何回滚1次提交?


127

我有2个我没有推送的提交:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

如何退回第一个(最旧的),但保留第二个?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

从这里:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

我是否需要做:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

那是?


3
这个问题似乎与主题无关,因为它与编程工具有关。它属于堆栈溢出。
彼得·莫滕森

@PeterMortensen同意。这是超级用户的范围
Kolob Canyon

Answers:


95

最安全且可能最干净的方法是交互式地重新设置基准。

git rebase -i HEAD^^

要么,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

从那里可以压缩提交,这会将一个或多个提交放到上一个提交中。要从历史记录中完全删除提交,请从列表中删除该行。

您可以使用还原提交,git revert但是它将向历史记录中添加更多提交消息,这可能是不可取的。使用该-n参数告诉Git不要立即提交还原。您可以交互地重新设置基础,并在上一次提交前将其压扁,以保持环境清洁。

如果您在此处使用的两个提交影响相同的文件,则可能会看到合并冲突。

重置存储库git reset --hard时应格外小心,因为无法撤消。

重写历史记录时应格外小心。


如何在“ git rebase”期间删除提交?只有3个命令:pick,edit,squash。没有删除AFAIK。
n179911,2009年

8
从列表中完全删除该行,并删除该提交
jtimberman

当我想还原更改时,我不想留下任何痕迹。如果您也不想留下任何还原的痕迹,这是最好的方法。
菲利普·惠兰

“最安全且可能最干净的方法是交互式地重新设置基准”,如果您不使用vim,则可能不会。我很幸运,找到了摆脱困境的出路。仍在投票,因为我应该学习vim :-)
isimmons

我建议rebase尽量减少使用。如果你与他人合作,那就做吧revert
boldnik 2013年

52

这是否来自http://nakkaya.com/2009/09/24/git-delete-last-commit/ ,并且对我有用

Git删除最后一次提交

每天深夜,当我用完咖啡时,我会犯一些本不该拥有的东西。然后,在接下来的10到15分钟内,我将搜索如何删除我所做的最后一次提交。因此,第三次之后,我想对其进行记录,以便以后参考。

如果您犯了垃圾但没有被推,

git reset --hard HEAD~1

HEAD〜1是head之前提交的简写。或者,您可以引用要重置为的哈希的SHA-1。请注意,使用--hard时,由于丢失了head之前的提交,因此对工作树中的跟踪文件进行的任何更改。

如果您不想消磨已完成的工作,则可以使用 --soft选项,该选项将删除提交,但是它将保留所有更改的文件“要提交的更改”,就像git status一样。

现在,如果您已经推送并且有人拉了(通常是我的情况),则不能使用git reset。不过,您可以执行git revert,

git revert HEAD

这将创建一个新的提交,以撤消意外提交所引入的所有内容。


2
使用--soft选项,非常适合重命名文件并意外地“ git commit -a”而不是首先使用“ git add”的情况。
亚伦·哈伦

8

不。git-reset --hard将带您重温历史。您正在寻找的是git revert,它将撤消任何提交。


4
好吧,这行得通,但同时也会污染您的提交日志。如果尚未提交/拉出这些提交,最好使用交互式变基来清理它们。与其他版本控制系统相比,更改历史记录的能力是git的主要优势之一。
knweiss

6

我只是这样做:

git rebase -i HEAD^^

我搞砸了所以我做了

git rebase --abort

然后又做了一次。然后我必须像这样推动:

git push origin master -f

而且它破坏的提交比我回滚的提交要新。很棒。


4

不,git reset --hard baf8d5e将删除3368e1c提交,baf8d5e之后将在HEAD 。

如果要保留3368e1c提交并删除bad8d5e提交,最简单的解决方案是执行“ git rebase -i HEAD~2”(即,最后两次提交的交互式变基)。该命令将启动您的提交消息编辑器,并且您将在最后两个提交中看到一行。在那里,您只需删除bad8d5e提交行并保存。git然后将重写您的历史记录,第二次提交将消失。

您还可以在提交消息编辑器中使用其他有用的命令squash,例如edit,等。交互式rebase功能非常强大!

如果有人已经看到了这些提交(从存储库中推送或拉出),请不要执行此操作!



1
git reset --hard {ref}

如果仓库中只有一个其他提交(例如初始提交和另外1个),则撤消提交是唯一的方法。其余的方式(还原,变基)至少在git 1.7.5.1之前无效。

如果您在后面git reset加上,git gc那么git实际上会从存储库中完全删除旧的提交数据。


1
git checkout <treeish> -- /path/to/dir

这将从/ path / to / dir的给定“目录”中恢复目录


0

我可以通过手动编辑存储库文件夹内HEAD文件中最后一次提交的哈希码来工作:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

在此之前,我从未能够推动我在本地进行的UNMERGE行动。它一直说它“没有推送一些参考”到中央存储库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.