我使用 Bitbucket 来比较两个分支。当我将我的master分支(作为我的源)与我的uat分支(作为我的目的地)进行比较并查看差异时,我注意到当我将uat(作为我的源)与master(作为我的目的地)进行比较时,文件列表完全不同。在master作为我的来源进行比较时,还有更多不同的文件。然而,uat作为我的来源进行比较时,只有少数文件有所不同。为什么我比较的顺序会不同?为什么在比较两个分支时源和目标甚至很重要?
另外,我注意到差异中列出的大多数文件具有相同的内容,但唯一的区别是提交哈希。
这是一些屏幕截图。我正在使用 BitBucket UI 来比较两个分支。当让master我成为我的来源时,您可以看到我的屏幕截图中包含的设置文件夹,当我uat1成为我的来源时,该文件夹不存在。
您显示的屏幕截图有一个source和destination分支的概念,并且有一个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)
为了表示“源分支带来的更改”,而不是查看 和 之间的完整差异B,FGUI 向您显示从 开始的更改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)
编辑:您正在使用 Bitbucket 的比较器,它不是git diff,甚至可能根本不是 Git 的一部分。Bitbucket 在这里做什么并不明显。它可能会也可能不会考虑合并基础:
base=$(git merge-base $tip1 $tip2)\ngit diff $base $tip2\nRun 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在命令行上运行的其他人有用。
输入git diff是(无论如何是第一个近似值)两个提交或两个快照:将此快照与该快照进行比较。
的输出是git diff一组指令。这些说明告诉您如何更改第一个快照,以获得第二个快照。
这意味着您最初的期望是错误的。Git 并不是说:要从较旧的快照转到较新的快照,请在此处添加这些行并在那里删除这些行。 它是说:从左侧提交/快照到右侧...... 如果交换两侧,就会颠倒过来方向:如果将快照 A 更改为快照 G 需要添加一行,请将快照 G 更改为快照 A 将需要删除同一行。
\n