Git恢复到之前的提交,但保持较新的提交为未分级

时间:2017-02-12 10:27:48

标签: git version-control

我有一个Git存储库,其提交历史记录如下: A -> B -> CC是最新的提交),整个历史记录被推送到公共远程存储库。我可以这样做吗?

返回B州并将C作为未上演的更改?

A -> B -> C被推送到远程仓库时,我不能指望git reset B。但我可以期待的是A -> B -> C -> B'其中,B'B的状态相同,但C为非阶段性更改。

3 个答案:

答案 0 :(得分:2)

作为Ovsyanka answeredgit reset确实按照工作树(以及就此而言,索引/暂存区域)执行了您所要求的工作:您可以使用B vs --mixed来控制索引是否重置为目标提交--soft。但是,如果您定期执行git revert C,那么执行通常的edit-add-commit序列,您将得到:

A--B--C--unC--D

即,总共5次提交。如果想要那样,你可以使用:

git revert -n C

在您的工作树(和索引)中还原C而不实际提交。然后,您可以进行进一步的更改并再次提交,并给出:

A--B--C--D

其中D撤消C 进行进一步更改。

但是有一个很好的理由坚持使用简单的还原。假设有人 - 甚至你自己 - 将来会回到这个项目,比如说,从现在起一年。这个人想知道过去发生了什么,并正在审查提交。它们来自提交D,在检查时,显然撤消了一些提交C并且还做了一些其他的事情,他们想知道:"嘿,谁在{中抛弃了所有那些好工作{1}}?等等,这是 C的那个人。什么......?"

如果他们遇到了C序列,而提交C--unC--D正在"还原",他们 - 这可能又是你自己 - 会立即知道:" Aha,还原unC的人说C 错误,然后添加C的人正在做出不同的更改。 ..哦,呵呵,那个人是。哦,是的,我现在记得了!"

即使您没有推送/发布提交D,仍然可以像这样回复它。然后,在您实际提交C之前,您可以运行git push并删除git rebase -i及其恢复,以使其看起来像是从未犯过这样的错误。 (或者,等同地,将一堆提交压缩在一起,以便你有一个"非常好"改变,或者一小部分"真正明智的改变,而不是蜿蜒的& #34;试试这个,试试看,哦等等第一个错了,啊我们也需要这个辅助修复,哦,在我们做任何这些改变之前,如果我们修复这个问题会很好测试中的主要问题!然后我们已经看到了什么是错的,很明显我们正在修复什么以及为什么!")

答案 1 :(得分:1)

git reset --mixed B做你想做的事:

  

重置索引但不重置工作树(即保留更改的文件但未标记为提交)并报告尚未更新的内容。这是默认操作。

但是如果你想要实际删除C更改,而不仅仅是修复它,那么最好还原C提交,然后进行另一次提交。其他人会很清楚,你完成了丢弃的C提交更改。

你可以使用git revert C - 然后你将拥有clezn工作目录和历史'A - B - C - C( rev)'和文件状态与B中的情况类似。

答案 2 :(得分:0)

您可以使用以下命令来满足您的要求:

git revert <commit id for B>
git checkout <commit id for C> -- *.* & git reset HEAD *.*