Git重置为上一次提交

时间:2012-03-19 02:32:36

标签: git

我做了三次提交,我试图清理一些代码。无论如何,我设法彻底摧毁了我正在做的事情。我想删除过去的三个提交并返回到特定的提交SHA1。

如何恢复到之前的提交并删除这3次提交的历史记录? (历史删除部分不是什么大问题)。这些提交已经被推送,所以我有点迷失。

谢谢!

5 个答案:

答案 0 :(得分:33)

由于你的提交被远程推送,你需要删除它们。我假设你的分支是master,它被推到了origin

您首先需要从master

中删除origin

git push origin :master(请注意冒号)

然后你需要让master达到你想要的状态,我假设提交哈希为ABCDE

git reset --hard ABCDE

最后,再次推送master

git push origin master

就是这样!请注意,如果某人已经从origin下载了您的更改,则会使他们变得非常困难,导致他们的本地存储不稳定。

答案 1 :(得分:17)

git中的一般想法是你永远不会删除提交。你只是留下他们没有名字。提交既未命名也未被其他命名提交引用,最终会自行消失。

例如,假设你开始于:

$ git checkout my_work_branch
<do some editing>
$ git commit -m "attempt #1, so far so good"
<do more editing>
$ git commit -m "attempt #2, getting a little hazier"
<do more editing>
$ git commit -m "attempt #3, looking bleak now"

此时git log --graph --decorate --pretty=oneline --abbrev-commit可能会产生类似的内容:

* d97de0e (HEAD, my_work_branch) attempt #3, looking bleak now
* 9a3efe3 attempt #2, getting a little hazier
* 9e80936 attempt #1, so far so good
* a1d6424 here's where you started

你现在拥有的是名为my_work_branch的分支(你之前给出的名字)“指向”提交d97de0e,后者又指向9a3efe3,指向9e80936,指向a1d6424。 (这也是HEAD指出的特殊名称。)

您可以将HEAD移动到任何旧的git checkout。但是,事情就是这样:你也可以 将名称my_work_branch移到指向a1d6424:

$ git reset --hard a1d6424

$ git reset --hard HEAD~3  # use at most one of these

如果这样做,您会发现名称my_work_branch也已被移动:

$ git rev-parse my_work_branch
a1d6424e5afcda475910084720c9aa26e3528618

您添加的提交仍然存在:

$ git log d97de0e

会向你展示它们:

$ git log --graph --decorate --pretty=oneline --abbrev-commit d79de0e
* d97de0e attempt #3, looking bleak now
* 9a3efe3 attempt #2, getting a little hazier
* 9e80936 attempt #1, so far so good
* a1d6424 (HEAD, my_work_branch) here's where you started

只是他们不再有任何名字,如果你做了一些工作,git addgit commit,那将是一个名为my_work_branch的新分支。旧的,有三个额外的提交,现在是一个“垃圾”分支。 (如果你决定尽管你想要它们的凄凉,你只需要在它们大约3个月到期之前给它们一个名字。你必须在上面的例子中找到或记住那个数字,d97de0e,不知何故。)


更新:啊,你已经推了它们,你希望它们从远程存储库中消失。

您不必删除远程分支。您可以在完成上述回放(git push -f)后使用git reset --hard。请记住,任何已经取得推动变化的人都会拥有它们,并且会继续拥有它们并且很容易因为它们的存在而感到困惑。你必须提醒任何这样的人要小心你的“被撤销”提交。

答案 2 :(得分:3)

好的,这是两个解决方案。

对于任一解决方案,git log并找到您要返回的提交的哈希值。

1)通过自动创建补丁以撤消更改来还原更改。

什么?自动创建反向补丁以撤消您的更改。提交并推送补丁。您最初的更改仍在git日志中,但是使用此反向修补程序“撤消”了它们。

如何? git revert [hash] && git push

为什么?因为您是一个与其他优秀开发人员一起工作的优秀开发人员,并且不想破坏他们的本地存储库。

为什么不呢?,因为以后很难“合并”您的更改。还原补丁比您的更改“新”,因此比“ git merge”更难重新应用更改。

2)强制推送到上一个提交

什么?分支是指向提交的指针。将该指针硬重置为先前的提交,然后强制将该指针推入服务器。您所做的更改(以及其他所有更改)都将从git历史记录中删除。

如何? git reset --hard [hash] && git push -f

为什么?因为您是一个狂野的牛仔/女牛仔,而您所做的更改位于一个功能分支中,所以您希望继续努力以便以后轻松合并。

为什么不您的重置和推送操作会破坏已经取消更改的队友的任何本地存储库(例如,丢失其提交,必须重新提交工作)。如果您没有推(或他们没有拉),那就没问题了。

答案 3 :(得分:2)

使用git revert

- 您可以恢复为一,二或提交范围

- 它也会删除提交历史记录

1)git revert 175a25

2)git status / git log(确认你已经恢复)

3)git push

答案 4 :(得分:0)

例如,如果要摆脱最后两次提交,可以执行以下操作:

git log -3
commit 7e83c9fa5dc1a1914847bfccfe9d2da14f845070
Author: Jaime Montoya <webmaster@jaimemontoya.com>
Date:   Fri Sep 28 05:58:58 2018 -0600

    Add new background image to the header of the website.

commit b84b0c38df2f876d1c1f5657e6e452b5689c2d80
Author: Shannon Hall <s.hall@example.net>
Date:   Thu Sep 27 21:35:48 2018 -0400

    Include code for Google Maps.

commit 40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7
Author: Jaime Montoya <webmaster@jaimemontoya.com>
Date:   Thu Sep 27 18:57:45 2018 -0600

    Update links to copyright messages.

在这种情况下,我们试图摆脱这两个提交:7e83c9fa5dc1a1914847bfccfe9d2da13f845070b84b0c38df2f876d1c1f5657e6e255b5689c2d80。我们希望将此作为最近的提交:40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7。我们需要这样做:

git reset --hard 40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7

这是一种从本地存储库撤消提交的方法。

在完成上述操作之后,您可以使用git push <remote> <branch>推送到远程存储库。