有人可以解释一下git range-diff的用法吗?

lmi*_*asf 8 git

Git版本2.19引入了git range-diff应该用于比较两个提交范围的版本.我一直在阅读文档,但我不明白这个新功能的目的是什么.

我检查了官方的Git文档,我无法理解它的语法(省略标志):

git range-diff ( <range1> <range2> | <rev1>...?<rev2> | <base> <rev1> <rev2> )
Run Code Online (Sandbox Code Playgroud)

什么是rev1rev2

有人可以解释它们何时有用我的意思是每个案例?

tor*_*rek 9

我还没有实际使用过呢,但他们是为了为在旧的改善git cherry*流分析/比较一些上游或下游的变化设定VS你现在所拥有的.为了使范围集有用,我们想要一些"这是我的提交"和"这里是他们的",尽可能简单地表达.

一个范围1范围2组woiuld写成,如:

git range-diff theirs~5..theirs ours~4..ours
Run Code Online (Sandbox Code Playgroud)

如果你有,例如:

          T1--T2--T3--T4--T5   <-- theirs
         /
...--o--*   <-- base
         \
          O1--O2--O3--O4   <-- ours
Run Code Online (Sandbox Code Playgroud)

O提交的"我们"和T提交的"他们".

但是,鉴于这种完全相同的配置,我们也可以写:

git range-diff theirs...ours    # or ours...theirs
Run Code Online (Sandbox Code Playgroud)

(注意三个点).(例如,这是与之一起使用的语法git rev-list --cherry-mark --left-right.)

或者,再次给出同样的情况,我们可以写:

git range-diff base theirs ours   # or base ours theirs
Run Code Online (Sandbox Code Playgroud)

base是他们和我们的停止点,避免不得不倒数5.

如果情况更复杂 - 如图中所示:

          X1--T1--T2--T3   <-- theirs
         /
...--o--*   <-- base
         \
          Y1--Y2--O1--O2--O3--O4   <-- ours
Run Code Online (Sandbox Code Playgroud)

无论三点还是base ours theirs那种语法都不起作用,所以两组范围(theirs~3..theirs ours~4..ours)最好.


Jus*_*dow 8

Range diff 在解决合并冲突(after rebasecherry-pick等)之后非常有用,尤其是当您有多个冲突的 commit并且您想确保在此过程中没有意外破坏某些内容时。

这是一种通常发生在您在一个分支中进行多次提交的情况。
假设我们有一个名为“our”的分支,我们的分支在 master 分支的后面:

m1-m2-m3-m4  <- "master" branch
  \
   o1-o2-o3  <- "our" current branch
Run Code Online (Sandbox Code Playgroud)

在变基之前,我们会备份我们的分支(只需创建一个名为“our_bkp”的副本分支)

git branch our_bkp
Run Code Online (Sandbox Code Playgroud)

然后我们开始与 master 进行 rebase

git rebase master
Run Code Online (Sandbox Code Playgroud)

并解决提交“o1”上的一些合并冲突...
注意:如果“o1”上的冲突文件也在“o2”或“o3”中使用/更改,
那么我们将不得不重新解决同样的合并冲突也发生在他们身上。

现在,让我们说在一个令人筋疲力尽的 rebase 过程之后,我们有这样的事情:

             _<- branch "master"
            /
 m1-m2-m3-m4-o1'-o2'-o3'  <- branch "our" (after rebase)
  \
   o1-o2-o3   <- branch "our_bkp"
   
Run Code Online (Sandbox Code Playgroud)

由于存在许多合并冲突,因此我们是否遗漏了某些内容并不清楚。

这就是范围差异的亮点。

为了确保我们没有错过任何更改或意外损坏任何东西,我们可以简单地将旧版本分支的提交与新版本进行比较:

git range-diff our_bkp~3..our_bkp our~3..our
Run Code Online (Sandbox Code Playgroud)

或者

git range-diff o1..o3 o1'..o3'
Run Code Online (Sandbox Code Playgroud)

如果差异仅与冲突部分有关,那么我们很好,除了它们之外没有改变任何东西。
但是如果我们看到其他一些意想不到的差异,那么我们或 git 做错了什么,我们需要修复它们。

笔记

  • 上面的两个 range-diff 命令都在做同样的事情。
  • o1..o3我的意思是这些提交,例如数:0277a5883d132bebdb34e35ee228f4382dd2bb7..e415aee3fa53a213dc53ca6a7944301066b72f24
  • ~3our_bkp~3说的git采取承诺,这是3在最后一个之前提交our_bkp分支。将数字替换为您在分支上的提交数量,当然不要忘记将分支名称替换为our_bkp您的备份分支名称。
  • 您可以将 range-diff 视为两个 diff-s 的差异。这样就更容易记住和理解它在做什么。

  • 很好的答案 - 正是我正在寻找的。我还制作了一个小包装脚本来自动执行此操作:https://github.com/kiprasmel/git-rebase-diff (3认同)