Git回滚1拉

Posted

技术标签:

【中文标题】Git回滚1拉【英文标题】:Git rollback 1 pull 【发布时间】:2012-04-29 02:43:35 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

很有意思,那我怎么恢复正常运行呢?我的意思是,如果对错误代码进行一些更正,我可以去服务器并再次执行 git pull 以获取最新更改吗? 是的,它将处于您从未拉过的状态,因此您通常会做的任何事情都可以完成。【参考方案2】:

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

git reset --keep HEAD@1

【讨论】:

【参考方案3】:

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

【讨论】:

实际上是git reset --hard HEAD^,除非你不想碰你的工作目录。 根据问题,repo 只需要在新的 pull 导致问题后回滚,因此工作目录应该是空的。 这是正确的命令——它将获取最后一次提交,即它将取消暂存您上次提交的所有文件。但该项目仍将在新代码上运行。在此之后我运行“git reset --hard”以摆脱所有拉取的更改,我的项目恢复正常。谢谢你,乔希。【参考方案4】:

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

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

但无论如何...您唯一的目的是删除最后一次提交,您可以使用 Josh 指出的 git reset

【讨论】:

好点,这不是我想的,但可以很好地工作。我会尝试用最简单的方法。【参考方案5】:

我使用下面的命令来恢复上次提交

git merge --abort

【讨论】:

【参考方案6】:

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

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

    使用git reflog 查看 Karl 提到的列表。 从列表中选择要移回的提交版本。 执行git reset --hard <commit version>

【讨论】:

【参考方案7】:

你可以这样做:

git reset --hard 8b2574f

在哪里找到 8b2574f

git reflog

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

有两个命令:

    git reset --hard@1

    git reset --hard^1

First : 回滚到上次拉取之前的状态。

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

希望对你有帮助。

【讨论】:

这些命令对我不起作用,但是当我像 git reset --hard HEAD@1 这样添加 HEAD 时起作用。

以上是关于Git回滚1拉的主要内容,如果未能解决你的问题,请参考以下文章

GitGit 基础命令 ( 查看提交记录 git log | 版本回滚 git reset | 撤销回滚 git reflog )

git如何回滚最后一次提交

Android studio git 已提交的远程代码回滚

Git回滚代码暴力法

git远程库代码版本回滚方法

phpstorm git怎么回滚