Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何在不破坏分支请求关系的情况下选择提交?_Git_Azure Devops - Fatal编程技术网

Git 如何在不破坏分支请求关系的情况下选择提交?

Git 如何在不破坏分支请求关系的情况下选择提交?,git,azure-devops,Git,Azure Devops,Cherry picking提交创建具有相同内容的新提交。如果我通过dev to test分支将cherry pick从dev分支转移到test分支,那么我cherry pick的提交将包括在下一个从dev分支到test分支的pull请求中,即使它们的内容已经添加到测试分支中 例如: 当前提交存在于分支中: dev: a-b-c-d-e-f test: a-b-c 然后我选择樱桃并快进: dev: a-b-c-d-e-f test: a-b-c-g(conten

Cherry picking提交创建具有相同内容的新提交。如果我通过
dev to test
分支将cherry pick从
dev
分支转移到
test
分支,那么我cherry pick的提交将包括在下一个从
dev
分支到
test
分支的pull请求中,即使它们的内容已经添加到测试分支中

例如:

当前提交存在于分支中:

dev:  a-b-c-d-e-f
test: a-b-c
然后我选择樱桃并快进:

dev:         a-b-c-d-e-f
test:        a-b-c-g(content of e)-h(content of f)
然后将新的提交添加到dev:

dev: a-b-c-d-e-f-i
我想实现三件事:

  • 来自dev的下一个pull请求将测试为仅拾取提交
    d-i
  • 测试历史看起来像
    测试:a-b-c-g-h-d-i
  • 能够跟踪测试与提交的关系
    e-f
    通过历史
  • 我怎样才能做到这一点?或者我应该重组git工作流程以防止此类事情发生

    下面是这个问题的一个现实例子:

    这是拉取请求的设置,红色框中的提交已经被选中到目标分支

    以下是由此产生的历史。橙色是来自cherrypick的提交。红色表示拉取请求的提交。红色提交没有关联的更改,并且完全重复橙色提交的消息

    以下是已完成的PR请求的详细信息。它以这两个提交为特征,这两个提交不应该存在,因为pull请求不应用这些提交所描述的更改

    当前情况:

    dev: a-b-c-d-e-f-i
    test      \g-h
    
    通常从开发人员向测试人员发送PR,然后合并:

    dev: a-b-c-d-e-f-i
    test      \g-h----\j  # j = h+i
    

    下面是我将如何描述合并后的测试分支

    test: a-b-c-g-h-j
    
    • r(j)=r(h)+r(i)
      作为关系,因为
      j
      是第一个父母
      h
      和第二个父母
      i
      的孩子
    • c(j)=c(d)+c(i)
      从文件内容开始,
      j
      表示文件内容状态,当与
      h
      的差异时,将等于与
      c
      +
      i
      f
      的差异

    现在,许多GitGUI软件决定以线性列表的方式显示内容,通常按逆时间顺序显示,如

    dev: a-b-c-d-e-f-----i
    test      \------g-h--\j
     | 
     V   # visually merged down to
         a-b-c-d-e-f.g.h.i-j
    
    这种表示形式在视觉上只是线性的,并不意味着这些提交是线性连接的。因此,您看到的是来自多个分支的提交的线性列表,而不仅仅是示例中的
    test
    分支
    test
    自己的历史很好,只有
    g-h
    ,而不是
    e-f

    如果您确实希望只显示一对
    g-h
    e-f
    ,那么,由于这是repo中所有分支的提交列表,因此需要从repo中删除其中一对。换句话说,您需要重写
    dev
    test
    分支的历史记录


    两个git命令可以执行这样的重写,
    reset
    rebase
    filter branch

    对于第2点,如何定义“look like”?根据我的观点,简单地做一个普通的公关会给你一个“看起来像”你所描述的结果。这个结果有什么问题?如果您错误地认为有两个额外的文件副本,好像它浪费了一些磁盘存储,那么rest保证它不会。在提交中以指针的形式跟踪文件。@hackape我想避免此版本的历史记录:
    test:a-b-c-g-h-d-e-f-I
    。当我执行拉取请求时,它特别显示了内容已经合并的提交。混乱的历史和像这样混乱的请求是我试图避免的。我很清楚这不会创建重复的文件。我仍然不明白你认为正常合并有什么错。它造成了什么混乱我刚刚创建了一个分支来测试这个。这是一本书。以红色突出显示内容已被cherrypick合并的提交。然后我从源分支发出了一个pull请求。用橘子采摘的樱桃。红色是来自PR的提交,它们没有关联的更改,它们复制了以前的提交消息。这里有两个问题:1)请求细节显示这些提交。2) 历史记录有两个空提交,其中包含与其他提交相同的消息。@Nomenator但您不能简单地说此类提交历史记录属于
    test
    分支,也不能暗示
    a-b-c
    链接关系。你给我看一些图形用户界面的屏幕截图。该软件决定如何以线性顺序列出这些提交,但不一定说,这样的提交可以从CLI中
    test
    @Nomenator的当前ref进行线性跟踪,如果键入
    git rev list--first parent test
    ,您会看到不同的结果thing@Nomenator现在,如果您真的希望在屏幕截图GUI中只显示
    e-f
    g-h
    对中的一个,那么必须重新编写分支
    dev
    test
    ,以便从其历史记录中删除2个提交。你想要吗?我明白了。谢谢你的解释。这只是两个拉请求,一个包含前两个提交,第二个如屏幕截图所示。我不确定Azure是否就是这样处理拉取请求的,这让它与众不同。不管是哪种方式,您的指导都非常有用,我深入了解了git存储库的结构,我将致力于改进项目的分支策略,以保持历史记录的整洁。