在平時的開發中避免不了使用 git 來管理代碼,尤爲是多人協做開發時更是如此。git 使用很差輕則一堆亂七八糟的追蹤,重則 git push --force 覆蓋隊友代碼(那些年的強制推送與刪庫跑路),這一篇主要介紹一下代碼合併的兩個重要命令,git merge
與 git rebase
。git
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
複製代碼
首先咱們切到 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'
提交。
這樣就達到了咱們想要的效果了。
在使用 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.text
,git commit -m 'feature-2'
,就獲得了下圖所示的結果。
咱們合併到 master 分支,git checkout master
,git rebase feature
。
爲了更明顯一點,咱們在 master 分支 rebase 前再進行一個 master-4 的提交。
在 master 分支裏的根目錄 /index.text 裏新增一行 master-5,而後 git add index.text
、git commit -m 'master-4'
,獲得以下結果:
而後 git rebase feature
這裏就至關於把 master-4 提交先「取出來」,而後同步 feature 的提交到 master,再將 master-4 的提交「放回去」。最後獲得上圖的結果,追蹤了全部的提交,而且分支樹也是乾淨整潔的。
總的來講,git merge 是從兩個分支分離的時候開始合併,而後將功能分支的提交重現到主分支上,造成新的提交,同時也會在分支樹造成枝葉來記錄功能分支的提交,能夠經過 --squash 參數來壓縮。
git rebase 則是會先「取出」當前提交,再改變原有的分支基礎(會將兩個分支分離的地方進去往前的推動,達到同步),最後再將新的提交給「放回」到同步後的提交上。不會產生新的提交記錄,也不會歪曲分支樹。
如何選擇哪種方式呢?
這裏我在工做中的 git 結構是
因而就有了如下的選擇:
feature 分支上有大量雜亂細小可有可無的提交,在功能完成後,咱們須要整合到一個 commit 提交給 develop 分支。
1. 基礎