我正在使用 IntelliJ 的“比较分支”功能来比较
branch_A
与 branch_B
。 branch_A
中的一些提交被精心挑选到 branch_B
中,但是当我比较分支时,这些精心挑选的提交显示为差异。 IntelliJ 将它们列为“分支 B 中不存在提交 X”,即使更改实际上存在于branch_B 中。这个问题的出现似乎是因为樱桃采摘创建了一个具有不同哈希值的新提交。
这使得很难准确比较分支之间已合并或未合并的内容。
如何在考虑精选提交的同时比较 IntelliJ 中的分支?是否有任何 IntelliJ 设置、插件或工作流程可以更好地处理这种情况?或者,是否有基于 Git 的命令行解决方案可以提供帮助?我愿意接受有关改进工作流程或使用外部工具来解决此问题的建议。
预先感谢您的帮助!
注意:您的问题的答案需要两部分。第 1 部分是答案的 Git 部分,第 2 部分是答案的 IntelliJ 部分。如果您只关心第 2 部分,请跳至底部。
从 Git 的角度来看,“比较”的含义很重要。如果您要比较“提交”,那么您将看到的提交列表将是:
git log A..B # list all commits only reachable by B
或
git log A...B # list all commits only reachable by A or B
当您在分支之间进行挑选时,您将创建新的提交 ID,因此在比较“提交”时它们将始终显示为差异,但大多数时候在使用特定类型的比较时它们不会显示为差异“状态”。
要比较“状态”,您可以使用:
git diff A...B # show me changes only on B (includes cherry-picked changes)
或
git diff A..B # show me changes only on A or B (excludes cherry-picked changes)
请注意上述每个命令中 2 点和 3 点之间的细微差别。作为如何在大多数拉取/合并请求工具的上下文中使用它们的示例,将
source
合并到 target
时看到的视图通常由以下定义:
git log target..source
git diff target...source
如果在
source
和 target
之间精心挑选了一些提交,这些更改将显示在大多数 PR 视图中,即使合并实际上不会进行这些更改。1
如何在IntelliJ中完成
git diff
要排除精心挑选的更改,您需要使用 2 点差异而不是日志。请注意,两个分支之间的 2 点差异在语法上与无点相同,例如
git diff A B
。 以下是如何在 IntelliJ 中使用 2 点差异进行“比较”。
1 事实上,大多数 PR/MR 工具中都会出现精心挑选的更改,这一事实经常会惹恼(甚至激怒)那些看到他们知道实际上不会发生的更改的人。因此,某些工具在 UI 中提供了一个选项来查看临时合并提交,用于确定是否存在冲突。当临时合并提交 (
TMC
) 在幕后创建时,将其与其第一个父级进行比较将显示 PR 完成后将发生的确切更改。例如:git diff TMC~1 TMC