我想我的问题很接近这个one https://stackoverflow.com/questions/20971306/hg-how-do-i-revert-a-single-file-several-commits-back,但我正在使用 git。
所以,假设我有
Commit1改变了file1.c and file2.c
Commit2改变了file2.c, file3.c, file4.c
Commit3改变了file1.c , file2.c and file3.c
等等...
然后,我只想恢复以下更改Commit2在制作file2.c,但是,尝试保留以下更改Commit3在此文件中制作...
你认为呢?有什么办法可以做到吗?
谢谢。
一般来说,要取消entire提交,你会使用git revert
(您可能已经知道)。您的问题是您只想退出some旧提交中的更改。但事实证明这很容易,因为:
-
git revert
与反向应用补丁具有相同的效果(git show
or git diff
根据需要使用特定的提交 ID,然后git apply -R
生成的补丁)然后提交;和
-
git diff
允许您选择对哪些文件进行比较。
因此,对于常规(单父)提交,您可以简单地:
git show <commit-id> -- <path>
从中获得“有趣的”变化<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
(or git diff-tree
)具有两个特定的提交 ID。请注意,您可以在反向应用之前(或之后)检查差异,因为git apply
本身不会进行新的提交(因此您必须自己执行此操作)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)