例如 - 假设您有
Branch A
和 Branch B
,它们具有 相同的内容,因为分支 B 是从分支 A 分支出来的。
现在,假设我们将 master 重新设置为分支 B -
git rebase master
如果我现在在本地进行 git diff:
git diff branchA..branchB
结果:未检测到任何变化
但是,如果我在 github 上打开一个拉取请求,源为 BranchB,目标为 BranchA。
两个分支之间相同的内容将显示在差异中,因为提交哈希值不同,因为变基重写了提交。
所以只是为了确认我所看到的,github 的 diff 与 git 的 diff 不同?
是的,GitHub 的 diff 行为与
git diff
不同,因为 GitHub 除了分支的内容之外,还考虑了分支的“整个提交历史记录”。这里有一个解释:
1. git diff
git diff branchA..branchB
时,Git 会比较
branchA
和 branchB
的 tip(最新提交) 中的 文件内容。 如果文件的内容相同(在您的情况下是这样),即使分支的提交历史不同,它也不会报告任何差异。
diff
仅关注文件的当前状态,而忽略提交历史记录。
branchB
) 和目标 (branchA
) 的
提交历史来生成拉取请求的差异。 它计算
branchB
branchA
中的提交引入的更改。由于变基会重写提交历史记录(创建新的提交哈希值),因此 GitHub 会将这些视为新提交,即使它们的内容相同。branchB
重新设置为
master
时,它会重写 branchB
的历史。
即使 branchB
branchA
中的文件内容相同,GitHub 仍将 branchB
中重写的提交视为相对于 branchA
的“新”提交。因此,拉取请求显示差异,因为 branchB
branchA
历史记录的一部分。
diff
比较提交之间的文件内容并忽略历史记录。
--squash