git diff/log 检索也合并了提交

问题描述

鉴于以下架构,其中发布到 master 的修补程序 (D) 合并回测试分支,我们需要找到一种方法,在 test 和 master 之间存在差异,以获取 (B)、(C) 和 (D3) ).

hotfix      /------------D
           /              \
master ---A----------------D2--------
             \              \
test          \----B----C----D3------

每个 git diff(bot 2/3 dots)总是会返回 B 和 C 而不是 D3,所以我们以一个 git log 序列结束:

结帐测试:

git log --pretty=format: --name-only HEAD...$( git log --format=%H origin/master..HEAD | tail -1 )^ | sort -u -k1,1

这个想法是检索自公共锚点( B,C,D3 )以来的所有提交并检索每个更改的资源。 这“似乎”有效,但我们也许有更好的方法来完成我们的任务。

这种方法有很多缺点:

  • 我们失去了对差异过滤器的控制:我们还需要从检索中删除任何已删除的资源
  • 即使未更改,也会检索每个“还原”的资源

有更好的解决方案吗?


尝试更好地解释问题

要求:生成一个部署包,在 master 和 test 之间更改资源。资源必须被检索、打包并安装到多个环境中。

T0 : git diff master...test 从 C、B 中检索每个资源。然后将资源包安装到 ENV1 中

hotfix      
           
master ---A--------------
             \             
test          \----B----C

T2 : git diff master...test 从 C、B 但不是 D3 中检索每个资源。捆绑包将不包含 D3 资源,也不会保持 ENV1 更新。

hotfix      /------------D
           /              \
master ---A----------------D2--------
             \              \
test          \----B----C----D3------

该语句必须检索在测试中而不是在 master 上的资源,以及从 master 合并回来的资源以保持 ENV1 更新。 对齐 ENV1 的唯一方法是从提交/测试事件

提前致谢

解决方法

注意:您的图表有 3 个名为 D ....

hotfix      /------------D1
           /              \
master ---A----------------D2--------
             \              \
test          \----B----C----D3------

就提交范围而言:我认为您正在寻找 master..D3

git log [any options] master..D3

如果您想列出在 AD3 之间修改的文件AC 和 { 之间的合并基础{1}}:

D2

您可以使用它来获取 git merge-base C D2 # or,starting from D3 : # - 'C' is 'D3^' (first parent of D3) # - 'D2' is 'D3^2' (second parent of D3) git merge-base D3^ D3^2 A 之间的差异:

D3

如果您只想列出修改过的文件,您可以在 git diff [options] $(git merge-base D3^ D3^2) D3 中使用 --name-status--name-only