我有一个Web服务器,它服务于一个git存储库项目。当我对代码进行一些更改时,然后从服务器执行git pull。有时新代码崩溃,我希望能够回滚到最新的拉动,就在之前。我想用脚本做到这一点,而不必搜索最新的sha。我怎么能这样做?
编辑:只是为了澄清,我只想做一个动作,比如按下一个按钮,上面写着“哎呀!我刚刚做的最新拉动是一个错误,我希望我没有这样做”。我不想在这种情况下寻找sha或标签或其他任何东西,它更像是一个'撤消'功能。 然后我希望能够继续处理代码,服务器上的下一步需要带来最新的更改。
答案 0 :(得分:77)
git reset --hard HEAD^1
将从您提取的内容中退回一个提交。如果您希望它恢复到拉动之前的状态,请使用git reset --hard HEAD@{1}
。 @{1}
跟踪头部在最后一次操作之前所处的位置,这些操作在您的本地仓库中进行了更改,因此如果在您完成拉动之前推动了多次提交,它将返回多次提交。另请参阅git reflog
以显示整个列表。
答案 1 :(得分:4)
我已使用以下命令还原上一次提交
git merge --abort
答案 2 :(得分:3)
git reset HEAD^
应该带您进行上一次提交。有关详细信息,请参阅here。
答案 3 :(得分:3)
在这种情况下,使用分支是有意义的,可以在失败或成功时轻松删除或合并。这将帮助您跟踪新内容,并且如果您有比“仅删除上次提交”更复杂的情况,那么可以使事情更清晰(特别是因为您希望使用脚本执行此操作)。所以在你的服务器上:
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
。
答案 4 :(得分:2)
还有另一种丢弃最后一次拉动的方法
git reset --keep HEAD@{1}
答案 5 :(得分:1)
@ Karl Bielefeldt接受的答案并不适合我。我正在使用GIT版本2.10.0.windows.1 可能适用于旧版本。我收到“未知开关'e'”错误。 最后,我做了一些改动,但它确实奏效了。
以下是在之前拉动之前恢复到状态的步骤:
git reflog
查看卡尔提到的列表。git reset --hard <commit version>
答案 6 :(得分:0)
另一种方法是使用标签。您可以考虑在拉动之前使用某个版本号标记您的HEAD,然后执行拉动,然后如果您需要向后滚动HEAD,则可以执行git reset {tag name}
这样如果拉有多个提交,您可以跳过到合并之前的位置。
答案 7 :(得分:0)
有两个命令:
git reset --hard @ {1}
git reset --hard ^ 1
第一个:回退到上一次拉动之前的状态。
second:回滚到上一次提交之前的状态(包括合并的代码)。
希望有帮助。
答案 8 :(得分:0)
您可以这样做:
git reset --hard 8b2574f
在其中找到8b2574f的地方
git reflog
8b2574f 代表任何HEAD,并且我的与您的不同。运行上面的命令,您会得到自己的。