如何还原提交并将更改放回舞台

How to revert a commit and put changes back to stage

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

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

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

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

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

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

如果您的意思——并将在本次第三次提交中提交——只是将一行添加到文件A,现在你有一个正确的 单次提交 ,当显示时,会说 将这一行添加到文件 A .

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

比较这些说明:

  1. "Do X; wait, no, don't do X. Do Y."
  2. "Do X. Then while undoing X, do Z."

未来你更想看到哪个?

(请注意,您可以通过以下方式构造提交 Y

git cherry-pick -n X

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

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

试试这个

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