如何恢复提交,但将更改放在舞台上,以便我可以编辑提交,直到它是我想要的。
以前我很熟悉 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
。
我同意另一个答案,如果您正在处理其他人的历史记录,那么恢复完整提交可能会更好。当我变基并修复我自己的更改时,我经常使用这个
revert + reset
。
您可以使用
git revert -n
。我建议你不要。单独提交以进行您做想要的更改。
原因很简单。提交是快照,但它代表更改。为了从快照中查找更改,Git 会将提交与其直接父级进行比较。
也就是说,如果文件 A 之前有 10 行,现在有 11 行,则将文件 A 的旧副本与文件 A 的新副本进行比较将(可能)显示有人添加了一行。 diff 会显示:要将旧提交更改为新提交,请将这一行添加到文件 A。如果文件 B 之前有 20 行,现在有 19 行,则 diff 会显示: 要将旧提交更改为新提交,请从文件 B 中删除这一行。
一个简单的提交
git revert
,在显示时将显示相同的更改,但向后:从文件 A 中删除这一行,并将这一行添加到文件 B。
如果您的意思(并将在此第第三个提交中提交)只是将一行添加到文件A,那么现在您有一个正确的单个提交,当显示时,会显示添加此内容一行写入文件 A。
如果您改为进行非提交还原,然后将行放回去,则必须将两个单独的提交(错误的提交和正确的还原)加在一起,以查看实际意图。这并没有“错误”,但这意味着后来的任何人,为了了解发生了什么以及在类似情况下他们可能需要做什么,都必须更加努力。 比较这些说明:
“做 X;等等,不,不要做 X。做 Y。”
(请注意,您可以通过以下方式构造提交
Y
:
git cherry-pick -n X
其中 X 是您恢复的那个。这样,您可以获得所有更改,但可以开始撤消它们。
另请注意,
git revert -n
和
git cherry-pick -n
将所有内容放入暂存区域,也就是说,它们对所有更新的文件执行 git add
。这实际上没有问题,但如果您不喜欢它,可以运行 git reset
取消暂存。)