歡迎關注富途web開發團隊,缺人從眾
上週花了時間把futu web部落格分類,文章,入口搞了一下,主要為了解決SEO問題。接下來SEO好不好就看效果了。
今天分享的文章呢。小編覺得大家看圖就行。正文講的是Git分支合併命令merge和rebase的區別。
那麼在正文開始前,小編還是先送一些彩蛋吧。對於大家去理解Git命令挺有用的。
檔案狀態轉換:
檔案儲存:
上面這兩張圖會對大家理解Git命令有很大的幫助。
正文
在使用 git
進行版本管理的專案中,當完成一個特性的開發並將其合併到 master
分支時,我們有兩種方式:git merge
和 git rebase
。通常,我們對 git merge
使用的較多,而對於 git rebase
使用的較少,其實 git rebase
也是極其強大的一種方法。下面我們就來講一講 git merge
和 git rebase
的差別和在實際中的使用。
準備工作
為了更好地觀察執行 git merge
和 git rebase
之後發生的現象,我們首先來做一些準備工作,即建立一個專案倉庫,然後在其中構建兩條分支,再增加幾次提交。
具體如下:
- 建立一個目錄
gitTest
- 在目錄
myTest
中新建一個檔案readme.md
,隨便新增一個標題,和第一個列表項add master1
並提交到本地倉庫 - 在當前分支的基礎上新建一條分支,名為
feature
,將列表項add master1
修改為add feature1
並提交到本地倉庫 - 隨後切換到分枝
master
上新增一個新的列表項add master2
並提交到本地倉庫 - 隨後切換到分枝
feature
上新增一個新的列表項add feature2
並提交到本地倉庫 - 重複上面的步驟 4 和 5,直至在
master
和feature
上各新增了 4 條列表項
此時你的倉庫分支提交的記錄看起來應該是這樣的:
初始 master
分支內容應該是這樣的:
初始 feature
分支內容應該是這樣的:
git merge
從目錄 gitTest
拷貝出一份來,命名為 gitMerge
來進行我們的合併操作。
git merge
的使用方法很簡單,假如你想將分支 feature
合併到分支 master
,那麼只需執行如下兩步即可:
- 將分支切換到
master
上去:git checkout master
- 將分支
feature
合併到當前分支(即master
分支)上:git merge feature
如上圖所示,git merge
有如下特點:
- 只處理一次衝突
- 引入了一次合併的歷史記錄,合併後的所有
commit
會按照提交時間從舊到新排列 - 所有的過程資訊更多,可能會提高之後查詢問題的難度
為什麼講 git merge
提交的資訊過多可能會影響查詢問題的難度呢?因為在一個大型專案中,單純依靠 git merge
方法進行合併,會儲存所有的提交過程的資訊:引出分支,合併分支,在分支上再引出新的分支等等,類似這樣的操作一多,提交歷史資訊就會顯得雜亂,這時如果有問題需要查詢就會比較困難了。
使用 git merge
之後的分支提交記錄如下:
git rebase
git rebase 的合併操作
與 git merge
一致,git rebase
的目的也是將一個分支的更改併入到另外一個分支中去。
如上圖所示,他的主要特點如下:
- 改變當前分支從
master
上拉出分支的位置 - 沒有多餘的合併歷史的記錄,且合併後的
commit
順序不一定按照commit
的提交時間排列 - 可能會多次解決同一個地方的衝突(有
squash
來解決) - 更清爽一些,
master
分支上每個commit
點都是相對獨立完整的功能單元
那麼我們現在來具體操作一下,看看 git rebase
是如何做的。
首先,和 git merge
不同的是,你需要在 feature
分支上進行 git rebase master
的操作,意味著讓當前分支 feature
相對於 分支 master
進行變基:
可以看出,我們遇到了衝突,進行對比的雙方分別是 master
分支的最新內容和 feature
分支的第一次提交的內容,上圖下方紅框內容告訴我們,在我們解決了衝突之後,需要執行 git rebase --continue
來繼續變基的操作。
在解決衝突之後執行 git rebase --continue
時遇到了提示,看來我們首先需要把我們的修改存到暫存區,隨後再執行 git rebase --continue
。執行之後又遇到了衝突,這次是與 feature
分支的第二次提交進行對比出現的衝突,意味著我們需要多次解決同一個地方的衝突。
繼續重複先解決衝突,再 git rebase --continue
的步驟,直到遇到:
意味著完成了 feature
最後一次提交的變基操作,至此整個變基就完成了。
再來看看執行 git rebase
之後的 feature
分支:
完全符合上面所說的執行 git rebase
的特點,我們引出 feature
分支的位置變了,沒有多餘的提交歷史,且提交的時序也改變了,另外回憶一下,在我們執行變基的過程中也多次解決了同一個地方的衝突。
這個時候我們再切換到 master
分支上,將 feature
分支合併進來。
看得出來,feature
分支上的所有提交資訊都會被合併到 master
分支上了,這些資訊對我們來說不是必要的,我們在 masetr
分支上往往只需要知道合併進來了什麼新的功能即可,這些多餘的資訊可以通過 git rebase
的互動模式進行整合,下一節會講到這個。
git rebase 的互動模式
開啟變基的互動模式只需要傳入一個引數 -i
即可,同時還需要指定對哪些提交進行處理,如:
git rebase -i HEAD~4
複製程式碼
上述命令指定了對當前分支的最近四次提交進行操作。下面我們使用上面這行命令將 feature
分支的提交合並。
中間紅框內有一些命令,可以用來處理某次提交的,此處我們使用 squash
來將所有的 commit
合併成一次提交,編輯並儲存之後會出現編輯提交的資訊的提示,編輯提交即可。
此時再看 feature
分支上的提交記錄,會看到只有一次提交了。
此時無論是直接將分支合併到 master
還是先變基再合併,master
分支上的提交記錄都會十分清爽了。
總結
當需要保留詳細的合併資訊的時候建議使用git merge
,特別是需要將分支合併進入master
分支時;當發現自己修改某個功能時,頻繁進行了git commit
提交時,發現其實過多的提交資訊沒有必要時,可以嘗試git rebase
。