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
恢复,以避免撤消别人的工作。
Git revert创建了一个新的提交,它与要撤消的提交相反。所以,这绝对是你想要的,因为你已经推动了你的改变,你也需要撤消上游的改变(我假设)。它确实会让你的文件恢复到你想要的状态。它当然不会消除你错误的历史。
您还可以使用还原为一系列的提交:
git revert OLDER_COMMIT^..NEWER_COMMIT
如果您有推更改远程仓库,你最好不要使用命令git reset
,尤其是--hard
,这是很危险的。远程存储库可能不允许强制推送,因为git reset
将修改您的提交历史记录并进行推送非转发合并。即使允许,它也可能会破坏已经从git服务器(远程中央存储库)提取的其他人的历史记录。
使用git revert
是优选的。它会创建一个新的提交来扭转您之前错误提交的效果。
很好的答案,但我也想提一提'git checkout -p',它可以让你轻松地“恢复”提交的某些部分。 – 2014-09-21 09:47:36
我是唯一使用此分支的人。所以总结一下,如果我做git reset --hard 145bb80,我会拥有和以前一样的文件吗? – Alen 2014-09-21 09:50:46
git reset在这里并不适合,因为他向上游推送了他的更改,并且使用重置会让您的树状态处于无法继续推送的状态。 Git checkout确实可以起作用,但是会产生类似于使用git revert的效果,因为您正在创建一个新的提交。 – 2014-09-21 09:51:01