【问题标题】:Git revert a public commit only in local repositoryGit 仅在本地存储库中恢复公共提交
【发布时间】:2018-04-16 10:19:29
【问题描述】:

假设有一个我认为导致错误的公共提交“xxxx”,我想在本地尝试恢复该提交。

如果我从git revert12)的文档中正确理解,它会计算出恢复目标提交 xxxx 所需的更改,并自动将它们推送到公共存储库时间>。那是对的吗?这是我担心的最后一部分。

git revert xxxx 会在公共存储库中恢复 xxxx 吗?

如果是这样,有没有办法只在我的本地工作文件夹中执行此操作,以便我可以在不影响其他开发人员的情况下构建 HEAD 的副本并恢复该提交并对其进行试验?

我是否需要使用--no-commit 选项:git revert xxxx --no-commit

或者我还有其他方法可以做到这一点吗?

谢谢。

【问题讨论】:

    标签: git version-control git-revert


    【解决方案1】:

    不,它不会自动将还原提交推送到公共仓库。

    git revert <commit> 只会在你的本地 repo 中创建一个新的提交,并且 git revert <commit> --no-commit 将工作目录更改为执行 git revert <commit> 之后的样子,但实际上不会创建一个新的提交,你可以使用 git revert --abort取消操作。

    我们可以用图表来说明:

    假设公共仓库和您的本地仓库首先在master 分支上同步:

    A---B---C---D   master, origin/master
    
    • 如果您想在本地仓库中恢复提交 B 的更改。执行git revert <commit id for B>后,提交历史为:

      A---B---C---D---B'   master
                  |
             origin/master
      

      如您所见,创建了一个新的提交B' 来恢复提交B 的更改,而origin/master 仍然指向提交D。除非你执行git push,否则公共 repo 将被更新。

    • 如果你执行git revert <commit id for B> --no-commit,它将改变git repo的工作目录,但masterorigin/master仍然指向提交D

      A---B---C---D   master, origin/master
      

      如果您希望工作目录干净,可以使用git revert --abort

    【讨论】:

      【解决方案2】:

      与您显然读到或听到的相反,git revert 确实将任何内容推送到远程存储库。它只是向您的分支的 HEAD 添加一个(或可能更多)新提交,该提交在功能上撤消提交或您传递参数的提交。如果你有一个提交 abcd1234 并且你跑了

      git revert abcd1234
      

      然后 Git 会向你的分支添加一个新的提交来撤消这个提交。

      一般来说,东西只会通过git push 从您的本地 Git 传送到远程,所以只要您不实际执行此操作,您就应该清楚。

      如果您感到非常谨慎,您可以随时创建一个新分支并使用git revert 对其进行错误修复测试。顺便说一句,作为安全预防措施,许多使用 GitHub 等 repos 的人会将关键分支配置为甚至无法直接推送到它们。

      【讨论】:

        猜你喜欢
        • 2011-09-03
        • 2017-05-28
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-03
        • 2011-08-11
        • 2018-11-10
        相关资源
        最近更新 更多