如何合并 Git 中先前提交的差异

How to combine diffs of previous commits in Git

我开始处理一个我认为只需要提交一次的问题,然后我开始包含其他功能,并且 UI 更改了这个问题,最终大约提交了 4 次。我想一次看到这些提交的所有差异的合并而没有重叠,我不确定这样的 git 命令是否存在。

我试过 git show sha sha sha sha 但它只显示了所有差异,而不是像我想要的那样合并差异。

例如,如果提交 1 添加了一行,而提交 2 删除了同一行,则合并后的 diff 甚至不应提及这行代码,类似地,对于由提交 1 和 2 修改的同一行,应该只显示最终的编辑提交 2.

请务必记住,在 4 次提交之间存在多次提交,因为多个用户正在提交到同一个存储库。

我想回复说你可以用一个简单的 git diff 但后来我读了你的最后一句话。

It is important to keep in mind that there are several commits between the 4 commits in question since multiple users are committing to the same repository.

这是关键。

据我所知,不可能“filter”从 diff 的特定提交中更改。可以单独查看每个commit的变化,不过你好像知道这个。

不过,如果您真的想获得更改的差异,并且只希望获得此提交引入的更改,则有一种方法可以实现。


创建一个临时分支,它指向您想要差异化的第一次提交

git branch tmp <first-commit-for-diff>
git checkout tmp

然后使用 git cherry-pick 顺序应用所有进一步提交的更改,您希望包含在您的差异中。

git cherry-pick <second-commit-for-diff>
git cherry-pick <third-commit-for-diff>
# And so on

这可能会导致冲突,特别是如果以后的提交依赖于您没有提交的更改 cherry-pick

在此之后,您可以简单地将分支与第一次提交区分开来。

git diff tmp <first-commit-for-diff>^    # The trailing ^ tells git to use the parent

这应该会产生所需的 "combined diff"。


为了将来简化这个过程,我建议从一开始就使用一个分支(例如称为 feature/abc)。然后您可以继续进行您自己的更改,而不会被其他用户引入的更改所打扰。

完成工作后,您可以将此分支合并到开发分支中。

这通常是 git 中非常常见的工作流程。

我想您真正想要的是您处理的一组特定文件的差异,而没有在存储库的不同部分进行不相关的更改。假设 commit1 是第一次提交,commit2 最后一次提交,[<path>...] 是你处理的 files/directories 的列表,你可以简单地使用

git diff commit1^..commit2 -- [<path>...]

查看合并的更改。如果在相同的路径中有其他您不想看到的更改,您可能无论如何都不走运,因为您的某些提交可能基于这些更改。