我使用Bitbucket来比较两个分支。当我将master
分支(作为我的源)与我的uat
分支(作为我的目的地)进行比较并查看差异时,我注意到当我比较{{1时,文件列表完全不同(作为我的来源)到uat
(作为我的目的地)。将master
作为我的来源进行比较时,会有更多不同的文件。然而,在将master
作为我的来源进行比较时,只有少数文件不同。为什么我比较的顺序不同?为什么在比较两个分支时,源和目的地是否重要?
另外,我注意到diff中列出的大多数文件都有相同的内容,但唯一的区别是提交哈希。
以下是一些截图。我正在使用BitBucket UI来比较两个分支。在让uat
成为我的来源时,您可以看到我的屏幕截图中包含的设置文件夹,当我master
成为我的来源时,该文件夹并不存在。
答案 0 :(得分:4)
您显示的屏幕截图包含 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"
为了表示“源分支带来的更改”,GUI 向您展示了从 B
开始的更改,而不是查看 F
和 X
之间的完整差异:
一个。如果您打开合并 release/onemsg-uat1
(source) 到 master
(destination) 的合并请求:要审查的更改是 X
和 F
之间的差异,
湾如果您交换分支,看看 master
会给 release/onemsg-uat1
带来什么:要审查的更改是 X
和 B
之间的差异。
在git
术语中,X
被称为两个分支的“合并基”,你可以用git merge-base master release/onemsg-uat1
得到它的sha1。
从本地存储库查看这些差异的第一种方法是:
# 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
上面的命令有一个快捷方式:the three dots notation 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
要仅列出受影响的文件,请使用 --name-only
或 --name-status
:
git diff --name-only master...release/onemsg-uat1
git diff --name-status master...release/onemsg-uat1
要在图形差异查看器中打开此差异,请使用 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
答案 1 :(得分:1)
编辑:你正在使用Bitbucket的比较器,它不是git diff
,甚至可能根本不是Git的一部分。 Bitbucket在这里做的事情并不明显。它可能会也可能不会考虑合并基础:
base=$(git merge-base $tip1 $tip2)
git diff $base $tip2
但是,我一度认为这就是GitHub为拉取请求显示所做的事情,然后实验表明它不是GitHub所做的。它可能不是Bitbucket所做的(也不是BitBucket的基于Web浏览器的UI是否与GitHub首先做的事情直接相关)。
因为我不知道Bitbucket实际上在做什么比较 - 虽然它显然不是两个分支提示 - 我无法真正回答其余部分。我将在下面留下原始答案,因为它可能对发现此问题的其他人有用,并且只是在命令行上运行git diff
。
git diff
的输入是(无论如何是第一次近似)两次提交或两次快照:将此快照与该快照进行比较。
来自git diff
的输出是一组说明。这些说明告诉您如何更改第一个快照,以获得第二个快照。
这意味着您最初的期望是错误的。 Git并没有说:要从较旧的快照转到较新的快照,请在此处添加这些行并将其删除。它说:从左侧提交/快照向右移动-side one ... 如果交换两侧,您将获得反向方向:如果将快照A更改为快照G需要添加一条线,则将快照G更改为快照A将需要删除同一行。