如何在单个文件中恢复旧提交的更改
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 checkout
或 git 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 秒内完成我所做的事情。
如何 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 checkout
或 git 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 秒内完成我所做的事情。