Git 如何列出当前正在验证的拉取请求中更改的所有文件(在VSTS中)?

Git 如何列出当前正在验证的拉取请求中更改的所有文件(在VSTS中)?,git,Git,我有一个PR验证版本,我想列出PR中更改的所有文件以及状态 在每个构建上同步源。 因此,在合并PR更改之前,源代码位于修订版A(通常为origin/master)。 让我将PR merge commit指定为B 我当前的实现调用了git diff tree--name status-r-ma..B,但正如所示,这是不正确的 那么,正确的方法是什么?注意,Pull请求可能包含多个提交,其中至少有一个合并提交-B。但可能会有更多的合并提交 我非常确定有一种纯Git的方法可以做到这一点,并且不需要对T

我有一个PR验证版本,我想列出PR中更改的所有文件以及状态

在每个构建上同步源。 因此,在合并PR更改之前,源代码位于修订版
A
(通常为
origin/master
)。 让我将PR merge commit指定为
B

我当前的实现调用了git diff tree--name status-r-ma..B,但正如所示,这是不正确的

那么,正确的方法是什么?注意,Pull请求可能包含多个提交,其中至少有一个合并提交-
B
。但可能会有更多的合并提交

我非常确定有一种纯Git的方法可以做到这一点,并且不需要对TFS服务器执行RESTfulAPI来检查Pull请求对象

编辑1

A=b00bf1df0
B=81317ea59

给定(我正在使用Powershell):

实际上,所讨论的PR有一个提交-
b7d9617fc
,其中
81317ea59
是PR合并提交(即它是
B

正如我的另一篇文章所示,
git diff tree--name status-r-M b00bf1df0..81317ea59
不正确


我认为使用
..
也不正确,事实上:
git diff tree--名称状态-r-M b00bf1df0…81317ea59
不会返回任何结果。

我认为你应该使用
..
而不是

根本问题是问题的形式不正确:

。。。列出PR中更改的所有文件以及状态

拉取请求实际上是一种如下形式的请求:请更改分支名称
B
,这样,在您着手更改时,它不会指向提交所指向的任何内容,而是指向提交
C
。您可以随意执行此操作,但也可以通过自己的合并提交。拉请求这件事可能是也可能不是很难说,因为拉请求不是Git本身的一部分,而是由各种web服务提供的附加组件,每个web服务都可以实现这一点,尽管它们喜欢包含表单信息:顺便说一下,当我要求您将name
B
的值更改为hash ID
C
时,的值为hash ID
O

现在让我们假设它提供了所有三项:分支名称
B
,旧的提交哈希ID
O
,以及请求的提交哈希ID
C
。我们还要声明
B
的实际哈希值当前是
A
。可能是A=
O
,也可能不是。(如果拉取请求中不包括
O
,这并不是真正致命的,但这将取决于您找到合适的替代品,并定义其工作方式等等。)

关于提交需要知道什么 现在,关于提交散列ID的第一件事是它指定一个特定的提交,每个提交都是所有文件的完整快照。这根本不是一系列的变化!这只是一种状态,就像宣布今天外面的温度是68华氏度(20摄氏度)。这本身并不能告诉你昨天或上周发生了什么。若要将状态转换为更改,必须选择其他状态进行比较。如果昨天是77˚F(25˚C),那么变化是9˚F(5˚C)

我们对Git中的提交做同样的事情:我们选择一种状态,比如
C
——并将其与以前的某个状态进行比较。但是我们刚才说实际的前一个状态是
A
,而记录的前一个状态是
O
。如果你比较
C
O
,你会得到与比较
C
a
不同的答案,当然除非
a
=
O

但这不是承诺的唯一内容。每次提交还记录零个或多个父提交哈希ID,通常正好是1,其次最常见的是合并提交的2个。(零父项表示提交是根提交;通常每个存储库只有一个,用于第一次提交。三个或三个以上是八达通合并。)
C
的父项是各自的提交,也有父项,依此类推。考虑到父母,我们真正拥有的可能是这样的:

...--D--E--F--O--A   <-- B
         \     \
          G--H--C   <-- (pull requested at C)
...--D--E--F--A   <-- B
               \
                G--C   <-- (pull requested at C)
(请求总计为请“倒带”B,以便提交
A
O
消失)

如果需要另一个合并怎么办? 让我们再看看这个图表:

...--D--E--F--O--A   <-- B
         \     \
          G--H--C   <-- (pull requested at C)
但是GitHub还提供了另外两种方式来接受这个请求,每种方式都有不同的功能。如果提交
G
H
C
不在您的存储库中,则rebase和merge选项会生成以下图形:

...--D--E--F--O--A--G'-H'   <-- B
因此,
B
的当前值与发出拉取请求的人发出拉取请求时的
B
的旧值相同。也就是说,我们有
A
=
O
。如果使用GitHub上的默认“合并”按钮,您将得到以下结果:

...--D--E--F--A------M   <-- B
               \    /
                G--C
...--D--E--F--A--G'-C'   <-- B
...--D--E--F--A--S   <-- B
如果
G'
C'
提交是拉取请求者的
G
C
提交的副本:快照匹配,甚至
G'
的父提交ID也匹配
G
;不同的是散列ID:GitHub已经复制了
G
C
,尽管这样的复制没有意义。(例如,我希望GitHub根本没有制作这些副本。其他服务可能没有制作。)原始提交没有进入;相反,复印件要放进去

如果使用“挤压和合并”按钮,将得到以下结果:

...--D--E--F--A------M   <-- B
               \    /
                G--C
...--D--E--F--A--G'-C'   <-- B
...--D--E--F--A--S   <-- B
现在,您有一个名为
pr123
的分支,其提示提交为提交
C
,以及指向提交
a
的远程跟踪名称
origin/B

现在很容易判断
A...--D--E--F--A--G'-C'   <-- B
...--D--E--F--A--S   <-- B
git fetch origin   # update everything so that we have origin/B pointing to A, etc
git fetch origin refs/pull/123/head:refs/heads/pr123
if git merge-base --is-ancestor refs/remotes/origin/B refs/heads/pr123; then
    echo "it's the simple case, yay"
else
    echo "it's the merge case, boo"
fi
git diff-tree -r --name-status [options] refs/remotes/origin/B refs/heads/pr123