如何在 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!'
我尝试使用 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!'