如何撤销一个提交但将更改保留在暂存区,以便我可以编辑该提交直到满意为止。
以前我熟悉 TFS,在那里撤消操作正好是这样做的。但是在 GIT 中,git revert
似乎会自动提交已撤消的提交,因此没有机会保留更改集中的某些内容。
试试这个
git reset HEAD^
HEAD^表示前一个提交。
(make sure that you have a clean working directory)
git revert <commit>
(accept commit message)
git reset HEAD^
git reset HEAD^ --soft
。与其他答案一样,如果您正在处理他人的历史记录,则最好还原完整的提交。不过,当我重新定位并修复自己的更改时,我经常使用此撤销+重置
。你可以使用git revert -n
。但我建议你不要这样做。最好单独创建一个提交来实现想要的更改。
原因很简单,一个提交是一个快照,但它代表了一个变化。为了找到从快照到变更的连接,Git将提交与其直接上级进行比较。
例如文件A之前有10行,现在有11行,在旧版本的文件A和新版本的文件A之间进行比较(可能)会显示有人添加了一行。差异会说:“为了将旧提交更改为新提交,请向文件A中添加此一行。”如果之前文件B有20行,现在只有19行,则差异将说:“为了将旧提交更改为新提交,请从文件B中删除此一行。”
简单的提交撤销会显示相同的更改,但是顺序相反:从文件A中删除此一行,并在文件B中添加此一行。
如果你的意思是,在第三次提交中仅向文件A中添加一行,则你将拥有一个正确的单个提交,该提交将显示“向文件A中添加此一行”。
如果你相反地进行非提交撤销,然后再把这一行放回去,你将不得不将两个单独的提交-错误的提交和更正的撤销-添加在一起,才能看到实际意图。这并不是错误的,但意味着后来的人要查看发生了什么,以及在类似情况下可能需要做些什么时,必须付出更多努力。
比较一下以下说明:
哪个会使未来的你更喜欢看到呢?
(请注意,你可以通过执行以下操作构建提交Y
:
git cherry-pick -n X
其中X是您还原的那个版本。这样,您就可以获得所有更改,但可以开始撤消它们。
另请注意,git revert -n
和git cherry-pick -n
将所有内容放入暂存区域-也就是说,它们对所有更新的文件执行git add
。 实际上没有问题,但如果您不喜欢它,您可以运行git reset
取消暂存。
git push
),则是安全的。如果提交是最近的提交,则这也是git reset HEAD~1
或等效项的用途。 - torek
git reset --soft
,它会取消你的提交并将更改放回暂存区。 - abdullahalali