456成人影院在线观看_亚洲a毛片_日韩9999_伊人网老司机_一本免费视频_最近高清日本免费

IT之道-艾銻知道

您當前位置: 主頁 > 資訊動態 > 艾銻分享 >

這才是真正的 Git——分支合并-IT服務


2020-05-29 20:41 作者:admin

這才是真正的 Git——分支合并-IT服務

 
電腦運維 服務器維護,網絡運維,桌面運維,機房運維,無線改造等服務.電腦運維 高級工程師提供多種解決方案,滿足您所有的IT服務需求
 
“合并前文件還在的,合并后就不見了”、“我遇到 Git 合并的 bug 了” 是兩句經常聽到的話,但真的是 Git 的 bug 么?或許只是你的預期不對。本文通過講解三向合并和 Git 的合并策略,step by step 介紹 Git 是怎么做一個合并的,讓大家對 Git 的合并結果有一個準確的預期,并且避免發生合并事故。
小程序開發故事時間
在開始正文之前,先來聽一下這個故事。
如下圖,小明從節點 A 拉了一條 dev 分支出來,在節點 B 中新增了一個文件 http.js,并且合并到 master 分支,合并節點為 E。這個時候發現會引起線上 bug,趕緊撤回這個合并,新增一個 revert 節點 E'。過了幾天小明繼續在 dev 分支上面開發新增了一個文件 main.js,并在這個文件中 import 了 http.js 里面的邏輯,在 dev 分支上面一切運行正常。可當他將此時的 dev 分支合并到 master 時候卻發現,http.js 文件不見了,導致 main.js 里面的邏輯運行報錯了。但這次合并并沒有任何沖突。他又得重新做了一下 revert,并且迷茫的懷疑是 Git 的 bug。
 
兩句經常聽到的話:
—— ”合并前文件還在的,合并后就不見了“
—— ”我遇到 Git 的 bug 了“
相信很多同學或多或少在不熟悉 Git 合并策略的時候都會發生過類似上面的事情,明明在合并前文件還在的,為什么合并后文件就不在了么?一度還懷疑是 Git 的 bug。這篇文章的目的就是想跟大家講清楚 Git 是怎么去合并分支的,以及一些底層的基礎概念,從而避免發生如故事中的問題,并對 Git 的合并結果有一個準確的預期。
小程序開發如何合并兩個文件
在看怎么合并兩個分支之前,我們先來看一下怎么合并兩個文件,因為兩個文件的合并是兩個分支合并的基礎。
大家應該都聽說過“三向合并”這個詞,不知道大家有沒有思考過為什么兩個文件的合并需要三向合并,只有二向是否可以自動完成合并。如下圖
 
很明顯答案是不能,如上圖的例子,Git 沒法確定這一行代碼是我修改的,還是對方修改的,或者之前就沒有這行代碼,是我們倆同時新增的。此時 Git 沒辦法幫我們做自動合并。
所以我們需要三向合并,所謂三向合并,就是找到兩個文件的一個合并 base,如下圖,這樣子 Git 就可以很清楚的知道說,對方修改了這一行代碼,而我們沒有修改,自動幫我們合并這兩個文件為 Print("hello")。
 
接下來我們了解一下什么是沖突?沖突簡單的來說就是三向合并中的三方都互不相同,即參考合并 base,我們的分支和別人的分支都對同個地方做了修改。
 
小程序開發Git 的合并策略
 
了解完怎么合并兩個文件之后,我們來看一個使用 git merge 來做分支合并。如上圖,將 master 分支合并到 feature 分支上,會新增一個 commit 節點來記錄這次合并。
Git 會有很多合并策略,其中常見的是 Fast-forward、Recursive 、Ours、Theirs、Octopus。下面分別介紹不同合并策略的原理以及應用場景。默認 Git 會幫你自動挑選合適的合并策略,如果你需要強制指定,使用git merge -s <策略名字>
了解 Git 合并策略的原理可以讓你對 Git 的合并結果有一個準確的預期。
小程序開發Fast-forward
 
Fast-forward 是最簡單的一種合并策略,如上圖中將 some feature 分支合并進 master 分支,Git 只需要將 master 分支的指向移動到最后一個 commit 節點上。
 
Fast-forward 是 Git 在合并兩個沒有分叉的分支時的默認行為,如果不想要這種表現,想明確記錄下每次的合并,可以使用git merge --no-ff。
小程序開發Recursive
Recursive 是 Git 分支合并策略中最重要也是最常用的策略,是 Git 在合并兩個有分叉的分支時的默認行為。其算法可以簡單描述為:遞歸尋找路徑最短的唯一共同祖先節點,然后以其為 base 節點進行遞歸三向合并。說起來有點繞,下面通過例子來解釋。
如下圖這種簡單的情況,圓圈里面的英文字母為當前 commit 的文件內容,當我們要合并中間兩個節點的時候,找到他們的共同祖先節點(左邊第一個),接著進行三向合并得到結果為 B。(因為合并的 base 是“A”,下圖靠下的分支沒有修改內容仍為“A”,下圖靠上的分支修改成了“B”,所以合并結果為“B”)。
 
但現實情況總是復雜得多,會出現歷史記錄鏈互相交叉等情況,如下圖:
 
當 Git 在尋找路徑最短的共同祖先節點的時候,可以找到兩個節點的,如果 Git 選用下圖這一個節點,那么 Git 將無法自動的合并。因為根據三向合并,這里是是有沖突的,需要手動解決。(base 為“A“,合并的兩個分支內容為”C“和”B“)
 
而如果 Git 選用的是下圖這個節點作為合并的 base 時,根據三向合并,Git 就可以直接自動合并得出結果“C”。(base 為“B“,合并的兩個分支內容為”C“和”B“)
 
作為人類,在這個例子里面我們很自然的就可以看出來合并的結果應該是“C”(如下圖,節點 4、5 都已經是“B”了,節點 6 修改成“C”,所以合并的預期為“C”)
 
那怎么保證 Git 能夠找到正確的合并 base 節點,盡可能的減少沖突呢?答案就是,Git 在尋找路徑最短的共同祖先節點時,如果滿足條件的祖先節點不唯一,那么 Git 會繼續遞歸往下尋找直至唯一。還是以剛剛這個例子圖解。
如下圖所示,我們想要合并節點 5 和節點 6,Git 找到路徑最短的祖先節點 2 和 3。
 
因為共同祖先節點不唯一,所以 Git 遞歸以節點 2 和節點 3 為我們要合并的節點,尋找他們的路徑最短的共同祖先,找到唯一的節點 1。
 
接著 Git 以節點 1 為 base,對節點 2 和節點 3 做三向合并,得到一個臨時節點,根據三向合并的結果,這個節點的內容為“B”。
 
再以這個臨時節點為 base,對節點 5 和節點 6 做三向合并,得到合并節點 7,根據三向合并的結果,節點 7 的內容為“C”
 
至此 Git 完成遞歸合并,自動合并節點 5 和節點 6,結果為“C”,沒有沖突。
 
Recursive 策略已經被大量的場景證明它是一個盡量減少沖突的合并策略,我們可以看到有趣的一點是,對于兩個合并分支的中間節點(如上圖節點 4,5),只參與了 base 的計算,而最終真正被三向合并拿來做合并的節點,只包括末端以及 base 節點。
需要注意 Git 只是使用這些策略盡量的去幫你減少沖突,如果沖突不可避免,那 Git 就會提示沖突,需要手工解決。(也就是真正意義上的沖突)。
Ours & Theirs
Ours 和 Theirs 這兩種合并策略也是比較簡單的,簡單來說就是保留雙方的歷史記錄,但完全忽略掉這一方的文件變更。如下圖在 master 分支里面執行git merge -s ours dev,會產生藍色的這一個合并節點,其內容跟其上一個節點(master 分支方向上的)完全一樣,即 master 分支合并前后項目文件沒有任何變動。
 
而如果使用 theirs 則完全相反,完全拋棄掉當前分支的文件內容,直接采用對方分支的文件內容。
這兩種策略的一個使用場景是比如現在要實現同一功能,你同時嘗試了兩個方案,分別在分支是 dev1 和 dev2 上,最后經過測試你選用了 dev2 這個方案。但你不想丟棄 dev1 的這樣一個嘗試,希望把它合入主干方便后期查看,這個時候你就可以在 dev2 分支中執行git merge -s ours dev1。
Octopus
這種合并策略比較神奇,一般來說我們的合并節點都只有兩個 parent(即合并兩條分支),而這種合并策略可以做兩個以上分支的合并,這也是 git merge 兩個以上分支時的默認行為。比如在 dev1 分支上執行git merge dev2 dev3。
 
他的一個使用場景是在測試環境或預發布環境,你需要將多個開發分支修改的內容合并在一起,如果不用這個策略,你每次只能合并一個分支,這樣就會導致大量的合并節點產生。而使用 Octopus 這種合并策略就可以用一個合并節點將他們全部合并進來。
Git rebasegit
rebase 也是一種經常被用來做合并的方法,其與 git merge 的最大區別是,他會更改變更歷史對應的 commit 節點。
如下圖,當在 feature 分支中執行 rebase master 時,Git 會以 master 分支對應的 commit 節點為起點,新增兩個全新的 commit 代替 feature 分支中的 commit 節點。其原因是新的 commit 指向的 parent 變了,所以對應的 SHA1 值也會改變,所以沒辦法復用原 feature 分支中的 commit。(這句話的理解需要這篇文章的基礎知識)
 
對于合并時候要使用 git merge 還是 git rebase 的爭論,我個人的看法是沒有銀彈,根據團隊和項目習慣選擇就可以。git rebase 可以給我們帶來清晰的歷史記錄,git merge 可以保留真實的提交時間等信息,并且不容易出問題,處理沖突也比較方便。唯一有一點需要注意的是,不要對已經處于遠端的多人共用分支做 rebase 操作。
我個人的一個習慣是:對于本地的分支或者確定只有一個人使用的遠端分支用 rebase,其余情況用 merge。
rebase 還有一個非常好用的東西叫 interactive 模式,使用方法是git rebase -i。可以實現壓縮幾個 commit,修改 commit 信息,拋棄某個 commit 等功能。比如說我要壓縮下圖 260a12a5、956e1d18,將他們與 9dae0027 合并為一個 commit,我只需將 260a12a5、956e1d18 前面的 pick 改成“s”,然后保存就可以了。
 
限于篇幅,git rebase -i 還有很多實用的功能暫不展開,感興趣的同學可以自己研究一下。
總結
 
現在我們再來看一下文章開頭的例子,我們就可以理解為什么最后一次 merge 會導致 http.js 文件不見了。根據 Git 的合并策略,在合并兩個有分叉的分支(上圖中的 D、E‘)時,Git 默認會選擇 Recursive 策略。找到 D 和 E’的最短路徑共同祖先節點 B,以 B 為 base,對 D,E‘做三向合并。B 中有 http.js,D 中有 http.js 和 main.js,E’中什么都沒有。根據三向合并,B、D 中都有 http.js 且沒有變更,E‘刪除了 http.js,所以合并結果就是沒有 http.js,沒有沖突,所以 http.js 文件不見了。
這個例子理解原理之后解決方法有很多,這里簡單帶過兩個方法:1. revert 節點 E'之后,此時的 dev 分支要拋棄刪除掉,重新從 E'節點拉出分支繼續工作,而不是在原 dev 分支上繼續開發節點 D;2. 在節點 D 合并回 E’節點時,先 revert 一下 E‘節點生成 E’‘(即 revert 的 revert),再將節點 D 合并進來。
Git 有很多種分支合并策略,本文介紹了 Fast-forward、Recursive、Ours/Theirs、Octopus 合并策略以及三向合并。掌握這些合并策略以及他們的使用場景可以讓你避免發生一些合并問題,并對合并結果有一個準確的預期。



相關文章

IT外包服務
IT電腦維護外包IT電腦維護外包
網站建設與維護IT網站建設與維護
IT設備采購服務IT設備采購服務
IT基礎設施服務IT基礎設施服務
IT應用及數據服務IT應用及數據服務
IT管理及流程服務IT管理及流程服務
二維碼 關閉
主站蜘蛛池模板: 欧美黄色成人_91视频专区_亚洲一区福利视频_依依激情网_亚洲精品久久无码AV片银杏_亚洲AV国产AV一区无码_无码伊人久久大杳蕉中文无码_性色av蜜臀av牛牛影院 | 黄瓜视频入口永久免费观看_我朋友的妈妈在线_国产色片_国产精品300部_美女黄色在线_成人在线观看亚洲_999国产视频_亚洲av久播在线播放 | 精品国产色_天天宗合_国产乱国产乱_国内一级视频_亚洲国产高清在线播放_大香伊蕉在人线国产97_亚洲影院丰满少妇中文字幕无码_无码精品A在线观看无 | 亚洲国产成人高清在线播放_asian成熟肉图pics_老司机精品视频免费观看_又大又粗又爽免费视频a片_中文在线观看免费网站_最新日韩精品视频_亚洲欧洲日产国码无码久久99_一区二三区四区乱 | 久久99影院_香港a毛片免费全部播放_影音先锋女人AV鲁色资源网久久_欧美综合一区_日本簧片在线观看_免费网站www在线观看_www.天天干.com_午夜福利片国产精品 | 免费A级毛片高清视频哦哦_黑人巨茎美女高潮视频_日本精品一区二区三区在线播放_国产乱AⅤ一区二区三区_99av海角社区_剑来动漫高清在线观看_亚洲色图狠狠爱_成人淫片免费视频95视频 | 又大又硬又爽又黄又粗又长_精品一区二区三区91_91精产国品_久久99伊人_波多野中文字幕_日韩国产区_伊人短视频_999精品欧美一区二区三区黑人 | 五月天久久777_大帝av在线一区二区三区_99c视频色欲在线_中文字幕午夜精品一区二区三区_成人在线免费看_免费看黄色大全_亚洲午夜高清国产拍_天天狠天天情天天躁 | 男人天堂亚洲_av片免费_脱了内裤猛烈进入A片费_中文字幕亚洲视频_男操女视频免费_欧美日韩一区二区三区自拍_精品无码一区二区三区在线_黄色毛片免费观看 | vr成人片在线播放网站_免费高清一区二区三区_精品国产青草久久久久96_国产一级牲交高潮片16_欧美视频精品全部免费观看_japan白嫩丰满少妇videoshd_粉嫩av一区二区三区四区五区_亚洲日韩av无码一区二区三区人 | 里番精品3d一二三区_日本草逼_亚洲AV无码专区日韩乱码_日韩视频中文字幕精品偷拍_日韩精品亚洲一区_91国内精品白嫩初高生_中文字幕免费久久_99久久久久久久 | 久久婷婷色香五月综合缴缴情_精品无人区卡卡卡卡卡二卡三乱码_内射老阿姨1区2区3区4区_福利视频一区_天堂在线最新版_中文在线好最新版在线_国产学生av娇小av毛片_亚洲精品乱码久久久久久蜜桃 | 中国帅小伙gaysextubevideo_久久一区二区三_麻豆精品福利_久久亚洲国产精品五月天婷_男人精品天堂_色噜噜色狠狠狠狠狠综合色一_亚洲高清无码在线观看_JULIA无码中文一区 | yellow毛片_久久久久久久久免费_春药刺激国产老富婆露脸_九九久久精品一区_在线观看91av_色综合久久中文字幕无码_国产福利啪啪_福利色播 | 中国产一级a毛片四川女_欧美一级淫片a免费播放口_无码精品国产DVD在线观看9久_天堂一区二区三区_www.黄色国产_大伊香蕉精品一区视频在线_欧美精品亚洲人成在线观看_欧洲一级 | 少妇88久久中文字幕_久久a级毛片免费观看_国产成人精品日本亚洲网站_在线观看av一区二区_色悠久久久久久久综合网_国产免费踩踏调教视频_xxxx另类黑人_涩涩婷婷 | 中国裸体BBBBXXXX_麻豆福利影院_国产吹潮视频在线观看_无遮挡又黄又刺激又爽的视频_久久久综合亚洲色一区二区三区_2021亚洲va在线va天堂va国产_午夜666_国产成人亚洲精品无码综合原创 | 国产精品亚洲А∨无码播放不卡_国产欧美日韩在线播放_狂野欧美xxxx韩国少妇_男人插女人免费视频_中文字幕在线播放一区_91.九色视频_青青青视频自偷自拍_亚洲成人综合网站 | 国产又大又硬又粗_黄色一级片免费看_成年女人免费视频播放人_日日噜噜噜夜夜爽爽狠狠视频97_国产精品第100页_在线免费观看h视频_秀人顶级模特尤妮丝的最新视频_中文字幕在线观看亚洲日韩 | 亚洲宅男天堂_亚州欧美日韩_窝窝成人_岛国一级_成人国产一区_日本三区在线观看_日韩亚洲视频_99欧美视频 | 久色视频_a视频免费看_强插女教师AV在线_亚洲午夜免费福利视频_日韩第一精品_蜜桃久久精品一区二区_经典久久久_特黄A片女人亚洲一区小说 | 色狠狠av五综合久久久_四虎影院最新网址_国产精品久久久久久久模特_一区二区在线不卡_18禁黄网站禁片免费观看女女_91成人影院_色老大影院www.97uuu.com_精品区一区二区三 | 九一毛片_JAPANXXXⅩ日本人妻HD_久久精品国产久精国产爱_粉嫩av一区二区_青青草91久久久久久久久_在教室伦流澡到高潮H强圩动漫_337p粉嫩大胆噜噜噜_成人影院天天5g天天爽无毒影院 | 亚洲精品一区二区三区四区高清_亚洲熟妇久久精品_无码国产精品一区二区VR老人_一区二区三区免费看视频_国产精品国产a级_特级黄色毛片视频片子_日本黄色毛片_男人视频网站 | 一二三国产视频_91九色网址_动漫精品h_日韩不卡1卡2卡三卡免费网站2021_扒开双腿猛进入喷水高潮叫声_a一级黄色毛片_国产爽视频_久操精品在线观看 | 久久久久久国产精品免费_国产69精品久久久久乱码韩国_jizz国产免费观看_国内一级黄色大片_爱爱久久_日本激情网_超碰人人在线_51午夜精品视频 狼群社区WWW在线中文_精品国偷自产在线视频_人妻被中出不敢呻吟A片视频_99久久精品国产网站_九九在线视频_国产h片在线观看_国产美女被遭强高潮免费_欧洲vodafone精品性 | 国产无套无码AⅤ在线观看_成人一在线视频日韩国产_同性男男黄G片免费网站_天天干天天日夜夜操_女人和公猪交内射网站_国产玖玖在线视频_韩国日本中文字幕_欧美一级网 | 亚洲视频免费在线观看_国产一区三区三区_亚洲人在线观看视频_男人天堂网站_性高爱久久久久久久久久久dj_国产亚韩_插插插干干干_在线视频区 | 17C精品麻豆一区二区免费_97人妻熟女成人免费视频_亚洲在线中字幕_99久久毛片免费观看_我的性奴的肉玩具1一17心奴_国产精品久久777777毛茸茸_韩国一级毛片_日韩人妻少妇一区二区三区 | 国产成人在线播放免费视频_99免费在线观看视频_国产精品白浆在线观看无码专区_曰本不卡视频_国产91网站在线观看_精品国产黄_久久一二三四_japanese乱子xxxx | 久久久久影院美女国产主播_91大神一区二区_国产精品毛片一区二区在线_日本黄页网站免费观看_在线看毛片的网站_久久久久国产亚洲AV麻豆_免费精品在线视频_日本亲子乱子伦xxxx30路 | 2018av天堂在线视频精品观看_特级毛片aaaa级毛片免费_免费观看久久久_免费视频一区二区_大地资源在线视频在线观看_欧洲少妇性喷潮_精品亚洲va在线va天堂资源站_国产免费一区二区三区播放 久久综合久久精品_人人妻人人澡人人爽人人精品AV_97久久夜色精品国产九色_老司机深夜福利视频_无码人妻精品1国产婷婷_china直男gay国产_色妹子综合网_最近最新中文第一页 | 国产视频二区在线观看_久草在线免费资源_麻豆国产原创视频在线播放_久久五月丁香激情综合_亚洲精品国产福利_国产原创三级_一本一道在线人妻中文字幕_激情欲成人av在线观看av | 亚洲国产精品va在线看黑人动漫_亚洲精品乱码久久久久久国产主播_亚洲AV日韩AV国内_麻豆一区二区三区蜜桃免费_啊v视频在线_22222se男人的天堂_免看一级片_好看的国产精品视频 | 亚洲精品国产一区二_精品一区二区三区在线观看视频_黑人巨大跨种族VIDEO_羞羞视频日本动漫免费网站_亚洲视频国产视频_日韩欧美大片在线观看_99视频网_亚洲婷婷综合色高清在线 | 一区二区视频免费在线观看_色五月激情五月_久久露脸国产精品_天天干干夜夜_亚洲AV无码专区久久蜜芽_日韩av成人女同恋_大地在线资源_国产精品久久久久久一区二区三区 | 久久影院午夜片一区_中文字幕+乱码+中文乱码_情侣偷拍久久_亚洲欧洲日韩淙合久久_被猛男伦流澡到高潮h麻豆_国产学生系列一区二区三区_99av精品孕妇在线_狠狠爱ADY亚洲色 | 亚洲免费av一区二区三区_国产模特私拍视频再现_午夜小视频在线播放_久久爱成人网_亚洲av无码国产精品色午夜洪_亚洲欧美成AⅤ人在线观看_欧美亚洲视频一区二区_91.com在线 | 欧美高清FREEXXXX性_好大好硬好爽18禁视频_HEYZO无码综合国产精蜜臀_天天av综合_在线国产福利精品_亚洲另类伦春色综合妖色成人网_免费无套内谢少妇毛片A片软_免费不卡欧美自拍视频 | 欧美日韩精品视频一区二区在_欧美一级片网站_大地资源影院在线播放_亚洲bbw性色大片_小伙和少妇干柴烈火_少妇厨房愉情理伦片BD在线观看_精品一区二区三区日韩_91日日日 | 艳Z门照片无码AV_窝窝午夜精品一区二区_国产二区在线观看视频_97se亚洲综合在线_亚洲成av人无码不卡影片_国产午夜免费高清久久影院_在线播放免费av_亚洲精品中国国产嫩草影院美女 |
网络维护咨询
服务器维护咨询
弱电项目咨询
桌面维护咨询
其它业务咨询