如何在git上恢复旧提交中的特定文件

时间:2014-12-09 20:19:55

标签: git

我认为我的问题接近one,但我使用的是git。

所以,让我们说我有

Commit1 已更改 file1.c file2.c

Commit2 已更改 file2.c file3.c file4.c

Commit3 更改了 file1.c file2.c file3.c

依旧......

然后,我想仅还原 Commit2 file2.c 中所做的更改,但是,请尝试保留 Commit3 在这个档案中制作......

你怎么想?有办法吗?

谢谢。

3 个答案:

答案 0 :(得分:4)

您可以尝试还原Commit2(即,应用 new git commit,其更改将与Commit2中所做的更改相反)但不提交。例如,gitk中有即时菜单条目。在此新提交中,您只保留对file2所做的更改并提交结果。

或者,您可以简单地执行类似

的操作
git diff Commit2..Commit1 -- file2.c > revert.patch
git apply revert.patch

在应用之前查看补丁可能很有用,因为在Commit2之后提交可能会引起与Commit2中file2.c的更改的一些冲突。

答案 1 :(得分:4)

通常,要退出整个提交,您可以使用git revert(您可能已经知道)。您的问题是,您只想退出旧提交中的某些更改。但事实证明这很容易,因为:

  • git revert与反向应用补丁(git showgit diff根据需要使用特定提交ID,然后生成git apply -R生成的补丁)具有相同的效果提交;和
  • git diff允许您选择要区分的文件。

因此,对于常规(单亲)提交,您可以简单地:

git show <commit-id> -- <path>

让#34;有趣&#34;从<commit-id>更改,然后将结果传输(或以其他方式提供)到git apply -R

git show HEAD~3 -- <path> | git apply -R

或在这种情况下:

git show commit2 -- file2.c | git apply -R

对于合并提交,git show将生成组合差异,这不是您想要的,因此您应该使用git diff(或git diff-tree)两个特定的提交ID。请注意,您可以在反向应用之前(或之后)检查差异,因为git apply本身不会进行新提交(因此您必须自己完成)。

答案 2 :(得分:2)

您想revert吗?

或者只是想修改它。如果是这样,你可以用

完成
git rebase -i HEAD^^

接下来,编辑器将打开。在编辑器中修改&#39;选择&#39;编辑&#39;在Commit2上像

pick abcdefg Commit3
pick jikdvuf Commit2

pick abcdefg Commit3
edit jikdvuf Commit2

然后,您可以修改您的提交。所以现在修改文件。您可能想要git checkout FILENAME。之后

git add FILENAME
git rebase --continue

现在您已成功修改Commit2上的文件。