1. 程式人生 > >Git內部原理解析 | 解決git版本衝突

Git內部原理解析 | 解決git版本衝突

學一門語言或者技術,基本的過程是瞭解到熟悉掌握,再到剖析原理,原理對於理解是很有幫助,而且是巨大的,我個人發現學習這些內容對於理解 Git 的用處和強大是非常重要的,不過也有人認為這些內容對於初學者來說可能難以理解且過於複雜。

從根本上來講 Git 是一套內容定址 (content-addressable) 檔案系統,是一個簡單的鍵值對資料庫(key-value data store),我們用一個檔案來儲存 SHA-1 值,並給檔案起一個簡單的名字,然後用這個名字指標來替代原始的 SHA-1 值,對比快照,生成新版本的SHA-1數值,如下圖:
這裡寫圖片描述

Git的有點在於可以,時刻保持資料完整性,保持版本的獨立性,不受其他的分支所影響,Git 和其他版本控制系統的主要差別在於,Git 只關心檔案資料的整體是否發生變化,原理如下圖:

這裡寫圖片描述

這是 Git 同其他系統的重要區別。它完全顛覆了傳統版本控制的套路,並對各個環節的實現方式作了新的設計。Git 更像是個小型的檔案系統,但它同時還提供了許多以此為基礎的超強工具,而不只是一個簡單的 VCS。

Git還有一個點在本地處理資料,沒有過分依賴於網路,Git 可以通過兩種主要的方式在版本庫之間傳輸資料,dumb和smart協議兩種。

下面舉一個版本之間衝突的解決方法:(zhangyu_demand_tag -> sim)

git checkout sim (切換到sim分支)
git checkout -b sim_copy(sim複製一個分支)
git branch(檢視本地分支綠色為本地分支)

這裡寫圖片描述

git pull origin sim (更新程式碼,保證當前為最新分支 相當於svn up 命令)
git merge –no-ff zhangyu_demand_tag(合併分支,顯示失敗,合併中靈魂的一句命令)

備註:–no-ff指的是強行關閉fast-forward方式。fast-forward方式就是當條件允許的時候,git直接把HEAD指標指向合併分支的頭,完成合並。屬於“快進方式”,不過這種情況如果刪除分支,則會丟失分支資訊。因為在這個過程中沒有建立commit
git merge –squash 是用來把一些不必要commit進行壓縮,比如說,你的feature在開發的時候寫的commit很亂,那麼我們合併的時候不希望把這些歷史commit帶過來,於是使用–squash進行合併,此時檔案已經同合併後一樣了,但不移動HEAD,不提交。

–no-ff:不使用fast-forward方式合併,保留分支的commit歷史
–squash:使用squash方式合併,把多次分支commit歷史壓縮為一次

這裡寫圖片描述

git status (檢視衝突中的檔案)

這裡寫圖片描述
在Unmerged paths 裡,顯示的是衝突的檔名,解決衝突,合併

這裡寫圖片描述

有不明白的同學可以,私信我,看見第一時間回覆~