git pull 預設的行為是將遠端的 repo. 與本地的 repo. 合併,這也是 DVCS 的初衷,將兩個 branch 合併。但是,很多時候會發生以下這種情形:

這是因為,我們團隊的開發模式是本地的 branch 和遠端的 branch 會同步地非常頻繁(通常就是同名稱的 branch,例如 master),這兩個 branch 幾乎是完全同步。這時候就會發現這些 merge 動作其實沒有必要,會造成線圖無謂的複雜。這時候,會推薦使用以下這個指令:

 git pull --rebase 

加上 rebase 的意思是,會先 1.把本地 repo. 從上次 pull 之後的變更暫存起來 2. 回復到上次 pull 時的情況 3. 套用遠端的變更 4. 最後再套用剛暫存下來的本地變更。詳細說明可以參考 pull with rebase

畫圖說明一下好了:

假設合併前是這樣:

      D---E master
/
A---B---C---F origin/master

使用 merge 合併後:

      D--------E
/ \
A---B---C---F----G master, origin/master

如果是 rebase 的方式,就不會有 G 合併點:

A---B---C---F---D'---E'   master, origin/master

注意到,其中 D’, E’ 的 commit SHA 序號跟本來 D, E 是不同的,因為算是砍掉重新 commit 了。

你會問說,有 conflict 怎麼辦? rebase 跟 merge 類似,出現 conflict 一會暫停 rebase 動作,需要你手動修復後,然後才可以繼續動作。這也是 rebase 比 merge 複雜一點的地方:merge 如果發生 conflict,你只需要解決衝突一次,然後 commit 出去就完成了。而 rebase 的 conflict 可能會發生在上述步驟 4 的每一次重新套用上,所以可能需要解決衝突好幾次 (rebase 時所謂的解決衝突,其實是直接修改你之前的變更內容,所以上圖中變成 D’ 跟 E’ )。

所以到底何時該用 merge? 何時可以 rebase? 你可能心理也有答案了,如果你修改比較多,預期會有較多的 conflict,建議用 merge (不過,如果是多次大範圍的主題式修改,那是不是應該一開始就多開一個 branch 來做呢?)。如果修改範圍較小,不太預期有 conflict,則建議可以加上 rebase 參數。

如果想要把 rebase 當做 git pull 的預設值,可以在專案的 .git/config 加上


[branch "master"]
remote = origin
merge = refs/heads/master
rebase = true

也可以直接加到 ~/.gitconfig 讓所有的 tracked branches 都自動套用這個設定:


[branch]
autosetuprebase = always

 

最新文章

  1. AutoMapper 最佳实践
  2. C++ 画星号图形——圆形(核心代码记录)
  3. 字符输入流Reader简要概括
  4. oGrid 初探
  5. CentOs of Tomcat commands
  6. 深入理解JavaScript的变量作用域(转载Rain Man之作)
  7. cocos2d lua的cclog 在logcat中显示
  8. java基础(二十二)线程
  9. 转载:修改xshell中文乱码的问题(管用)
  10. 基于 USB 传输的针式打印机驱动程序开发
  11. Cortex-M3 FLASH 日志文件系统
  12. [Cycle.js] Hello World in Cycle.js
  13. Axure快捷键大全
  14. 一般处理程序在VS2012中打开问题
  15. eclipse创建Maven父子结构Maven项目
  16. 第6周-接口、内部类与Swing
  17. 给虚拟机添加新硬盘并分区,fdisk查看分区,分区,重新读取分区表信息partprobe,格式化,挂载,查看分区挂载信息,自动挂载文件/etc/fstab,/etc/fstab文件错误导致重启崩溃后的修复
  18. C语言实现数据结构中的堆创建,堆排序
  19. HTML学习笔记4:文档申明和编码标签
  20. java 诊断工具——Arthas

热门文章

  1. JVM之对象回收
  2. C#上机实验(三)
  3. 攻防世界 reverse 进阶 1-4
  4. 5、Spring教程之依赖注入
  5. java例题_41 利用递归给猴子分桃
  6. Android学习之启动活动的最佳写法
  7. IT培训有哪些坑(三)?
  8. CQGUI框架之样式管理
  9. 「HTML+CSS」--自定义加载动画【009】
  10. [GDKOI2021] 普及组 Day2 总结