Git中的pull request真正比较的是什么?
前言
利用git版本控制工具時,我們通常會從主分支拉出新分支進(jìn)行開發(fā),開發(fā)完成后創(chuàng)建pr(也就是pull request),讓其他小伙伴幫忙review,確定代碼沒有問題后再將新分支合并到主分支上。但是,你真的理解pull request中比較的兩個分支到底是誰嗎?
下面以一個虛擬案例進(jìn)行說明:假設(shè)主分支名為“Master”,拉出來的新分支名為“developBrance1”。
注:圖中的箭頭指代工作推進(jìn)方向,而不是提交的指向(提交指向總是由當(dāng)前提交指向父提交,和這里的箭頭是反著的)
最簡單的情況
上圖中,我們從主分支Master的m1提交點(diǎn)拉出新分支developBranch1,然后在developBranch1分支上開發(fā)(開發(fā)過程中產(chǎn)生了d1、d2、d3共3個提交),開發(fā)完成后創(chuàng)建pr,然后經(jīng)過Review后將其合并到主分支上形成新的提交點(diǎn)N。自然而然地,我們創(chuàng)建pr時選擇的源和目標(biāo)為:
src[developBranch1] -> dest[Master]
我們期望pr比較的是developBranch1和Master這兩個分支的最新提交點(diǎn),pr實(shí)際比較的也是developBranch1的d3提交點(diǎn)和Master分支的m1提交點(diǎn)之間的差異。
增加一點(diǎn)復(fù)雜度
假設(shè)現(xiàn)在有其他小伙伴和你一同工作(這才是工作中的場景),另外一名小伙伴也從Master分支的m1提交點(diǎn)拉出分支developBranch2進(jìn)行開發(fā),并產(chǎn)生了若干提交,而且在我們開發(fā)完成之前已經(jīng)合并到了Master分支上:
現(xiàn)在我們創(chuàng)建pr時,源和目標(biāo)自然還是:
src[developBranch1] -> dest[Master]
但此時pr實(shí)際比較的是developBranch1和Master這兩個分支的最新提交點(diǎn)嗎(?developBranch1的d3提交點(diǎn)和Master分支的m2提交點(diǎn))?
答案:不是的。現(xiàn)在pr比較的其實(shí)是developBranch1的d3提交點(diǎn)和Master分支的m1提交點(diǎn),和上面最簡單的情況完全沒有差別!
?
其實(shí)pr的底層這樣實(shí)現(xiàn)非常有道理:
我們創(chuàng)建pr時,兩個分支比較的差異只是自己開發(fā)的內(nèi)容。試想,如果合作開發(fā)情況下比較developBranch1的d3提交點(diǎn)和Master分支的m2提交點(diǎn)之間的差異,那我們會同時看到其他小伙伴的開發(fā)內(nèi)容,你會想,這不是反應(yīng)了“最新工作進(jìn)度”嗎?不就是多看一個小伙伴的代碼嗎?好,再試想如果同時有很多人開發(fā),我們提交自己的代碼時,夾雜了許多其他小伙伴的代碼,你會不會因找不到自己開發(fā)的代碼而發(fā)瘋?
“最新工作進(jìn)度”的疑惑還在吧?下面來解答。
git是如何反映最新工作進(jìn)度的?
?其實(shí),git合并不同分支時,會自動取它們的并集,以保持最終工作進(jìn)度。就拿上圖說,如果developBranch1的d3提交點(diǎn)和developBranch2的o2提交點(diǎn)之間不存在沖突,兩者的開發(fā)工作最終都會在m3中體現(xiàn)(當(dāng)然,有沖突了就需要手動解決)。
現(xiàn)在還有一個問題,pr比較的原理是什么?
pr比較的是:
源分支的最近提交點(diǎn)和源分支和目標(biāo)分支的最近公共父提交節(jié)點(diǎn)之間的差異。在文中第二張圖中,可以看到源分支是developBranch1,目標(biāo)分支是Master,兩個分支的最近公共父提交節(jié)點(diǎn)是m1;所以最終比較的就是源分支的最近提交點(diǎn)d3和m1。
探索欲強(qiáng)的讀者也可以試試把不同分支分別作為pr的源和目標(biāo),觀察pr輸出的差異,以加深印象。
后記
其他更為復(fù)雜的分支pr原理類似,只是需要結(jié)合更為復(fù)雜的合并策略進(jìn)行分析。文中若有疏漏,歡迎指正補(bǔ)充。
好了,該去復(fù)習(xí)復(fù)習(xí)尋找兩節(jié)點(diǎn)最近公共父節(jié)點(diǎn)的原理了^_^
?
比較好的文章推薦
https://zhuanlan.zhihu.com/p/26227256
?
轉(zhuǎn)載于:https://www.cnblogs.com/xiaoxi666/p/9526896.html
總結(jié)
以上是生活随笔為你收集整理的Git中的pull request真正比较的是什么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elizabeth Taylor【伊丽莎
- 下一篇: IoC反转控制初步认识