我认为我的问题接近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 在这个档案中制作......
你怎么想?有办法吗?谢谢。
答案 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 show
或git 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上的文件。