?
This document uses PHP Chinese website manual Release
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
如果后者是前者的祖先,一個共同的祖先是另一個共同的祖先。一個沒有任何更好的共同祖先的共同祖先是a best common ancestor
,即a merge base
。請注意,一對提交可能有多個合并基礎(chǔ)。
作為最常見的特例,在命令行中只指定兩個提交意味著計算給定兩個提交之間的合并基礎(chǔ)。
更一般地說,在計算合并基數(shù)的兩個提交中,有一個由命令行上的第一個提交參數(shù)指定; 另一個提交是一個(可能是假設(shè)的)提交,它是命令行上所有其余提交的合并。
因此,merge base
如果指定了兩個以上的提交,則不一定包含在每個提交參數(shù)中。這與使用該--merge-base
選項時不同于git-show-branch [1] 。
--octopus
計算所有提交的提交的最佳共同祖先,準(zhǔn)備進(jìn)行n路合并。這模仿的行為git show-branch --merge-base
。
--independent
不是打印合并基礎(chǔ),而是使用相同的祖先打印提供的提交的最小子集。換句話說,在提交的提交中,列出那些無法從其他提供的提交。這模仿的行為git show-branch --independent
。
--is-ancestor
檢查第一個<commit>是否是第二個<commit>的祖先,如果為true,則退出狀態(tài)0,否則退出狀態(tài)1。錯誤通過不為1的非零狀態(tài)發(fā)出信號。
--fork-point
查找分支(或任何導(dǎo)致<commit>的歷史記錄)從另一個分支(或任何引用)<ref>分支的點。這不僅僅是尋找兩個提交的共同祖先,而且還考慮了<ref>的引用日志,以查看引用<commit>的歷史是否來自分支的早期化身<ref>(參見下面的這個模式)。
-a --all
輸出提交的所有合并基礎(chǔ),而不僅僅是一個。
給定兩個提交A
和B
,git merge-base A B
將輸出一個提交這從到達(dá)A
和B
通過父關(guān)系。
例如,對于這種拓?fù)浣Y(jié)構(gòu):
o---o---o---B /---o---1---o---o---o---A
A
和B
之間的合并基礎(chǔ)是1
。
鑒于三個提交A
,B
并且C
,git merge-base A B C
將計算之間的合并基礎(chǔ)A
和假設(shè)的承諾M
,這是之間的合并B
和C
。例如,對于這種拓?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
。這是因為合并相當(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
也是之間一個共同的祖先A
和M
,不過1
是一個更好的共同的祖先,因為2
是的祖先1
。因此,2
不是合并基礎(chǔ)。
結(jié)果git merge-base --octopus A B C
是2
,因為2
是所有提交的最佳共同祖先。
當(dāng)歷史涉及縱橫交錯時best
,兩個提交可以有多個共同的祖先。例如,對于這種拓?fù)浣Y(jié)構(gòu):
---1---o---A \ / X / \---2---o---o---B
兩個1
和2
是A的合并底座和B.既不一個比另一個(均為更好best
合并堿基)。如果--all
沒有給出選項,則沒有指定哪一個輸出最好。
檢查兩個提交A和B之間的“快速前進(jìn)”的常見方法是(或者至少用于)計算A和B之間的合并基礎(chǔ),并檢查它是否與A相同,在這種情況下,A是B的祖先。你會在老的腳本中看到這種習(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中,你可以用更直接的方式來說明這一點:
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
時,你的分支在它的頂部被啟動origin/master
。此模式使用reflog origin/master
來查找B3作為分叉點,以便topic
可以在更新origin/master
的基礎(chǔ)上重新綁定:
$ fork_point=$(git merge-base --fork-point origin/master topic)$ git rebase --onto origin/master $fork_point topic