为什么GitHub允许提前提交分支&;是否隐藏但不包含要合并的更改?

为什么GitHub允许提前提交分支&;是否隐藏但不包含要合并的更改?,git,github,git-diff,Git,Github,Git Diff,最近合并了一个分支,其中包含一个3行修复程序。第二天,提交了一个分支请求,其中包含3行修复的2行。在最初合并的分支后面,有几次提交。这棵树看起来像 A1--A2--A3-------B3--C4 \ \ / / \ A3--B3 / \ / A2------C3 因此B3将包含3行补丁,C3将包含2行补丁。当我去检查C4时,它显示提交的差异,尽管技术上没有差异。事实上,在执行交互式重新基址时,重新基

最近合并了一个分支,其中包含一个3行修复程序。第二天,提交了一个分支请求,其中包含3行修复的2行。在最初合并的分支后面,有几次提交。这棵树看起来像

A1--A2--A3-------B3--C4
     \   \      /   /
      \   A3--B3   /
       \          /
        A2------C3
因此B3将包含3行补丁,C3将包含2行补丁。当我去检查C4时,它显示提交的差异,尽管技术上没有差异。事实上,在执行交互式重新基址时,重新基址将停止并说这是一个空提交

我知道git允许合并空提交,但我感到困惑的是:

  • 为什么GitHub允许您合并(在某种程度上,git),而它通常不允许您在没有更改的情况下合并。我猜这与前面/后面的提交问题有关,但只是好奇根本原因是什么
  • 为什么git会显示没有差异的提交的差异(用双关语排序)
  • TL;博士 合并会影响提交图,因此根据定义,必须始终允许合并。一些请求合并的命令行命令可以作为非合并快进操作来执行,但是GitHub clicky按钮强制这些情况下进行真正的合并

    长的 你还没有回答我的评论问题,所以我必须在这里至少有一部分含糊不清或冗长。此外,我现在意识到您的图表中有两次
    A2
    A3
    、和
    B3
    ,这意味着您的图表是错误的,我们应该有,例如:

    A1--A2--A3-------B5--C4
         \   \      /   /
          \   B3--B4   /
           \          /
            C2------C3
    
    或许:

    A1--A2--A3-------B4--C4
         \   \      /   /
          \   ----B3   /
           \          /
            --------C3
    
    最后,在开始之前,从Git的角度来看,将这些东西标记为
    An
    Bn
    Cn
    s的序列并不是真正有用的,因为在查看和合并提交时,哪个分支包含提交是无关的。重要的是提交本身及其父/子关系分支名称仅适用于此处的人类。:-)让我把它重新画成:

    ...--A--B--C------H--I   <-- branchname
             \  \    /  /
              \  D--E  /
               \      /
                F----G
    
    branchname
    指向
    C
    时,然后:

    git merge --no-ff <identifier-selecting-E>
    
    我们可以运行
    git签出功能
    ,然后运行
    git-rebase-branchname
    (带或不带
    ——交互式
    )。Git将通过从
    G
    开始向后工作,从
    H开始向后工作,枚举从
    功能
    可访问的提交,而从
    分支名
    无法访问这些提交。这两个“向后工作”步骤在提交
    B
    时结合在一起,因此不会复制
    B
    ,也不会复制任何较早的提交。这样就可以按顺序复制提交的
    F
    G

    F
    的副本可能正好起作用,给出:

    ...--A--B--C------H   <-- branchname
             \  \    / \
              \  D--E   F'  <-- HEAD
               \
                F----G   <-- feature
    
    一切都完成了



    2
    git-rebase-i
    有一个额外的标志,
    --preserve
    -p
    ,声称保留合并。事实并非如此:它实际上重新执行合并。也就是说,它复制足够的提交来设置合并的条件,然后运行
    git merge
    来进行新的合并。如果您以前解决过冲突,那么您很可能不得不再次这样做。即使您以前不必解决冲突,此时也可能需要解决。如果您使用
    git-merge进行了早期合并--no-commit
    ,然后编辑内容,然后使用
    git-merge--continue
    git-commit
    ,以生成所谓的邪恶合并,git不知道您这样做了,并进行了一次新的非邪恶合并,从而消除了您的所有偷偷摸摸行为。如果这种偷偷摸摸的行为实际上是件好事,那么尽管有“邪恶合并”这个词,你还是会失去它。

    你如何看待提交
    C4
    ?(具体来说,您使用的是
    gitshow
    ,还是其他命令,或者GUI,或者其他什么?)
    ...--A--B--C------H   <-- branchname
             \  \    /
              \  D--E
               \
                F----G   <-- feature
    
    ...--A--B--C------H   <-- branchname
             \  \    / \
              \  D--E   F'  <-- HEAD
               \
                F----G   <-- feature
    
    ...--A--B--C------H   <-- branchname
             \  \    / \
              \  D--E   F'  <-- feature (HEAD)
               \
                F----G   <-- ORIG_HEAD