2012-04-17 66 views
23

我有一个web服务器,服务于一个git仓库的项目。当我对代码做一些修改时,我会从服务器上做一个git pull。有时候新代码崩溃了,我希望能够回滚到最新版本,就像之前那样。我想用脚本来做到这一点,而不必搜索最新的sha。我怎样才能做到这一点?Git回滚1拉

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

回答

52

git reset --hard HEAD^1将带你回到你拉的一个提交。如果您希望它恢复到拉动之前的状态,请使用git reset --hard [email protected]{1}@{1}跟踪头部在最后一次操作之前的位置,它在本地回购中更改它,所以如果在您拉动之前推动了几次提交,它将返回几次提交。另请参阅git reflog以显示整个列表。

+1

很有意思,然后我该如何恢复正常运作?我的意思是,如果对错误代码进行一些更正,我可以直接进入服务器并再次执行git以获取最新更改? – Bastian 2012-04-18 10:18:12

+3

是的,它会处于你从未拉过的状态,所以你通常会做的任何事情都可以完成。 – 2012-04-18 12:51:00

2

git reset HEAD^应该带你去上一次提交。有关更多信息,请参见here

+0

它实际上'git的复位 - 硬头^',除非你不想碰你的工作目录。 – 2012-04-17 19:17:40

+0

根据这个问题,在新的pull导致问题后,repo只需要回滚,所以工作目录应该是空的。 – 2012-04-17 20:39:14

0

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

2

在这种情况下,使用分支是有意义的,分支可以在失败或成功时轻松移除或合并。这将帮助你跟踪新的东西,并让事情更清洁,如果你有比“只删除最后一个提交”更复杂的情况(特别是因为你想用脚本来做到这一点)。所以,你的服务器上:

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

+0

这里的好处,这不是我在想什么,但可以很好地工作。我会尽量用最简单的方法。 – Bastian 2012-04-18 10:26:07

1

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

下面是以前的上拉前恢复状态的步骤:

  1. 使用git reflog看到名单卡尔提及。
  2. 从列表中选择您想要移回的提交版本。
  3. 执行git reset --hard <commit version>