几个星期前(即许多提交前),我做了一个触及很多文件的git提交。大多数提交都很棒。
但是,我现在想撤消我对其中一个文件所做的更改,但我不想覆盖已经对其中的任何更改提交之后的文件。
我有办法恢复特定的提交,但仅限于该提交中的一个文件吗?
答案 0 :(得分:10)
在该提交中为该文件获取补丁准备好的差异,然后反向应用补丁:
git show <commit-id> -- <path> | git apply -R -
确保您喜欢结果,如果是,请添加并提交相应的消息。
答案 1 :(得分:2)
Torek's answer肯定更好(而且简单!),但为了完整起见,我想为这个问题添加一些替代(一些天真的)解决方案。
这与Torek的解决方案非常相似。要撤消对特定提交所做特定文件的更改,只需通过将参数反转为git diff
来获取该提交的反向差异:
git diff <commit> <commit>^ -- <filepath> | git apply
通常,要获得<commit>
引入的更改,请使用订单
git diff <commit>^ <commit>
但是通过颠倒顺序,你最终会获得这些变化的反转,这是一个可用作补丁的有效差异!
更天真的解决方案是恢复添加了要撤消的更改的提交,但不提交恢复。然后只需从索引和工作副本中删除对其他文件的所有更改:
git revert --no-commit <commit>
# Unstage all changes that revert all files
git reset -- .
# Stage and commit just the reversion changes that you want
git add <yourFile>
git commit -m "Revert changes to <yourFile> from <commit>"
# Undo all reversions changes to the other files
git checkout -- .
这是必要的,因为git revert
不会还原对单个文件的更改,它目前只会还原整个提交。