什么时候2个补丁在git中被认为相等?

当我读git rebase doc时出现了我的问题,

  

如果上游分支已经包含您所做的更改(例如,   因为您邮寄了在上游应用的补丁),那么   提交将被跳过。例如,在   以下历史记录(其中A'和A引入了相同的一组   更改,但提交者信息不同):

      A---B---C topic
     /
D---E---A'---F master will result in:

               B'---C' topic
              /
D---E---A'---F master

一种方法是使用git patch-id查看补丁ID,但这不是我想要的。

让我有2个分支。主题和主文件,我只更改其中的一个文件。

Inserted 2  ->  T2     M2 <--  Inserted 2 in new line
                |      |       
Inserted 1  ->  T1     M3 <-- Inserted 3 in new line
                  \   /
                   \ /
                    * <--  Contents similar here 

现在在T2和M2处,虽然我们在文件的两个版本的同一行中添加2,但补丁并不相同(发现这是git patch-id)。这个发现令我惊讶。我认为,如果将同一行中的相同内容应用于文件的2个不同版本,补丁将是相同的。

这使我认为该补丁程序也因此取决于我在其中应用补丁程序的上一次提交。那么,当我们说(某个分支上的patch1)=(其他分支上的patch2)时,那么他们的祖先也需要相同吗?如果是,我们可以递归地应用它,并且两个分支将完全相同,这是不合逻辑的。

所以,我的问题是,什么时候说2个补丁相等(不考虑patch-id)?

使用此脚本在本地复制以上内容:

#!/bin/bash

git init .
echo "10" >> 1.txt && git add . && git commit -m "1"

# Add 2 commits to master
echo "3" >> 1.txt && git commit -am "m3"
echo "2" >> 1.txt && git commit -am "m2"


#checkout topic branch
git checkout -b topic HEAD~2
echo "1" >> 1.txt && git commit -am "t1"
echo "2" >> 1.txt && git commit -am "t2"

#Show graph
git log --oneline --all --decorate --graph
owenlzhao 回答:什么时候2个补丁在git中被认为相等?

  

那么,当我们说(某个分支上的patch1)=(其他分支上的patch2)时,那么他们的祖先也需要相同吗?

不适用于git rebase,不可以。 Rebase使用与git patch-id相同的计算方法,这完全是对精简后的(区分行号和空格)差异文本进行哈希处理的结果。

git rev-list命令也可以执行此操作。请参见其--left-right--right-only--cherry-mark--cherry-pick选项,这些选项必须与对称差异三点符号提交选择器一起使用。

实际上,git rebase使用git rev-list来完成工作。在过去,git rebase主要是shell脚本时,很容易看到它是如何完成的。现在,它们全都以C代码构建,因此无需运行git rev-list,它具有与git rev-list相同的位。

  

...如果同一行中的内容相同 ...

,则认为补丁将是相同的

否,行号被删除。这是有意为之的:例如,修补程序可能像将通过false的调用替换为通过true的调用一样简单,对Git来说是

-    foo(false)
+    foo(true)

(在git diff的情况下,有一些周围的上下文-尚不清楚补丁ID是否包含上下文,但我认为是的)。假设上游正在接受此修复程序 ,而您正在使用的功能可能与该修复程序相关,也可能与之无关……但是上游,则调用{{ 1}}(位于第42行)现在位于第47行,因为在此点上方又添加了五个无关的行?

现在,Rebase应该并且确实会忽略此补丁,因为它存在于您要重新部署的上游,这是通过将foo传递给rebase的上游参数的对称差和{{ 1}}。所有左侧的提交均已计算其补丁程序ID。所有右侧的提交都具有计算的补丁ID。如果补丁ID匹配,则该提交被视为重复,并从要提交的提交集中删除。

本文链接:https://www.f2er.com/3165938.html

大家都在问