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

时间:2014-05-29 23:02:31

标签: git

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

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

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

2 个答案:

答案 0 :(得分:10)

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

git show <commit-id> -- <path> | git apply -R -

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

答案 1 :(得分:2)

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

解决方案1:反向补丁(天真,与Torek的解决方案相比)

这与Torek的解决方案非常相似。要撤消对特定提交所做特定文件的更改,只需通过将参数反转为git diff来获取该提交的反向差异:

git diff <commit> <commit>^ -- <filepath> | git apply

通常,要获得<commit>引入的更改,请使用订单

git diff <commit>^ <commit>

但是通过颠倒顺序,你最终会获得这些变化的反转,这是一个可用作补丁的有效差异!

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

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

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不会还原对单个文件的更改,它目前只会还原整个提交。