如何在git中将旧提交的部分与HEAD合并?

时间:2016-10-24 08:56:09

标签: git github git-merge git-commit

我尝试使用Method A解决编码问题。我提交了Method A的最佳工作示例(我将称之为"Commit 5")。我对Method A并不满意。然后我继续使用Method B开发程序。它现在在"Commit 8"。 (全部在主分公司)

我现在决定坚持Method A,但自Commit 5以来,代码的许多其他部分都发生了变化。我想将与Method B相关联的所有代码回退到Method A,但保持其他所有内容不变。这些差异跨越多个文件。

我如何在git中实现这一目标?是否有某种"manual partial revert-merge"工作流程来执行此操作?

3 个答案:

答案 0 :(得分:1)

好的,我就这样做了:

我得到了HEAD和commit 5之间不同的文件列表,如下所示:

git diff HEAD..e4647 --name-status > /tmp/filelist

然后我在vim中对其进行了编辑,以删除我不想恢复的任何文件,并将其转换为名为' filestodiff'的间隔文件列表。然后,我使用该列表制作并应用了一个补丁。

git diff HEAD..e4647 -- `cat /tmp/filestodiff` > /tmp/patch
git apply /tmp/patch

有一个二进制文件(无法修补),所以我手动检查了它:

git checkout e4647 the_binary_file

这足够接近。我尝试编辑补丁文件以删除我不想要的一些单独的换行,但它只是损坏了补丁,所以我手动完成了那几行换行。

最后,我确保添加了任何新文件,它仍然构建,然后:

git commit -am 'hurray! its not borked anymore!'

答案 1 :(得分:0)

假设Method B中的所有更改都在Commit 8中,您只需还原Commit 8

检查:

https://help.github.com/desktop/guides/contributing/reverting-a-commit/

https://github.com/blog/2019-how-to-undo-almost-anything-with-git

答案 2 :(得分:0)

运行git rebase -i Commit5,然后您可以根据需要选择要使用和编辑提交的提交。