Git 我希望看到两个合并提交之间的差异,只对第一个合并提交的文件进行更改

Git 我希望看到两个合并提交之间的差异,只对第一个合并提交的文件进行更改,git,atlassian-sourcetree,git-diff,Git,Atlassian Sourcetree,Git Diff,通常,我在git中遇到这种情况 蓝色为master,有一个公共祖先提交和两个合并提交 绿色为feature-branch-1或feat1 红色是feat2 这两个分支都是git自动合并的,但我知道有一些“冲突”的更改,我担心它们是如何解决的,然而,显示任何两个提交的差异会在许多不相关的文件中加载更改 是否可以看到feat1的合并提交与feat2之间的差异,但仅当feat1中出现受feat2影响的文件时?要列出两个合并提交修改的文件: 1-为一次提交列出更改的文件: git show <

通常,我在git中遇到这种情况

  • 蓝色为
    master
    ,有一个公共祖先提交和两个合并提交
  • 绿色为
    feature-branch-1
    feat1
  • 红色是
    feat2
这两个分支都是git自动合并的,但我知道有一些“冲突”的更改,我担心它们是如何解决的,然而,显示任何两个提交的差异会在许多不相关的文件中加载更改


是否可以看到
feat1
合并提交与
feat2
之间的差异,但仅当
feat1
中出现受
feat2
影响的文件时?

要列出两个合并提交修改的文件:

1-为一次提交列出更改的文件:

git show <SHA> --name-only --pretty=format:
git show--name only--pretty=format:
2-比较两个合并提交的文件列表并获得交集:

comm -12  <(git show SHA1--name-only --pretty=format: |sort -u) <(git show SHA2--name-only --pretty=format: |sort -u)

comm-12您想列出两个合并提交所修改的文件:

1-为一次提交列出更改的文件:

git show <SHA> --name-only --pretty=format:
git show--name only--pretty=format:
2-比较两个合并提交的文件列表并获得交集:

comm -12  <(git show SHA1--name-only --pretty=format: |sort -u) <(git show SHA2--name-only --pretty=format: |sort -u)
comm-12
这两个分支都是git自动合并的,但我知道有一些“冲突”的更改,我担心它们是如何解决的

目前,还没有很好的方式来证明这一点。(新的“merge-ORT”功能是一项使能技术,它将允许“伟大的方式”,或者至少是一种简单的单行命令方式来实现这一点,但目前还没有出现。)

在我看来,找出冲突是如何处理的最好方法是重新执行合并。当你这样做的时候,你会遇到冲突。您不必完成合并:只需获取冲突即可。现在,您有了所有冲突文件的列表,并且可以将合并快照中的内容与任何给定的其他提交中的内容进行比较

要重新执行合并,请检查合并提交的第一个父级,可能是作为分离的头,可能是在添加的工作树中,因为您可能会在之后将其丢弃。下面的命令假定您有一个地方可以执行此操作(主工作树之外的
)以及要测试的合并提交的哈希ID:

git worktree add --detach <path> <hash>^1
cd <path>                    # or pushd, if using bash, zsh, etc
git merge <hash>^2
现在,您可以在您喜欢的任何比较工具中比较编辑器、三向合并处理程序、冲突文件和已解析文件。如果愿意,也可以使用
git checkout index--stage=all conflicted.ext
轻松获取三个合并输入文件

现在,关于你的最后一个问题:

git show <hash>:conflicted.ext > resolved.ext
是否可以看到feat1和feat2的合并提交之间的差异,但只能看到feat1中引入的受feat2影响的文件

您可以拥有
git diff
diff任何特定的文件,但从文件的角度考虑是错误的。从提交的角度考虑,因为git diff本身比较了某些提交中存储的快照。您必须首先命名这两个提交。1因此,如果
M1
master
上merge commit#1的散列ID,它合并提交
P1
(master上的父级,可能是图2左边缘蓝色显示的合并基提交)和
P2
(可能是最右边的绿色提交)。您必须在这三个提交中选择两个

在这种特殊情况下(其中
P1
可能是合并基础提交),我们可以通过简单地比较合并结果快照和合并基础快照来确定哪些文件是“在
feat1
中引入的”。任何状态为
A
(新添加)的文件必须来自
feat1
。但是,如果在合并基础和最终合并之间,
master
上有任何提交,则新添加的文件可能来自
master
上的其他提交。所以这个案例很简单:

git diff --name-only --diff-filter=A <P1> <M1>
git diff--name only--diff filter=A
获取此类文件的列表。如果我们假设这个合并进行得很顺利,我们现在可以检查
M2
合并,特别注意这些文件。但是如果我们只是重复
M2
merge,那可能同样容易,甚至更容易


1这里有一种称为组合差异的东西,合并提交的
git show
会产生它,并且可以使
git diff
产生一个。然而,合并的差异故意遗漏了一些内容。我认为,组合diff的目的是帮助显示合并冲突,但组合diff用于选择要忽略的内容的机制使这个目的变得非常简单。特别是,如果有人错误地解决了冲突,只选择了某个文件的一个父版本,则组合的差异将完全忽略该文件,从而隐藏合并错误的事实

2我认为在这种情况下,他们是对的,但我多年来使用Atlassian软件的经验是,他们的一些图表有点不可靠。(这并不罕见:GitHub也有同样的问题。图形很难处理。)

这两个分支都是git自动合并的,但我知道有一些“冲突”的更改,我担心它们是如何解决的

目前,还没有很好的方式来证明这一点。(新的“merge-ORT”功能是一项使能技术,它将允许“伟大的方式”,或者至少是一种简单的单行命令方式来实现这一点,但目前还没有出现。)

在我看来,找出冲突是如何处理的最好方法是重新执行合并。当你这样做的时候,你会遇到冲突。您不必完成合并:只需获取冲突即可。现在,您有了所有冲突文件的列表,并且可以将合并快照中的内容与合并快照中的内容进行比较