如何合并 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>...]
查看合并的更改。如果在相同的路径中有其他您不想看到的更改,您可能无论如何都不走运,因为您的某些提交可能基于这些更改。
我开始处理一个我认为只需要提交一次的问题,然后我开始包含其他功能,并且 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>...]
查看合并的更改。如果在相同的路径中有其他您不想看到的更改,您可能无论如何都不走运,因为您的某些提交可能基于这些更改。