gpt4 book ai didi

Git octopus merge 多个分支的顺序

转载 作者:IT王子 更新时间:2023-10-29 00:53:44 24 4
gpt4 key购买 nike

我在使用 git 时发生了一件有趣的事情,想知道是否有人可以向我解释一下,以便我更好地理解。

merge 多个分支(A,B)时,

git merge A B

因为非快进而失败,而

git merge B A

效果很好。为什么会这样?

最佳答案

让我们假设 A 是严格的,direct child当前分支的。然后假设 B 是 A 的严格直接子级。

Octopus merge ,processes heads given as arguments from left to right相对于树递增,但相对于索引独立如果它尝试先应用 B 然后应用 A,则在没有冲突的情况下成功,但如果它执行交谈。

根据 git-merge 手册,MERGE STRATEGIES 部分:

octopus
This resolves cases with more than two heads, but refuses to do a
complex merge that needs manual resolution.

例如:

 ~                 $ git init testdir && cd testdir && echo "This is C" > myfile
Initialized empty Git repository in /home/huitseeker/testdir/.git/

~/testdir $ git add myfile && git commit -m "C"
[master (root-commit) f0c8c82] C
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 myfile

~/testdir(master) $ git checkout -b "A" && echo "This is A1" > myfile
Switched to a new branch 'A'
~/testdir(A) $ git commit -m "A1" myfile
[A ac5b51c] A1
1 files changed, 1 insertions(+), 1 deletions(-)

~/testdir(A) $ git checkout -b "B" && echo "This is B1" >> myfile
Switched to a new branch 'B'
~/testdir(B) $ git commit -m "B1" myfile
[B 5bc838c] B1
1 files changed, 1 insertions(+), 0 deletions(-)

~/testdir(B) $ git checkout master
Switched to branch 'master'
~/testdir(master) $ git merge B A
Fast-forwarding to: B
Already up-to-date with A
Merge made by octopus.
myfile | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)

~/testdir(master) $ git reset --hard HEAD^^^
HEAD is now at f0c8c82 C
~/testdir(master) $ git merge A B
Fast-forwarding to: A
Fast-forwarding to: B
error: Entry 'myfile' would be overwritten by merge. Cannot merge.
Merge with strategy octopus failed.

~/testdir(master) $ cat myfile
This is A1

的确,当快进到A时,master的标签并没有被推进,虽然树有。

 ~/testdir(master) $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: myfile
#

如果查看 Octopus merge 的代码,我手动执行此操作(查看上面的哈希值):

 ~/testdir(master) $ git reset --hard f0c8c82
HEAD is now at f0c8c82 C
~/testdir(master) $ git read-tree -u -m f0c8c82 ac5b51c
~/testdir(master) $ git read-tree -u -m f0c8c82 5bc838c
error: Entry 'myfile' would be overwritten by merge. Cannot merge.

在另一个方向(merge B A),现在,如果您再次查看 merge-octopus 的代码,它会尝试检测我们要添加的分支已经在树中( for 循环的第二个 case)。实际上,在 merge A 时,它发现 ac5b51c(又名 A 的头部)是 A 和 B 的共同祖先,并且在不执行第二个 read-tree 的情况下中止。

此行为与新版本的 git 一致:虽然我已指向 v.1.3.1,但我的版本仍会发生这种情况。

 ~/testdir(master) $ git --version
git version 1.7.5.4

tl;dr :您希望 Octopus merge 分支接触不同的文件

关于Git octopus merge 多个分支的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6520905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com