如何恢复提交并将更改放回舞台

cod*_*nix 8 git revert changeset

如何恢复提交,但将更改放在舞台上,以便我可以编辑提交,直到它是我想要的。

以前我很熟悉 TFS,其中恢复正是这样做的,但在 GIT 中git revert似乎会自动签入未完成的提交,因此没有机会从变更集中保留某些内容。

Don*_*nat 13

尝试这个

git reset HEAD^
Run Code Online (Sandbox Code Playgroud)

HEAD^ 表示上一次提交。

  • 请注意,这回答了一个非常不同的问题。这可能是OP *应该*问的问题!有时,重置虚假提交是最好的方法。但这与做出新的提交来撤消错误的提交不同。 (3认同)

MrB*_*rta 5

(make sure that you have a clean working directory)
git revert <commit>
(accept commit message)
git reset HEAD^
Run Code Online (Sandbox Code Playgroud)

这将使您拥有本地更改,如果您接受所有内容,则可以恢复提交,但允许您只选择几行来恢复。您还可以更改为git reset HEAD^ --soft如果您希望将更改放入暂存区域,

我同意另一个答案,如果您正在处理其他人的历史,那么恢复完整提交可能会更好。revert + reset不过,当我变基并修复自己的更改时,我经常使用它。


tor*_*rek 4

可以使用git revert -n。我建议你不要这样做进行单独的提交以进行您确实想要的更改。

\n\n

原因很简单。提交一个快照,但它代表了一个更改。为了从快照中查找更改,Git 会将提交与其直接父级进行比较。

\n\n

也就是说,如果文件 A 之前有 10 行,现在有 11 行,则将文件 A 的旧副本与文件 A 的新副本进行比较将(可能)显示有人添加了一行。diff 会显示:要将旧提交更改为新提交,请将这一行添加到文件 A 中。如果文件 B 之前有 20 行,现在有 19 行,则 diff 会显示:要将旧提交更改为新提交,请从文件 B 中删除这一行

\n\n

一个简单git revert的提交在显示时将显示相同的更改,但向后显示:从文件 A 中删除这一行,并将这一行添加到文件 B 中。

\n\n

如果您的意思是\xe2\x80\x94and 将在第三次提交\xe2\x80\x94 中提交只是将一行添加到文件A,那么现在您有一个正确的单个提交,在显示时会说添加这一行到文件 A

\n\n

如果您进行非提交还原,然后将行放回去,则必须将两个单独的提交\xe2\x80\x94(错误的一个)和正确的还原\xe2\x80\x94加在一起,以查看实际情况故意的。这并没有,但这意味着后来的任何人,为了了解发生了什么以及在类似情况下他们可能需要做什么,都必须更加努力。

\n\n

比较这些指令:

\n\n
    \n
  1. “做 X;等等,不,不要做 X。做 Y。”
  2. \n
  3. “做X。然后在撤消X的同时,做Z。”
  4. \n
\n\n

未来你更希望看到哪一个?

\n\n

(请注意,您可以通过执行以下操作来构造提交Y

\n\n
git cherry-pick -n X\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中 X 是您恢复的那个。这样,您可以获得所有更改,但可以开始撤消它们。

\n\n

另请注意,git revert -n并将git cherry-pick -n所有内容放入暂存区\xe2\x80\x94,也就是说,它们git add对所有更新的文件执行 a 操作。这实际上没有问题,但如果你不喜欢它,你可以运行git reset取消阶段。)

\n