Git diff 本地比较“内容”与 github 上的 Git diff(例如 - 针对另一个分支创建 PR)比较提交?

问题描述 投票:0回答:1

例如 - 假设您有

Branch A
Branch B
,它们具有 相同的内容,因为分支 B 是从分支 A 分支出来的。

现在,假设我们将 master 重新设置为分支 B -

git rebase master

如果我现在在本地进行 git diff:

git diff branchA..branchB

结果:未检测到任何变化

但是,如果我在 github 上打开一个拉取请求,源为 BranchB,目标为 BranchA。

两个分支之间相同的内容将显示在差异中,因为提交哈希值不同,因为变基重写了提交。

所以只是为了确认我所看到的,github 的 diff 与 git 的 diff 不同?

git github
1个回答
0
投票

为什么 GitHub 的 Diffing 与 Git 的 Diffing 不同

是的,GitHub 的 diff 行为与

git diff
不同,因为 GitHub 除了分支的内容之外,还考虑了分支的“整个提交历史记录”。这里有一个解释:

1.
git diff

本地
当您运行 

git diff branchA..branchB

时,Git 会比较

branchA
branchBtip(最新提交) 中的
 文件内容

如果文件的内容相同(在您的情况下是这样),即使分支的提交历史不同,它也不会报告任何差异。
  • Git 的
  • diff 仅关注文件的当前状态
    ,而忽略提交历史记录。
2. GitHub 拉取请求中的差异

GitHub 通过比较源 (

branchB

) 和目标 (branchA) 的

提交历史
来生成拉取请求的差异。

它计算
    branchB
  • 中不在
    branchA
    中的提交引入的更改。
    由于变基会重写提交历史记录(创建新的提交哈希值),因此 GitHub 会将这些视为新提交,即使它们的内容相同。
为什么 GitHub 表现出差异

当您将

branchB

重新设置为

master
时,它会重写
branchB
的历史。

即使
    branchB
  • branchA
    中的文件内容相同,GitHub 仍将
    branchB
    中重写的提交视为相对于
    branchA
    的“新”提交。
    因此,拉取请求显示差异,因为 
  • branchB
  • 中的提交不再是
    branchA
    历史记录的一部分。
    
    
要点

    Git 的
  1. diff 比较提交之间的文件内容
    并忽略历史记录。
  2. GitHub 的拉取请求差异会考虑提交历史
  3. ,并将重写的提交视为新提交,即使它们的内容匹配。
如何避免混乱

使用基于合并的工作流程而不是变基来保留提交历史记录。
  • 使用 GitHub 的
  • --squash
  • 合并选项将重写的历史记录折叠到单个提交中,从而最大限度地减少提交历史记录中的差异。
    
        
© www.soinside.com 2019 - 2024. All rights reserved.