如何还原/删除在较早的多文件提交中所做的更改,但仅在单个文件中执行?即像
git revert <commit-specifier> <file>
除git revert
以外不接受<file>
参数。以下答案均不能解决此问题:
Git: Revert old commit on single file只是关于如何调试冲突。
Undo a particular commit in Git that's been pushed to remote repos无法解决我的单个文件问题。
Git: revert on older commit也不解决单个文件的问题。
答案 0 :(得分:3)
Git是一个工具集,而不是一个解决方案,因此有多种解决方案。但是,一种相对简单的方法是从git revert -n
开始,它开始还原,但没有完成
git revert -n <commit-specifier>
这当然试图将对所有 all 文件的更改全部撤回。您只想撤消对一个文件的更改。但是现在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
命令选项可能会有所帮助。 (与使用Cherrypick -n
方法一样,您必须自己提交结果。)
答案 1 :(得分:1)
您可以先还原它:
git revert <commit-specifier>
然后重置HEAD〜1:
git reset --soft HEAD~1
和git只添加您要还原的文件:
git add -- <revert_file>
现在您可以再次提交
git commit --amend
删除所有其他更改:
git checkout -- .