【Git】git merge 與 git rebase 使用選擇

1. 前言

在平時的開發中避免不了使用 git 來管理代碼,尤爲是多人協做開發時更是如此。git 使用很差輕則一堆亂七八糟的追蹤,重則 git push --force 覆蓋隊友代碼(那些年的強制推送與刪庫跑路),這一篇主要介紹一下代碼合併的兩個重要命令,git mergegit rebasegit

2. 操做前的準備

master 分支內容以下bash

index.text
// 內容
matser-1 // commit 內容 master-1
master-2 // commit 內容 master-2
master-3 // commit 內容 master-3
複製代碼

feature 分支內容以下app

index.text
// 內容
matser-1 // commit 內容 master-1
master-2 // commit 內容 master-2
|-- feature
|   |-- index.text
// index.text 內容
feature-1 // commit 內容 feature-1
feature-2 // commit 內容 feature-2
複製代碼

3. git merge

首先咱們切到 master 分支,而後在控制檯運行 git merge feature 命令。spa

這裏就是 commit 的信息了,咱們修改成 master-4,而後保存。而後再查看 git 記錄會發現以下圖。3d

git merge feature 會從重現 feature 分支上作的更改,從 master-2 到 feature-2,而後將其結果記錄成一個新的 commit 保存到 master 分支,同時也會以另外一條線記錄 feature 分支的提交記錄。code

若是咱們不想有這麼雜亂的提交,只想保持一個乾淨整潔的記錄,並且也不須要 feature 分支的提交記錄,那麼咱們可使用一個參數 --squash,這個參數能夠幫助咱們壓縮分支線。cdn

首先還原到上次提交: git reset HEAD^blog

而後再刪掉從 feature 分支 merge 過來的文件,再 merge 一下:git merge feature --squash,因而就有了下圖的結果。ip

而後 git status 查看。開發

git commit -m 'master-4' 提交。

這樣就達到了咱們想要的效果了。

4. git rebase

在使用 rebase 以前咱們也仍是切換回到上一次提交,git reset HEAD^,刪除多餘的文件,而後切換到 feature 分支,git reset HEAD^ 回到 feature-1 的提交。

此時 master 分支的提交是 master-一、master-二、master-3;feature 分支的提交是 master-一、master-二、feature-1。而後如今要在 feature 上開發 feature-2,可是缺乏了一個 master-3 的提交。

經過 rebase 來將 master-3 給拉下來。

輸入命令 git rebase master,而後看 git 的提交記錄。

神奇的事情發生了,master-3 竟然出如今了 feature-1 前面,這是爲何?

git-rebase - Reapply commits on top of another base tip

當前分支在其餘目標分支基礎上從新提交,通俗地講就是先講 feature-1 提交「取出來」,而後同步 master 分支,再講 feature-1 提交「放回去」。

此時咱們再加入 feature-2,git add feature/index.textgit commit -m 'feature-2',就獲得了下圖所示的結果。

咱們合併到 master 分支,git checkout mastergit rebase feature

爲了更明顯一點,咱們在 master 分支 rebase 前再進行一個 master-4 的提交。

在 master 分支裏的根目錄 /index.text 裏新增一行 master-5,而後 git add index.textgit commit -m 'master-4',獲得以下結果:

而後 git rebase feature

這裏就至關於把 master-4 提交先「取出來」,而後同步 feature 的提交到 master,再將 master-4 的提交「放回去」。最後獲得上圖的結果,追蹤了全部的提交,而且分支樹也是乾淨整潔的。

5. 總結

總的來講,git merge 是從兩個分支分離的時候開始合併,而後將功能分支的提交重現到主分支上,造成新的提交,同時也會在分支樹造成枝葉來記錄功能分支的提交,能夠經過 --squash 參數來壓縮。

git rebase 則是會先「取出」當前提交,再改變原有的分支基礎(會將兩個分支分離的地方進去往前的推動,達到同步),最後再將新的提交給「放回」到同步後的提交上。不會產生新的提交記錄,也不會歪曲分支樹。

如何選擇哪種方式呢?

這裏我在工做中的 git 結構是

  • master——主分支,須要追蹤每一次 develop 以及 hotfix 的提交。
  • develop——開發分支,須要記錄每個功能的開發,可是不須要 feature 分支各類小的提交,只需整合成一個 feature 便可。
  • feature—— 功能分支,我的在本地建立(多人協做時可能在遠端也有),用來開發單個功能,功能完成後合併到 develop 分支。在這裏可能本地會有不少的小的提交改動,可是 develop 分支不須要記錄追蹤。

因而就有了如下的選擇:

feature 分支上有大量雜亂細小可有可無的提交,在功能完成後,咱們須要整合到一個 commit 提交給 develop 分支。

1. 基礎

2. feature 分支 git rebase develop —— 変基同步 develop 可能其餘同事的提交。
3. develop 分支 git merge feature --squash —— 合併 feature 分支到 develop 分支,並壓縮提交造成整潔分支樹。
4. master 分支 git merge develop —— 合併 develop 分支到 master 分支,追蹤每個 develop 分支的功能提交。
相關文章
相關標籤/搜索