?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
git-merge-base - 為合并找到盡可能好的共同祖先
git merge-base [-a|--all] <commit> <commit>… git merge-base [-a|--all] --octopus <commit>… git merge-base --is-ancestor <commit> <commit>git merge-base --independent <commit>… git merge-base --fork-point <ref> [<commit>]
git merge-base
在兩次提交之間找到最佳共同祖先以用于三向合并。better
如果后者是前者的祖先,一個(gè)共同的祖先是另一個(gè)共同的祖先。一個(gè)沒有任何更好的共同祖先的共同祖先是a best common ancestor
,即a merge base
。請(qǐng)注意,一對(duì)提交可能有多個(gè)合并基礎(chǔ)。
作為最常見的特例,在命令行中只指定兩個(gè)提交意味著計(jì)算給定兩個(gè)提交之間的合并基礎(chǔ)。
更一般地說,在計(jì)算合并基數(shù)的兩個(gè)提交中,有一個(gè)由命令行上的第一個(gè)提交參數(shù)指定; 另一個(gè)提交是一個(gè)(可能是假設(shè)的)提交,它是命令行上所有其余提交的合并。
因此,merge base
如果指定了兩個(gè)以上的提交,則不一定包含在每個(gè)提交參數(shù)中。這與使用該--merge-base
選項(xiàng)時(shí)不同于git-show-branch [1] 。
--octopus
計(jì)算所有提交的提交的最佳共同祖先,準(zhǔn)備進(jìn)行n路合并。這模仿的行為git show-branch --merge-base
。
--independent
不是打印合并基礎(chǔ),而是使用相同的祖先打印提供的提交的最小子集。換句話說,在提交的提交中,列出那些無法從其他提供的提交。這模仿的行為git show-branch --independent
。
--is-ancestor
檢查第一個(gè)<commit>是否是第二個(gè)<commit>的祖先,如果為true,則退出狀態(tài)0,否則退出狀態(tài)1。錯(cuò)誤通過不為1的非零狀態(tài)發(fā)出信號(hào)。
--fork-point
查找分支(或任何導(dǎo)致<commit>的歷史記錄)從另一個(gè)分支(或任何引用)<ref>分支的點(diǎn)。這不僅僅是尋找兩個(gè)提交的共同祖先,而且還考慮了<ref>的引用日志,以查看引用<commit>的歷史是否來自分支的早期化身<ref>(參見下面的這個(gè)模式)。
-a --all
輸出提交的所有合并基礎(chǔ),而不僅僅是一個(gè)。
給定兩個(gè)提交A
和B
,git merge-base A B
將輸出一個(gè)提交這從到達(dá)A
和B
通過父關(guān)系。
例如,對(duì)于這種拓?fù)浣Y(jié)構(gòu):
o---o---o---B /---o---1---o---o---o---A
A
和B
之間的合并基礎(chǔ)是1
。
鑒于三個(gè)提交A
,B
并且C
,git merge-base A B C
將計(jì)算之間的合并基礎(chǔ)A
和假設(shè)的承諾M
,這是之間的合并B
和C
。例如,對(duì)于這種拓?fù)浣Y(jié)構(gòu):
o---o---o---o---C / / o---o---o---B / /---2---1---o---o---o---A
結(jié)果git merge-base A B C
是1
。這是因?yàn)楹喜⑾喈?dāng)于拓?fù)涑兄ZM
之間B
和C
為:
o---o---o---o---o / \ / o---o---o---o---M / /---2---1---o---o---o---A
結(jié)果git merge-base A M
是1
。提交2
也是之間一個(gè)共同的祖先A
和M
,不過1
是一個(gè)更好的共同的祖先,因?yàn)?code>2是的祖先1
。因此,2
不是合并基礎(chǔ)。
結(jié)果git merge-base --octopus A B C
是2
,因?yàn)?code>2是所有提交的最佳共同祖先。
當(dāng)歷史涉及縱橫交錯(cuò)時(shí)best
,兩個(gè)提交可以有多個(gè)共同的祖先。例如,對(duì)于這種拓?fù)浣Y(jié)構(gòu):
---1---o---A \ / X / \---2---o---o---B
兩個(gè)1
和2
是A的合并底座和B.既不一個(gè)比另一個(gè)(均為更好best
合并堿基)。如果--all
沒有給出選項(xiàng),則沒有指定哪一個(gè)輸出最好。
檢查兩個(gè)提交A和B之間的“快速前進(jìn)”的常見方法是(或者至少用于)計(jì)算A和B之間的合并基礎(chǔ),并檢查它是否與A相同,在這種情況下,A是B的祖先。你會(huì)在老的腳本中看到這種習(xí)慣用法。
A=$(git rev-parse --verify A)if test "$A" = "$(git merge-base A B)"then ... A is an ancestor of B ...fi
在現(xiàn)代的git中,你可以用更直接的方式來說明這一點(diǎn):
if git merge-base --is-ancestor A B then ... A is an ancestor of B ...fi
代替。
在topic
創(chuàng)建分支之后git checkout -b topic origin/master
,遠(yuǎn)程跟蹤分支的歷史origin/master
可能已經(jīng)被重新卷繞和重建,導(dǎo)致這種形狀的歷史記錄:
o---B1 /---o---o---B2--o---o---o---B (origin/master) \ B3 \ Derived (topic)
在那里origin/master
用于指向提交B3,B2,B1,現(xiàn)在它指向B,并且當(dāng)你在B3 topic
時(shí),你的分支在它的頂部被啟動(dòng)origin/master
。此模式使用reflog origin/master
來查找B3作為分叉點(diǎn),以便topic
可以在更新origin/master
的基礎(chǔ)上重新綁定:
$ fork_point=$(git merge-base --fork-point origin/master topic)$ git rebase --onto origin/master $fork_point topic