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

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

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

【问题讨论】:

    标签: git rollback


    【解决方案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'”错误。 最后,我做了一些改变,它奏效了。

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

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

        【讨论】:

          【解决方案7】:

          你可以这样做:

          git reset --hard 8b2574f
          

          在哪里找到 8b2574f

          git reflog
          

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

              有两个命令:

              1. git reset --hard@{1}

              2. git reset --hard^1

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

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

              希望对你有帮助。

              【讨论】:

              • 这些命令对我不起作用,但是当我像 git reset --hard HEAD@{1} 这样添加 HEAD 时起作用。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-07-28
              • 2016-06-04
              • 2017-04-24
              • 2011-06-06
              • 2013-01-01
              • 2010-10-09
              • 1970-01-01
              相关资源
              最近更新 更多