Git 什么';如果其中一个子要素分支合并为主要素分支,那么更新从该子要素分支获取的姐妹子要素分支的最佳方法是什么?

Git 什么';如果其中一个子要素分支合并为主要素分支,那么更新从该子要素分支获取的姐妹子要素分支的最佳方法是什么?,git,merge,Git,Merge,给定master->A,A->B1和A->B2 如果将B2合并到master中,那么更新B1的最佳方法是什么 我试图了解合并分支层次结构方面的最佳实践 什么是可接受的,什么是不可接受的(即,什么可能导致合并冲突或GitHub文件混乱更改选项卡) 什么时候按顺序重新合并是有意义的?什么时候直接合并是有意义的,无论是向后朝向主功能分支的功能分支,还是朝向主功能分支的功能分支,还是在功能分支的分支之间?我不确定我是否理解正确,但我想你是在问这种情况: B1 ,-o--o-

给定
master->A
A->B1
A->B2

如果将
B2
合并到master中,那么更新
B1
的最佳方法是什么

我试图了解合并分支层次结构方面的最佳实践

什么是可接受的,什么是不可接受的(即,什么可能导致合并冲突或GitHub文件混乱更改选项卡)


什么时候按顺序重新合并是有意义的?什么时候直接合并是有意义的,无论是向后朝向主功能分支的功能分支,还是朝向主功能分支的功能分支,还是在功能分支的分支之间?

我不确定我是否理解正确,但我想你是在问这种情况:

B1                ,-o--o--o
                 /
A             ,-o--o
             /      \         
B2          /        '-o--o
           /               \
master  --o--o--o-----------o--
其中A从主节点分支,B1和B2从A分支

我不认为有任何东西可以被描述为用抽象术语描述的问题的最佳实践,这在很大程度上取决于所涉及的所有分支的目的是什么

如果分支A表示某个功能的工作,打算进行其他提交,并在某个时候合并回主功能,那么我会质疑为什么B2合并到主功能而不是合并回A

如果A不表示某个特性的工作,但B1和B2表示,那么我认为B1可以合并到master中

如果B1从A分支出来的事实是一个问题,那么它可能会首先被重新设置到主节点上


归根结底,这个问题的答案取决于您的开发过程是什么样的,以及您在开发过程中如何使用分支。

我不确定我是否理解正确,但我想您是在询问这种情况:

B1                ,-o--o--o
                 /
A             ,-o--o
             /      \         
B2          /        '-o--o
           /               \
master  --o--o--o-----------o--
其中A从主节点分支,B1和B2从A分支

我不认为有任何东西可以被描述为用抽象术语描述的问题的最佳实践,这在很大程度上取决于所涉及的所有分支的目的是什么

如果分支A表示某个功能的工作,打算进行其他提交,并在某个时候合并回主功能,那么我会质疑为什么B2合并到主功能而不是合并回A

如果A不表示某个特性的工作,但B1和B2表示,那么我认为B1可以合并到master中

如果B1从A分支出来的事实是一个问题,那么它可能会首先被重新设置到主节点上

归根结底,这个问题的答案取决于您的开发过程是什么样的,以及您在开发过程中如何使用分支。

(从逻辑上讲,这应该是一个注释,但我需要格式化它,我不能在注释中这样做。另外,当然,它太长了。:-)

在(正确且向上投票)中,我们有以下图纸:

B1                ,-o--o--o
                 /
A             ,-o--o
             /      \         
B2          /        '-o--o
           /               \
master  --o--o--o-----------o--
我觉得有必要指出这张图有点误导人:它让人们认为最下面的一行提交是可以从
master
访问的提交,上一行是可以从
B2
访问的提交,第三行是可以从
a
访问的提交,最上面一行是可从
B1
访问的提交

我用了这个奇怪的短语,可以从,而不是更明显的词,on。为什么我们称提交为可访问的,而不只是说它们在哪个分支上

答案是提交通常同时在多个分支上进行。让我们给每个提交一个单字母的名称(从
C
开始,以避免
a
B
),并将分支名称移动到我最喜欢的位置,如下图所示:

             ,-E--F--G   <-- B1
            /
         ,-D--H   <-------- A
        /      \
       /        '-I--J   <-- B2
      /               \
...--C--K--L-----------M   <-- master
请注意,
git commit
更新了git知道的当前分支,因为
git checkout
HEAD
附加到分支名称上,因此它现在指向刚刚进行的新提交。新的提交指向提交we
git checkout
-ed,即在我们创建新的提交之前的当前提交

git merge
所做的是在当前commit now
N
和我们命名的commit之间找到合并基。如果我们说
git merge A
,那么名称
A
转换为commit
H
,因此git在图中找到commit
H
,在图中找到commit
N
,然后通过此图反向查找两个分支上的最佳公共commit和最佳commit。“Best”的意思是“最接近两端”,所以这里是commit
D

合并动作(to merge的动词部分)通过执行两个
git diff
命令,将提交的
N
H
D
组合在一起:

git diff --find-renames <hash-of-D> <hash-of-N>   # what we changed
git diff --find-renames <hash-of-D> <hash-of-H>   # what they changed
如果我们现在要求Git合并B1和B2,Git将遍历此图以找到最佳的“公共起点”。没有commit
O
,公共起点是commit
D
,但是有了
O
,公共起点是
H

在所有情况下,这些“普通”Git命令只是添加到图形中。如果是常规提交,则每个新提交都有一个父级;如果是合并提交,则有两个父级。添加的内容会改变图形的形状,而提交未来合并的合并将选择哪些合并作为其合并基础。因此,我们现在进行的合并是我们现在需要做的事情,但它们也是我们现在所做的事情,以使我们以后可能进行的合并更容易

有一些Git命令可以删除提交,方法是强制分支名称指向图中的其他(旧)位置,而不是向图中添加新的提交。
git reset
命令在这方面特别出色,但是
git rebase
也可以做到这一点:首先,它将一组提交复制到“新的和改进的”提交,然后将分支名称移动到指向刚刚复制的最后一个副本。已删除的提交
             ,-E--F--G--N--O   <-- B1 (HEAD)
            /  ,----------'
         ,-D--H   <-------- A
        /      \
       /        '-I--J   <-- B2
      /               \
...--C--K--L-----------M   <-- master