我有一个Git
存储库,其提交历史记录如下:
A -> B -> C
(C
是最新的提交),整个历史记录被推送到公共远程存储库。我可以这样做吗?
返回B
州并将C
作为未上演的更改?
当A -> B -> C
被推送到远程仓库时,我不能指望git reset B
。但我可以期待的是A -> B -> C -> B'
其中,B'
与B
的状态相同,但C
为非阶段性更改。
答案 0 :(得分:2)
作为Ovsyanka answered,git 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 *.*