Git还原了误会

时间:2014-09-21 09:27:58

标签: git

有人可以解释一下git-revert是如何工作的。

目前我在我的应用程序中犯了一些错误,并将更改推送到master分支。现在我找到了工作提交,我想将我的主分支重置为该工作提交。

所以我的问题是,如果我输入git-revert 145bb80,我将会怎样做,我的所有文件是否与最初提交时的文件相同:145bb80?

3 个答案:

答案 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。它将创建一个新的提交来反转先前错误提交的效果。