几个星期前(即许多提交之前),我做了一个触及许多文件的git提交.大多数提交都很棒.
但是,我现在想要撤消我对其中一个文件所做的更改,但我不想覆盖在该提交之后对该文件所做的任何更改.
有没有办法让我恢复特定的提交,但仅限于该提交中的一个文件?
tor*_*rek 10
在该提交中为该文件获取补丁准备好的diff,然后反向应用补丁:
git show <commit-id> -- <path> | git apply -R -
Run Code Online (Sandbox Code Playgroud)
确保您喜欢结果,如果是,请添加并提交相应的消息.
小智 6
Torek 的答案肯定更好(而且简单!),但为了完整起见,我想为这个问题添加一些替代(一些天真的)解决方案。
这与 Torek 的解决方案非常相似。要撤消特定提交对特定文件所做的更改,只需通过反转以下参数来获取该提交的反向差异git diff:
git diff <commit> <commit>^ -- <filepath> | git apply
Run Code Online (Sandbox Code Playgroud)
通常,要获取 引入的更改<commit>,您可以使用以下命令
git diff <commit>^ <commit>
Run Code Online (Sandbox Code Playgroud)
但是通过颠倒顺序,您最终会得到这些更改的倒数,这是可以用作补丁的有效差异!
一个更简单的解决方案是恢复添加了要撤消的更改的提交,但不提交恢复。然后只需从索引和工作副本中删除对其他文件的所有更改:
git diff <commit> <commit>^ -- <filepath> | git apply
Run Code Online (Sandbox Code Playgroud)
这是必要的,因为git revert不会恢复对单个文件的更改,它目前仅恢复整个提交。