假设有一个公共提交“xxxx”,我认为导致了一个错误,我想在本地试验恢复该提交。
如果我从git revert
(1,2)上的文档中正确理解,它会计算出还原目标提交xxxx所需的更改,并将它们推送到公共存储库自动。那是对的吗?这是我担心的最后一部分。
即。将git revert xxxx
恢复公共存储库中的xxxx?
如果是这样,有没有办法在我的本地工作文件夹中执行此操作,以便我可以构建一个HEAD副本,并使用该实现恢复并试验它,而不会影响其他开发人员?
我是否需要使用--no-commit
选项:git revert xxxx --no-commit
?
或者我还有另一种方法吗?
感谢。
答案 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仓库的工作目录,但master
和origin/master
仍然指向提交D
。< / p>
A---B---C---D master, origin/master
如果您希望工作目录清洁,可以使用git revert --abort
。