精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

這才是真正的 Git——分支合并

企業動態
本文通過講解三向合并和 Git 的合并策略,step by step 介紹 Git 是怎么做一個合并的,讓大家對 Git 的合并結果有一個準確的預期,并且避免發生合并事故。

 “合并前文件還在的,合并后就不見了”、“我遇到 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”,沒有沖突。

 

[[328002]]

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 合并策略以及三向合并。掌握這些合并策略以及他們的使用場景可以讓你避免發生一些合并問題,并對合并結果有一個準確的預期。

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2020-03-05 16:47:51

Git內部儲存

2020-08-25 23:06:33

開發技能代碼

2016-12-16 19:06:02

擴展數據庫架構

2012-05-17 11:04:18

匈牙利命名法

2015-02-11 09:35:09

iPhone6

2015-08-17 13:19:55

大數據

2015-04-03 10:11:57

Windows 10免費

2021-01-19 05:44:53

危機面試技術

2025-04-02 02:12:00

用戶分析業務數據

2024-08-07 10:24:04

2025-03-05 00:01:00

用戶分層平均數消費

2023-06-16 11:54:59

數據分析項目

2022-11-29 11:31:19

商品分析商品銷售庫存

2024-05-10 12:01:00

商品分析數據分析斷貨

2022-11-14 11:55:39

數據分析項目

2025-09-28 01:00:00

2022-03-10 15:55:44

元宇宙VRVR辦公

2021-12-15 07:24:56

SocketTCPUDP

2017-10-16 15:33:35

微信APP小程序

2011-03-30 10:50:55

GitLinux 版本控制
點贊
收藏

51CTO技術棧公眾號

妖精视频在线观看| 蜜桃视频一区二区在线观看| 中文字幕手机在线视频| 欧美好骚综合网| 欧美一区二区黄| 久久精品视频16| 中日韩精品一区二区三区| 日韩电影免费观看高清完整版| 日本一区二区三级电影在线观看 | 二级片在线观看| 高清乱码毛片入口| 免费看日韩精品| 久久久免费观看视频| 国产jk精品白丝av在线观看| 国产精品视频一区二区三区综合 | 亚洲免费毛片| 91精品国产乱| 看欧美ab黄色大片视频免费| heyzo高清中文字幕在线| 国产亚洲综合色| 国产精品中出一区二区三区| 亚洲视频在线免费播放| 国产精品自拍区| 欧美成人欧美edvon| 超碰在线播放91| 亚洲一二三四| 亚洲第一主播视频| 国产人妻人伦精品| 欧美激情二区| 国产女同性恋一区二区| 国产一区自拍视频| 亚洲av无码一区二区三区性色| 日韩高清在线一区| 97avcom| 欧美成人手机视频| 久久视频在线| 国产一区二区日韩| 国产一线二线三线在线观看| 成人黄色动漫| 91理论电影在线观看| 97人人模人人爽人人少妇| 中文字幕永久免费视频| 免费黄色片在线观看| 男人的天堂av高清在线| 久久成人免费| 97超级碰碰碰| 成年人免费高清视频| 精品入口麻豆88视频| 在线视频国内一区二区| 亚洲精品国产精品国自产| 中文字幕一区二区三区免费看| 亚洲一区日本| 91爱视频在线| 久久99精品波多结衣一区| 亚洲黄色大片| 午夜精品久久17c| 国产中文字幕免费| 一区视频在线| 91精品国产乱码久久久久久蜜臀 | 亚洲一区二区偷拍| 四虎国产精品永久在线国在线| 欧美日韩久久一区二区| 91看片在线免费观看| 丁香婷婷久久| 欧美日韩国产另类一区| 久久6免费视频| 久久天堂久久| 精品久久人人做人人爰| 亚洲久久久久久| 日韩欧美影院| 欧美日本国产一区| 自拍偷拍一区二区三区四区| 日韩电影精品| 日韩一级二级三级精品视频| 国产吃瓜黑料一区二区| 欧美日韩导航| 伊人久久免费视频| 中文字幕乱妇无码av在线| 视频精品一区| 日韩国产在线播放| 女人十八毛片嫩草av| 婷婷激情图片久久| 久久久久五月天| 中文人妻av久久人妻18| 另类小说欧美激情| 国产成人亚洲欧美| 国产中文字幕在线看| 18欧美亚洲精品| 国产一级做a爰片久久毛片男| 国产黄色片在线播放| 中文字幕在线一区二区三区| 97碰在线视频| 亚洲成人av观看| 日韩欧美高清dvd碟片| 国产精品无码网站| 999久久久精品国产| 欧美精品成人在线| 国产suv精品一区二区33| 久88久久88久久久| 精品国产乱码一区二区三区四区| 番号集在线观看| 亚洲一区影音先锋| 天堂中文视频在线| а√中文在线天堂精品| 色综合影院在线| 日本一区二区不卡在线| 另类的小说在线视频另类成人小视频在线| av一区二区三区免费| 蝌蚪视频在线播放| 亚洲综合网站在线观看| 国产精品一二三在线观看| 美女av在线免费看| 91精品国产综合久久福利软件 | 日韩欧美综合| 7777精品久久久久久| www.99视频| 中文字幕乱码久久午夜不卡| 分分操这里只有精品| 日韩美女在线| 国产亚洲欧洲黄色| 日韩女同强女同hd| 国产凹凸在线观看一区二区| 亚洲综合网中心| 三上悠亚激情av一区二区三区| 精品乱人伦小说| 91香蕉视频污在线观看| 久久一本综合频道| 精品欧美国产| 电影k8一区二区三区久久| 777久久久精品| 极品蜜桃臀肥臀-x88av| 久久亚洲精品伦理| 精品一区二区三区国产| 国产网红女主播精品视频| 欧美午夜精品一区二区三区| 精品少妇人妻一区二区黑料社区| 婷婷成人影院| 久久免费观看视频| 亚洲第一色网站| 亚洲精品国产第一综合99久久| 无颜之月在线看| 日本成人一区二区| 中文字幕av一区中文字幕天堂| 国产精品免费精品一区| 99精品热视频| 国产极品粉嫩福利姬萌白酱| 成人av综合网| 97视频人免费观看| 亚洲 欧美 自拍偷拍| 天天综合色天天| 91精品小视频| 噜噜噜在线观看免费视频日韩 | 图片区偷拍区小说区| 午夜日韩电影| 成人午夜电影在线播放| 黄页网站大全在线免费观看| 日韩视频一区二区三区在线播放| 欧美性猛交xxxxx少妇| 国产精品一区二区x88av| 国产伦精品一区二区三区视频黑人| 在线免费av导航| 欧美成人aa大片| 国产亚洲精品久久久久久无几年桃| 国产成人综合视频| 人妻夜夜添夜夜无码av| 亚洲国产最新| 国产精品久久久久久久久久久新郎 | 玖玖在线播放| 亚洲欧美三级伦理| 这里只有精品国产| 亚洲欧美另类在线| 亚洲视频在线播放免费| 免费看亚洲片| 亚洲砖区区免费| 国产人与zoxxxx另类91| 国语自产在线不卡| 国产高清视频免费最新在线| 欧美日韩高清一区| 国产精品白浆一区二小说| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 国产中文字幕在线观看| 制服丝袜一区二区三区| 国产第100页| 欧美国产精品专区| 国产5g成人5g天天爽| 影音先锋一区| 手机成人在线| 亚洲精品国产九九九| 奇米4444一区二区三区| 美女黄视频在线观看| 亚洲成人av资源网| 亚洲无码精品国产| 亚洲观看高清完整版在线观看 | 一区二区三区四区激情| 免费a在线观看播放| 蜜桃视频在线一区| 男人天堂av片| 色综合久久网| 久久精品99| 国产精久久一区二区| 日本不卡免费高清视频| а√中文在线8| 亚洲新中文字幕| 黄色福利在线观看| 欧美喷潮久久久xxxxx| 国产成人在线观看网站| 国产精品色在线| 中出视频在线观看| 国产乱人伦精品一区二区在线观看| 久久无码高潮喷水| 国产精品大片| 亚洲一区美女| 国产一区二区观看| 国产在线精品二区| 日韩中文一区二区| 成人黄色激情网| 另类中文字幕国产精品| 777国产偷窥盗摄精品视频| 伊人222成人综合网| 少妇激情综合网| 可以在线观看的黄色| 亚洲精品999| 午夜精品久久久久久久91蜜桃| 欧美日韩中文一区| 成人免费毛片男人用品| 黄色一区二区三区| 国产在线综合网| 亚洲品质自拍视频网站| 国产在线免费av| 国产午夜亚洲精品午夜鲁丝片| 一级欧美一级日韩片| 高清在线观看日韩| 深夜福利网站在线观看| 激情图片小说一区| 日本不卡一区在线| 久久精品国产第一区二区三区| 日本精品一区二区三区四区| 亚洲免费黄色| 精品无码一区二区三区在线| 红桃视频国产精品| 妞干网视频在线观看| 欧美视频四区| www.avtt| 伊人蜜桃色噜噜激情综合| 精品无码一区二区三区爱欲| 在线日韩电影| a级黄色一级片| 99精品热6080yy久久| 欧美变态另类刺激| 欧美一级久久| 精品久久久久久久无码| 日本午夜一区二区| 伊人色在线观看| 国产成人免费视频网站高清观看视频 | 女人让男人操自己视频在线观看 | 久久伊人中文字幕| 波多野在线播放| 国产精品久久777777| 午夜国产福利一区二区| 亚洲美女视频一区| 国产无遮挡又黄又爽在线观看| 亚洲成av人片在线| 天天干天天色综合| 欧美日韩国产综合视频在线观看 | 国产一区二区三区在线播放免费观看| 青青草视频在线观看| 国产一区二区三区久久精品| 婷婷免费在线视频| 欧美成人性战久久| 欧美自拍偷拍一区二区| 亚洲美女喷白浆| 一级毛片视频在线| 久久99青青精品免费观看| 丁香花在线影院| 国产精品第三页| 国产亚洲久久| 精品无人区一区二区三区竹菊| 在线看成人短视频| 国产对白在线播放| 中文欧美日韩| 久热在线视频观看| 成人精品视频一区| 午夜影院黄色片| 亚洲综合精品久久| 日韩精品久久久久久免费| 欧美丰满少妇xxxbbb| 好吊色一区二区| 国产一区二区成人| 五月花成人网| 国产成人精品综合久久久| 欧美亚洲人成在线| 国产伦精品一区二区三区在线| 精品久久91| 人妻少妇精品久久| 另类调教123区| 亚洲国产第一区| 亚洲三级电影全部在线观看高清| 国产成人免费观看视频 | 999成人精品视频线3| 日本午夜激情视频| 久久99国产精品麻豆| 岛国精品资源网站| 亚洲天堂2014| 天堂网中文字幕| 精品国产一区二区三区忘忧草| 成人网视频在线观看| 国产视频精品免费播放| 黄色网址视频在线观看| 欧美在线不卡区| 在线精品国产亚洲| 中文字幕不卡每日更新1区2区| 国产精品久久久久久模特 | 国产极品粉嫩福利姬萌白酱| 国产乱国产乱300精品| xxxx日本黄色| 欧美日韩精品在线视频| 99热这里只有精品5| 中文字幕日韩欧美在线| 天堂а√在线最新版中文在线| 91视频网页| 午夜精品一区二区三区国产 | 在线日韩日本国产亚洲| 无遮挡爽大片在线观看视频 | 少妇高潮久久久| 欧美巨猛xxxx猛交黑人97人| 久久天天久久| 欧美精品一区二区视频| 亚洲日本视频| 日本在线不卡一区二区| 亚洲综合在线视频| 精品国产18久久久久久| 久久精品色欧美aⅴ一区二区| 中文字幕日本一区二区| 欧美午夜精品久久久久久蜜| 国产精品久久777777毛茸茸 | 九九在线视频| 欧美中文字幕第一页| 欧洲在线一区| 欧美日韩黄色一级片| 97久久久精品综合88久久| 亚洲黄色一区二区| 亚洲成色999久久网站| 成人福利影视| 国产欧美丝袜| 99精品国产在热久久下载| 欧美日韩人妻精品一区在线| 亚洲二区视频在线| 秋霞网一区二区| 97视频在线观看亚洲| 欧美成人基地| 欧美私人情侣网站| 国产色产综合产在线视频| 亚洲天堂五月天| 国产亚洲精品美女久久久| 亚洲爱爱视频| 自拍偷拍一区二区三区| 国产在线视视频有精品| 澳门黄色一级片| 亚洲成人性视频| 欧美freesex| 亚洲一区二区三区欧美| 国产一区二区三区高清播放| 久久久久亚洲av无码专区 | 噜噜噜在线视频| 欧美综合在线视频| 激情在线小视频| av激情久久| 久久精品国语| 久久爱一区二区| 精品久久免费看| 高清不卡亚洲| 国产福利片一区二区| 成人性生交大合| 国产成人精品777777| www国产精品视频| 成人午夜大片| 丁香婷婷激情网| 亚洲乱码精品一二三四区日韩在线| 亚洲国产综合一区| 日本韩国欧美精品大片卡二| 99热精品久久| 亚洲精品国产成人av在线| 在线精品视频小说1| av网站导航在线观看免费| 久久av二区| 精品一区二区三区免费观看| 国产亚洲欧美久久久久| 在线观看欧美日韩国产| 99久久香蕉| 在线观看免费黄网站| 亚洲香肠在线观看| 成人av毛片| 国产在线精品一区二区三区| 免费观看成人av| 日本午夜小视频| 久久久精品久久| 久久99国产精品视频| 老司机av网站| 欧美老年两性高潮| 大桥未久在线播放|