有人可以解释一下git-revert是如何工作的。
目前我在我的应用程序中犯了一些错误,并将更改推送到master分支。现在我找到了工作提交,我想将我的主分支重置为该工作提交。
所以我的问题是,如果我输入git-revert 145bb80
,我将会怎样做,我的所有文件是否与最初提交时的文件相同:145bb80?
答案 0 :(得分:2)
所以我的问题是,如果我输入git-revert 145bb80,我将会怎样做,我的所有文件是否与他们最初提交时的文件相同:145bb80?
好问题,答案是肯定的。我想你是来自Subversion土地(和我一样)并且还原意味着不同的东西 - 它是你工作副本上的一个动作,而不是存储库。在Git land中,git revert
旨在反转单个提交的更改,而不是将整个树还原到特定状态。
您要查找的命令是git reset
- 尽管有一些表单适用于工作树和索引。有几种不同的形式。如果你想让你的分支指向145bb80
,那么你就可以在那个分支上运行git reset --hard 145bb80
。结果会发生两件事:
1)你的分支将强行指向145bb80
。发生的任何其他提交都将丢失。这是历史重写的一种形式,所以要确保它是你想要做的。如果您尝试推送分支,也会出现错误。它会告诉您它不是快进提交,并且您需要git push --force
强制它在远程存储库上。再次,要小心。确保这是你的团队想要的。
2)git reset --hard
将删除索引和工作树中的任何本地更改。因此,如果您想保留它们,则需要在使用git reset --hard
之前存储它们。
还有另一种选择远不那么危险。那将是恢复还原。这听起来有点傻,但它让你的历史继续快速前进。
另外,如果你只是想像145bb80
中那样复制一个文件,那么你也可以这样做:
git checkout 145bb80 -- path/to/file
您可以使用以下内容将树还原为145bb800
中的内容:
git checkout 145bb80 -- .
但是,请注意这种命令,因为你可能会失去工作。
最好的办法是简单地使用git revert
还原错误提交,以避免撤消其他人的工作。
答案 1 :(得分:1)
Git revert创建一个新提交,它与您要撤消的提交相反。所以,这肯定是你想要的,因为你已经推动了你的改变,你也需要撤消上游的改变(我假设)。它确实会使您的文件恢复到您希望的状态。它当然不会消除你错误的历史。
您还可以使用revert进行一系列提交:
git revert OLDER_COMMIT^..NEWER_COMMIT
答案 2 :(得分:1)
如果您已将更改推送到远程存储库,则最好不要使用命令git reset
,尤其是--hard
,这很危险。远程存储库可能不允许强制推送,因为git reset
将修改您的提交历史记录并使您的推送非正向合并。即使它被允许,它也可能摧毁已经从git服务器(远程中央存储库)撤出的其他人的历史。
首选使用git revert
。它将创建一个新的提交来反转先前错误提交的效果。