59

我有一个 Web 服务器,它服务于一个 git 存储库的项目。当我对代码进行一些更改时,我会从服务器执行 git pull。有时新代码会崩溃,我希望能够回滚到最新的拉动,即之前的拉动。我想用一个脚本来做到这一点,而不必搜索最新的 sha。我怎样才能做到这一点?

编辑:澄清一下,我只想做一个动作,比如按下一个按钮,上面写着“哎呀!我刚刚做的最新拉动是一个错误,我希望我没有这样做”。在这种情况下,我不想寻找 sha 或标签或其他任何东西,它更像是一个“撤消”功能。然后我希望能够继续处理代码,并且服务器上的下一个 pull 需要带来最新的更改。

4

9 回答 9

154

git reset --hard HEAD^1将从您提取的内容中收回一次提交。如果您希望它恢复到拉动之前的状态,请使用git reset --hard HEAD@{1}. 在您的本地仓库中更改它的最后一次操作之前磁头所在的@{1}轨道,因此如果在您拉动之前推送了几个提交,它将返回多个提交。另请参阅git reflog以显示整个列表。

于 2012-04-17T19:31:06.100 回答
14

还有另一种方法可以丢弃最后一次拉动

git reset --keep HEAD@{1}
于 2018-10-25T04:53:12.913 回答
5

git reset HEAD^应该带你到上一个提交。请参阅此处了解更多信息。

于 2012-04-17T18:15:45.670 回答
5

在这种情况下,使用分支是有意义的,它可以在失败或成功时轻松删除或合并。这将帮助您跟踪新内容,并且如果您遇到比“仅删除最后一次提交”更复杂的情况(尤其是因为您想使用脚本执行此操作),则可以使事情变得更清晰。所以在你的服务器上:

git fetch --all           # fetch new commits from remote
git checkout -b testing   # create and switch to branch 'testing'
git merge origin/master   # merge new commits from remote branch master
                          # (in branch 'testing')

...然后测试东西...如果成功:

git checkout master       # switch back to master
git merge testing

失败时:

git checkout master
git branch -D testing     # remove testing branch

但无论如何......你唯一的一点是删除最后一次提交,你可以使用git resetJosh 指出的。

于 2012-04-17T19:19:32.660 回答
5

我用下面的命令来恢复最后一次提交

git merge --abort
于 2020-04-01T08:18:43.150 回答
4

@Karl Bielefeldt 接受的答案并不完全适合我。我正在使用 GIT 版本 2.10.0.windows.1 可能这适用于旧版本。我收到“未知开关'e'”错误。最后,我做了一些改变,它奏效了。

以下是在上一次拉取之前恢复到状态的步骤:

  1. 用于git reflog查看 Karl 提到的列表。
  2. 从列表中选择要移回的提交版本。
  3. 执行git reset --hard <commit version>
于 2016-12-13T13:19:02.040 回答
3

你可以简单地这样做:

git reset --hard 8b2574f

通过做找到8b2574f

git reflog

8b2574f代表任何 HEAD,而且我的与你的不同。当你运行上面的命令时,你会得到你的。

于 2020-12-06T10:36:40.657 回答
0

另一种方法是使用标签。想法是你可以在拉取之前用一些版本号标记你的 HEAD,做拉取,然后如果你需要回滚 HEAD 你可以这样做git reset {tag name}如果拉取有多个提交,你可以跳回你之前的位置到合并。

于 2012-04-17T18:19:23.720 回答
-1

有两个命令:

  1. git reset --hard@{1}

  2. git reset --hard^1

First :回滚到最后一次拉取之前的状态。

第二:回滚到上次提交之前的状态(包括合并代码)。

希望能帮助到你。

于 2020-03-20T18:23:25.017 回答