雖然工做中要常用git,可是也就經常使用那麼幾個命令:pull、push、status、merge、rebase,對git談不上有多熟悉,加上工做性質不多和同事協同開發,即便出現問題,頂可能是刪除項目,從新遠程拉取。前幾天在頭條看到一篇講merge和rebase的區別的文章,感受蠻不錯的,就收藏了,今天發現要用到,想從新複習下,結果提示文章被刪除了,還好在百度快照裏找到了原文,這裏作下記錄。如下是原文內容:git
我從用git就一直用rebase,可是新的公司須要用merge命令,我不是很明白,因此查了一些資料,總結了下面的內容,若是有什麼不妥的地方,還望指正,我必定虛心學習。學習
標題上的兩個命令:merge和rebase都是用來合併分支的。spa
這裏不解釋rebase命令,以及兩個命令的原理,詳細解釋參考這裏。(這裏的鏈接可能被百度快照吃掉了)code
下面的內容主要說的是二者在實際操做中的區別。開發
分支就是便於多人在同一項目中的協做開發。比方說:每一個人開發不一樣的功能,在各自的分支開發過程當中互不影響,完成後都提交到develop分支。極大的提升了開發的效率。it
每一個人建立一個分支進行開發,當開發完成,須要合併到develop分支的時候,就須要用到合併的命令。效率
合併的時候,有可能會產生衝突。原理
衝突的產生是由於在合併的時候,不一樣分支修改了相同的位置。因此在合併的時候git不知道那個究竟是你想保留的,因此就提出疑問(衝突提醒)讓你本身手動選擇想要保留的內容,從而解決衝突。百度
處理衝突的方式:im
merge
命令合併分支,解決完衝突,執行git add .
和git commit -m'fix conflict'
。這個時候會產生一個commit。rebase
命令合併分支,解決完衝突,執行git add .
和git rebase --continue
,不會產生額外的commit。這樣的好處是‘乾淨’,分支上不會有無心義的解決分支的commit。git pull
和git pull --rebase
區別:git pull
作了兩個操做分別是‘獲取’和合並。因此加了rebase就是以rebase的方式進行合併分支,默認爲merge。
以一張圖的形式merge和rebase的區別展現:
總結:個人簡單理解——merge顯性的處理衝突,rebase隱性的處理衝突。
git merge
和git merge --no-ff
的區別我本身嘗試merge
命令後,發現:merge時並無產生一個commit。不是說merge時會產生一個merge commit嗎?
注意:只有在衝突的時候,解決完衝突纔會自動產生一個commit。
若是想在沒有衝突的狀況下也自動生成一個commit,記錄這次合併就能夠用:git merge --no-ff
命令,下面用一張圖來表示二者的區別:
個人理解:主要是看那個命令用的熟練,可以有效的管理本身的代碼;還有就是團隊用的是那種方式。
我對於rebase比較熟悉,因此我通常都用rebase
,可是如今的公司用的是merge --no-ff
命令合併分支。因此,我在工做上就用merge,我的項目就用rebase。
也能夠二者結合:
獲取遠程項目中最新代碼時:git pull --rebase
,這個時隱性的合併遠程分支的代碼不會產生而外的commit。
合併到分支的時候:git merge --no-ff
,自動一個merge commit,便於管理(這看管理人員怎麼認爲了)