繁体   English   中英

Git恢复为先前的提交,但将新提交保留为未暂存

[英]Git revert back to previous commit but keep newer commits as unstaged

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

返回到B状态, C为未分段的更改?

由于A -> B -> C被推送到远程仓库,我不能期望git reset B 但是我可以期待的是A -> B -> C -> B' ,其中, B'B处于相同状态,但C为无阶段变化。

正如Ovsyanka回答的那样git reset确实按照工作树的要求进行了工作 (就此而言,它也是索引/临时区域:您可以使用--mixed控制索引是否重置为目标提交B ,或者--mixed vs --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某些操作,并且还做了其他一些工作,他们想知道:“嘿,谁把C所有出色工作都扔了?等一下,是 C那个人什么...?”

如果他们C--unC--DC--unC--D序列,而提交unC是“ revert”,那么他们(可能又是你自己)将立即知道:“啊哈,恢复C的人在说C错的 ,然后加D的人正在做出不同的更改……哦,那个人是 。哦,是的,我现在记得!”

即使您尚未推送/发布提交C ,将其恢复为这样仍然是一个不错的主意。 然后,在实际使用git push提交顺序之前,可以运行git rebase -i并删除C及其版本,以使其看起来从未犯过该错误。 (或者,等效地,将一堆提交压缩在一起,以便您进行一次“非常好”的更改,或者进行一小组“非常明智的”更改,而不是曲折地收集“尝试一下,也尝试一下,哦,等一下第一个是错误的,嗯,我们也需要此辅助修复程序,哦,在进行任何更改之前,如果我们在测试中解决了这个主要问题,那就太好了!错误,很明显,我们正在修复什么以及为什么!”)

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

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

但是,如果您要删除的是C更改,而不仅仅是对其进行修复,则最好还原C提交然后再执行其他提交。 对其他人来说,您将完成已丢弃的C提交更改。

您可以使用git revert C然后将拥有clezn工作目录和历史记录“ A-B-C-C(rev)”,并且文件的状态将与B中的一样。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM