帶你一步一步看懂Git圖譜

我在網上搜索了許多資料,都沒有找到Git圖譜的相關說明。無奈,只好本身分析整理了一些筆記,但願可以幫助你們看懂Git圖譜。git

什麼是Git圖譜?

Git圖譜常見於Git圖形化客戶端工具(包括SourceTree、Tortoise等)中,利用不一樣顏色的點、線結合時間軸按照必定規律,呈現項目的版本演進記錄。 bash

SourceTree中的Git圖譜
TortoiseGit中的Graph

這兩張圖片分別是SourceTree和TortoiseGit中的圖譜,看起來大同小異,實際也是如此。下面的全部示例我都將結合SourceTree這一工具來加以說明,有須要的同窗能夠到SourceTree官網下載。app

先看懂一點點

其實,我的以爲,大部分同窗並不是真的看不懂Git圖譜,只是感受上面的圖太過複雜而已!若是是這樣一個圖,就沒有人會看不懂了。分佈式

某個項目

雖然這個項目很簡單,但咱們仍是要明確一下,咱們使用的Git協做方式以下圖: 工具

repository.png

一個origin遠程倉庫,不直接在上面修改代碼,無數個本地倉庫,分別與origin遠程倉庫同步。下面的說明都默認基於一個遠程倉庫。學習

項目一說明:ui

1. 一個`master`分支
2. 一個本地倉庫
3. 一個開發者
複製代碼

基於此,咱們有可能得出下面的結論spa

  • 每個點表明一次提交記錄
  • 藍色的那條線表明master分支

是這樣嗎?設計

不一樣顏色的線到底表明什麼?

從圖上咱們能夠看出,每個點後面都有對應的commit message提交時間提交做者哈希值幾個主要信息,這些信息都是一一對應的,因此,能夠肯定:每個點表明一次提交記錄3d

可是,藍色的線表明master分支嗎,或者說,一條線表明一個分支嗎?咱們再看下圖:

只有一個 分支的項目

項目二說明:

1. 一個`master`分支
2. 兩個本地倉庫
3. 一個開發者
複製代碼

看出來了嗎?一樣只有一個分支,可是這個項目卻衍生出了一條紅色的線。因此,支線不必定表明分支,那支線爲何會出現呢?

與項目一不一樣的是,這裏有兩個本地倉庫,因此,能夠推斷出,應該是兩個倉庫的提交出現分歧時,才衍生了新的支線。這個時候,我想到了分佈式版本控制系統這個詞。在只有一種分支的狀況下,有多少個本地倉庫,就有可能衍生出多少條支線,從圖譜上看到的,實際是項目的分佈式進展狀況。

那麼,支線跟分支就沒有關係嗎?看下圖:

1.png

項目三說明:

1. 兩個分支 `local`和`master`
2. 一個本地倉庫
3. 一個開發者
複製代碼

看出來什麼了嗎?雖然支線不必定表明分支,可是,新建立一個分支必然會產生一條新的支線。可是,咱們應該要知道,不是由於新建立分支產生了支線,而是,咱們在分支上的改動與主線有分歧,纔出現了新的支線。有一個細節是,在剛剛建立完分支,而且提交改動的時候,支線並無出現,只有當切換分支,提交改動後,才產生新的支線。

這樣一來,上面的結論也許就不正確了,可是,咱們建立分支的目的不就是讓項目有一條新的支線走向嗎,若是建立分支,不改動代碼,那幹嗎要建立分支?

關於主線

再看下面的圖

local.png
dev.png

master.png

項目四說明:

1. 三個分支 `local`、`dev`和`master` 
2. 一個本地倉庫
3. 一個開發者
複製代碼

上面三個圖,是在當前沒有未提交的改動的狀況下,分別切換到localdevmaster 三個分支時候的圖譜。那是否是就肯定了

  • 藍色支線表明dev分支
  • 綠色支線表明local分支
  • 紅色支線表明master分支

之後的項目走向就很容易看明白了呢?

好吧,繼續往下看,當我進行了不少新的操做後的效果:

dev2.png

local2.png

master2.png

新的結論:

  • 藍色支線表明local分支
  • 綠色支線表明master分支
  • 紅色支線表明local分支
  • 黃色支線(哪兒冒出來的)表明dev分支

這裏有一個變化條件就是多了一個本地倉庫,實際開發中,常常是好幾我的開發同一個項目,本地倉庫也就相應的增長了,因此,每條顏色的支線不會固定表明某個分支,不一樣顏色的線可能表明同一個分支,這跟項目二的效果實際上是同樣的。

顏色雖然會變化,但有些東西卻不會變化,不變的這些東西,就是規律,也正是看懂Git圖譜的關鍵,也是這一節的主題——主線

項目最先的一次提交與最近的一次提交連成的最長的直線就是主線,也是惟一的一條直線,它的走向也就是時間軸的走向。主線上衍生支線,支線上又會衍生出新的支線。

總結

綜上所述,得出如下幾點:

  1. 新的分支commit的差別,產生了新的支線
  2. 同一分支,不一樣倉庫commit的差別,產生了新的支線
  3. 同一分支,不一樣倉庫的merge,合併了支線
  4. 不一樣分支的merge合併了支線

若是你知道,Git每次提交操做保存的提交對象包含了做者的姓名和郵箱、提交時輸入的信息以及指向它的父對象的指針(首次提交產生的提交對象沒有父對象,普通提交操做產生的提交對象有一個父對象,而由多個分支合併產生的提交對象有多個父對象),也就理解,爲何會呈現出這樣的圖譜了。

在實際工做中,Git圖譜的複雜致使咱們幾乎忽略了它的存在,何況咱們開發時也並不須要它,但咱們經過研究圖譜,加深對Git基礎設計的瞭解,仍是很是有意義的。

我的經驗有限,文章僅供分享學習,錯誤疏漏之處,歡迎指正

相關文章
相關標籤/搜索