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

How to merge parts of old commit with HEAD in git?

我尝试使用 Method A 解决编码问题。我提交了 Method A 的最佳工作示例(我将其称为 "Commit 5")。我对 Method A 并不完全满意。所以我继续使用 Method B 开发程序。现在是 "Commit 8"。 (全部在 master 分支)

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

我如何在 git 中最好地实现这一点?有某种 "manual partial revert-merge" 工作流程可以做到这一点吗?

假设 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

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

好的,我就是这样做的:

我得到了 HEAD 和提交 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 添加了任何新文件,它仍然构建,然后:

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