比较两个分支会产生不同的差异

Rob*_*bin 5 git

我使用 Bitbucket 来比较两个分支。当我将我的master分支(作为我的源)与我的uat分支(作为我的目的地)进行比较并查看差异时,我注意到当我将uat(作为我的源)与master(作为我的目的地)进行比较时,文件列表完全不同。在master作为我的来源进行比较时,还有更多不同的文件。然而,uat作为我的来源进行比较时,只有少数文件有所不同。为什么我比较的顺序会不同?为什么在比较两个分支时源和目标甚至很重要?


另外,我注意到差异中列出的大多数文件具有相同的内容,但唯一的区别是提交哈希。


这是一些屏幕截图。我正在使用 BitBucket UI 来比较两个分支。当让master我成为我的来源时,您可以看到我的屏幕截图中包含的设置文件夹,当我uat1成为我的来源时,该文件夹不存在。

uat1 作为我的来源


大师作为我的来源

LeG*_*GEC 6

您显示的屏幕截图有一个sourcedestination分支的概念,并且有一个Create pull request按钮。

我不熟悉 Bitbucket GUI,但所有提供 Pull Request 机制的 git 服务(Github、Gitlab(在 Gitlab 中称为“合并请求”)、Azure Devops,...)都有类似的视图:

显示的差异是:

  • source如果您将其合并到中,将会带来的更改列表destination

这与以下不同:

  • source和之间的所有差异destination

用图表:

# say your branches 'master' and 'release/onemsg-uat1' look like this :

       D--E--F <- release/onemsg-uat1  (source)
      /
--*--X--A--B <- master  (destination)
     ^
    fork point, aka "merge base"
Run Code Online (Sandbox Code Playgroud)

为了表示“源分支带来的更改”,而不是查看 和 之间的完整差异BFGUI 向您显示从 开始的更改X

A。如果您打开拉取请求以将release/onemsg-uat1(源)合并到master(目标):要审查的更改是X和之间的差异F
b。如果你交换分支,看看master会带来什么release/onemsg-uat1:要审查的更改是X和之间的差异B


git术语来说,X被称为两个分支的“合并基”,你可以通过 得到它的 sha1 git merge-base master release/onemsg-uat1

查看本地存储库中的这些差异的第一种方法是:

# changes introduced in release/onemsg-uat1 :
git diff $(git merge-base master release/onemsg-uat1) release/onemsg-uat1

# changes introduced in master :
git diff $(git merge-base master release/onemsg-uat1) master
Run Code Online (Sandbox Code Playgroud)

上述命令有一个快捷方式:三点符号 git diff a...b

# changes introduced in release/onemsg-uat1 :
git diff master...release/onemsg-uat1

# changes introduced in master :
git diff release/onemsg-uat1...master
Run Code Online (Sandbox Code Playgroud)

要仅列出受影响的文件,请使用--name-only--name-status

git diff --name-only master...release/onemsg-uat1
git diff --name-status master...release/onemsg-uat1
Run Code Online (Sandbox Code Playgroud)

要在图形差异查看器中打开此差异,请使用git difftool

# the following command will open the differing files one at a time :
git difftool master...release/onemsg-uat1

# with the '-d' option, you will view the diff of two complete directories :
git difftool -d master...release/onemsg-uat1
Run Code Online (Sandbox Code Playgroud)


tor*_*rek 2

编辑:您正在使用 Bitbucket 的比较器,它不是git diff,甚至可能根本不是 Git 的一部分。Bitbucket 在这里做什么并不明显。它可能会也可能不会考虑合并基础:

\n\n
base=$(git merge-base $tip1 $tip2)\ngit diff $base $tip2\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,我一度认为这就是 GitHub 为拉取请求显示所做的事情,然后实验表明这不是 GitHub 所做的。这也可能不是 Bitbucket 所做的事情(BitBucket 基于 Web 浏览器的 UI 所做的事情也是否与 GitHub 所做的事情直接相关)。

\n\n

因为我不知道 Bitbucket 实际上在比较什么\xe2\x80\x94,尽管它显然不是两个分支提示\xe2\x80\x94,但我无法真正回答其余的问题。我将在下面留下原始答案,因为它可能对发现这个问题并且实际上只是git diff在命令行上运行的其他人有用。

\n\n
\n\n

输入git diff是(无论如何是第一个近似值)两个提交或两个快照:将此快照与该快照进行比较。

\n\n

输出git diff一组指令。这些说明告诉您如何更改第一个快照,以获得第二个快照。

\n\n

这意味着您最初的期望是错误的。Git 并不是说​​:要从较旧的快照转到较新的快照,请在此处添加这些行并在那里删除这些行。 它是说:从左侧提交/快照到右侧...... 如果交换两侧,就会颠倒过来方向:如果将快照 A 更改为快照 G 需要添加一行,请将快照 G 更改为快照 A 将需要删除同一行。

\n