Git恢复误解

问题描述:

有人可以解释git-revert是如何工作的。Git恢复误解

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

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

所以我的问题是,如果我输入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恢复,以避免撤消别人的工作。

+0

很好的答案,但我也想提一提'git checkout -p',它可以让你轻松地“恢复”提交的某些部分。 – 2014-09-21 09:47:36

+0

我是唯一使用此分支的人。所以总结一下,如果我做git reset --hard 145bb80,我会拥有和以前一样的文件吗? – Alen 2014-09-21 09:50:46

+0

git reset在这里并不适合,因为他向上游推送了他的更改,并且使用重置会让您的树状态处于无法继续推送的状态。 Git checkout确实可以起作用,但是会产生类似于使用git revert的效果,因为您正在创建一个新的提交。 – 2014-09-21 09:51:01

Git revert创建了一个新的提交,它与要撤消的提交相反。所以,这绝对是你想要的,因为你已经推动了你的改变,你也需要撤消上游的改变(我假设)。它确实会让你的文件恢复到你想要的状态。它当然不会消除你错误的历史。

您还可以使用还原为一系列的提交:

git revert OLDER_COMMIT^..NEWER_COMMIT 

如果您有推更改远程仓库,你最好不要使用命令git reset,尤其是--hard,这是很危险的。远程存储库可能不允许强制推送,因为git reset将修改您的提交历史记录并进行推送非转发合并。即使允许,它也可能会破坏已经从git服务器(远程中央存储库)提取的其他人的历史记录。

使用git revert是优选的。它会创建一个新的提交来扭转您之前错误提交的效果。