从特定提交还原对特定文件的更改

Rya*_*yan 2 git

几个星期前(即许多提交之前),我做了一个触及许多文件的git提交.大多数提交都很棒.

但是,我现在想要撤消我对其中一个文件所做的更改,但我不想覆盖该提交之后对该文件所做的任何更改.

有没有办法让我恢复特定的提交,但仅限于该提交中的一个文件?

tor*_*rek 10

在该提交中为该文件获取补丁准备好的diff,然后反向应用补丁:

git show <commit-id> -- <path> | git apply -R -
Run Code Online (Sandbox Code Playgroud)

确保您喜欢结果,如果是,请添加并提交相应的消息.

  • 谢谢,但失败了:“错误:&lt;myFileName&gt;:补丁不​​适用” (2认同)

小智 6

Torek 的答案肯定更好(而且简单!),但为了完整起见,我想为这个问题添加一些替代(一些天真的)解决方案。

解决方案 1:反向补丁(比较幼稚,与 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)

但是通过颠倒顺序,您最终会得到这些更改的倒数,这是可以用作补丁的有效差异!

解决方案 2:还原所有文件,然后仅提交对特定文件的更改(非常幼稚)

一个更简单的解决方案是恢复添加了要撤消的更改的提交,但不提交恢复。然后只需从索引和工作副本中删除对其他文件的所有更改:

git diff <commit> <commit>^ -- <filepath> | git apply
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为git revert不会恢复对单个文件的更改,它目前仅恢复整个提交。