天天看點

「項目管理」常用的git送出變更操作原理介紹

作者:架構思考
之前分享了文章《「項目管理」一文讀懂Git工作流》,今天介紹常用送出變更操作的原理。

git的基本對象

git中有四種原子對象,由這四種原子對象構成了git高層資料結構的基礎。

塊(blob)

一個blob儲存一個檔案的内容資料,但不包括該檔案的中繼資料,甚至連檔案的名稱也沒有。

目錄樹(tree)

一個目錄樹代表一層目錄資訊,他記錄blob的辨別符、路徑名、目錄裡所有檔案的中繼資料。他可以依賴其他的樹/子樹對象,進而建立一個完整的包含檔案和子目錄的項目結構。

送出(commit)

一個送出對象儲存版本庫中每一次變化的中繼資料(作者,送出日期,message等等)。每一個送出對象指向一個目錄樹對象(該目錄樹是送出發生的那一刻的整個項目的目錄樹快照)。每一個送出(除了項目的第一次送出)還會指向他的父送出(前一次送出),由此根據送出間的引用能建構出一個完整的送出曆史。

标簽(tag)

一個标簽對象用于配置設定給其他對象,賦予其他對象一個人類可讀的名字(通常是一個送出對象)。

git commit

圖解git對象關系

一個送出

「項目管理」常用的git送出變更操作原理介紹

新增一個送出

「項目管理」常用的git送出變更操作原理介紹

一個新産生的送出,除了初始送出,都會指向一個父送出(即新送出之前的那次送出)。

git merge

圖解

「項目管理」常用的git送出變更操作原理介紹

如上圖發生一次feature→master的合并,在git中,合并産生一個新的樹對象(如S送出指向的樹對象),該樹對象包含合并之後的檔案,但它隻在目标分支(matser)上引入一個新的送出對象。

注意點

和普通送出不一樣的是,合并産生的送出會指向兩個父送出,如圖中的D,J。

git cherry-pick

使用場景

cherry-pick 指令通常用于把版本庫中一個分支的特定送出引入一個不同的分支中。

git cherrt-pick送出指令會在目前分支上應用給定送出引入的變更。這将引入一個新的獨特的送出。使用cherry-pick并不改變版本庫中的現有曆史記錄,而是添加曆史記錄。

圖解

如下圖,主幹分支正在開發中,在送出B處簽出分支fix進行修複操作,于此同時master分支在繼續往前開發。

「項目管理」常用的git送出變更操作原理介紹

上圖中涉及指令:

git checkout master
#逐個cherry-pick
git cherry-pick fix~2
git cherry-pick fix^
git cherry-pick fix
#或者批量
git cherry-pick fix~2..fix           

gitlab的cherry-pick

gitla提供了對mr的cherry-pick功能

使用方式

找到一個已經被合并的mr記錄,會看到頁面中有一個cherry-pick的按鈕

「項目管理」常用的git送出變更操作原理介紹

點選cherry-pick按鈕,選擇要cherry-pick的目标分支

「項目管理」常用的git送出變更操作原理介紹

根據選項,點選cherry-pick按鈕後,将建立一個mr還是直接進行cherry-pick。

圖解

假設feature分支在開發過程中,需要cherry-pick hotfix上的一些送出。

不生成mr的情況下cherry-pick

「項目管理」常用的git送出變更操作原理介紹

生成mr的情況下 cherry-pick

「項目管理」常用的git送出變更操作原理介紹

注意點

  1. 和merge操作不一樣,不會産生一條merge的送出記錄。
  2. 并不能保證cherry-pick後的代碼和fix上一樣(由于master在B送出後繼續演進,是以在cherry-pick時可能需要解決代碼沖突)。
  3. cherry-pick的沖突解決基于目标分支、原分支指定送出、原分支指定送出的父送出(被當做共同祖先)。

git revert

git revert的 原理和git cherrty-pick的原理相似,隻不過它是應用給定送出的逆過程。

使用場景

撤銷某個送出的改動内容

圖解

「項目管理」常用的git送出變更操作原理介紹

涉及指令:

git revert master~2           

git rebase

git rebase也叫”變基送出“,用來改變一串送出以什麼為基礎。

使用場景

git rebase一個常見的使用場景是保持你正在開發的一系列送出相對于另一個分支是最新的。

圖解

有兩個分支正在開發中,最初topic分支是從master分支的送出B處開始的。在此期間master分支已經進展到送出E

「項目管理」常用的git送出變更操作原理介紹

可以改寫送出讓他們基于送出E而不是送出B,這樣送出相對于master就是最新的了。

「項目管理」常用的git送出變更操作原理介紹

涉及指令:

git checkout topic
git rebase master
#或者
git rebase master topic           

注意事項

  1. 變基操作一次隻遷移一個送出,從各自原始送出位置遷移到新的送出基礎,是以每個移動的送出都有可能需要解決沖突。
  2. 在某個送出變基發生沖突時,可以選擇解決沖突或者跳過并開始遷移下一個送出(不建議)。

文章來源:東溪陳姓少年_https://juejin.cn/post/7039655930794868743

繼續閱讀