Git只在本地存储库中恢复公共提交

时间:2017-11-03 16:02:01

标签: git version-control git-revert

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

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

即。将git revert xxxx恢复公共存储库中的xxxx?

如果是这样,有没有办法在我的本地工作文件夹中执行此操作,以便我可以构建一个HEAD副本,并使用该实现恢复并试验它,而不会影响其他开发人员?

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

或者我还有另一种方法吗?

感谢。

2 个答案:

答案 0 :(得分:4)

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

git revert abcd1234

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

一般来说,东西只能通过git push从你当地的Git转到遥控器,所以只要你没有真正做到这一点,你应该是明确的。

如果您感到非常谨慎,可以随时创建一个新分支,并使用git revert测试该错误。顺便提一下,许多使用像GitHub这样的存储库的人会配置关键的分支,以便甚至不可能直接推送它们,作为安全预防措施。

答案 1 :(得分:1)

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

git revert <commit>只会在您的本地仓库中创建一个新的提交,而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,否则公共仓库将会更新。

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

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

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