如何在单个文件中恢复旧提交的更改

How to revert changes from old commit in a single file

如何 revert/remove 在旧的多文件提交中完成的更改,但只在单个文件中完成? IE。像

git revert <commit-specifier> <file>

except git revert 不接受 <file> 参数。 None 以下答案解决了这个问题:

是关于如何调试冲突。

Undo a particular commit in Git that's been pushed to remote repos 没有解决我的单个文件问题。

也没有解决单个文件问题。

Git是一个工具集,不是一个解决方案,所以有多个解决方案。但是,一种相对直接的方法是从 git revert -n 开始,它会启动还原但不会 完成 它:

git revert -n <commit-specifier>

当然,这会尝试取消对所有 文件的所有 更改。您只想取消对 一个 文件的更改。但是现在 git revert 已经 尝试 而没有提交 您只需要恢复每个您 不想 更改的文件。获取此类文件的列表,然后使用 git checkoutgit restore(完全按照 git status 建议使用命令)使这些文件与当前提交匹配。现在 git status 将仅显示一个文件作为 要提交的更改 ,您现在可以 git commit 那一个文件。

另一种相对直接的方法是使用:

git show <commit-specifier> -- <pathspec> | git apply -R

如果您希望 Git 在文件的基本版本上使用三向合并,您可以将 -3 添加到 git apply 命令;在这种情况下,将 --full-index 添加到 git show 命令选项可能会有所帮助。 (与 cherry-pick -n 方法一样,您必须自己提交结果。)

您可以先还原它:

git revert <commit-specifier>

然后重置 HEAD~1:

git reset --soft HEAD~1

和 git 仅添加您要还原的文件:

git add -- <revert_file>

现在您可以再次提交

git commit --amend

删除所有其他更改:

git checkout -- .

我不小心提交了一个有几行更改的文件,并在 10 次左右的提交后才意识到。该文件不应该是任何提交的一部分。在我的情况下,恢复使用此 post 中的任何建议答案或任何其他 SO 答案是可怕的。 运行 陷入大量合并冲突地狱和无数 git 错误。我放弃并手动打开本地文件和 copied/pasted 来自 master 的文本并进行了提交。中提琴! PR 根本没有显示该文件已更改 - 幸运的是,我是目前唯一处理该回购的人。它实际上花了我 10 秒钟。如果我遵循 SO 中的答案,我可能会花费 15 分钟或更多时间并引入更多问题来尝试解决冲突。到底为什么 git 必须让琐碎的用例变得超级复杂?!因此,如果你 运行 遇到像我一样的问题,看看你是否可以直接在文件本身上恢复更改并提交。

我意识到我所做的可能并不适用于每个人的情况,但在 git 中,简单的事情仍然如此复杂!只需看看容易出错的 git 命令的数量,您就可以在 10 秒内完成我所做的事情。