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 )