git的分支是“日常用品”,軟體的各種功能可在隔離的分支裡開發。這是合理的,因為合併的過程有時會不受控制。如果你在預設主線上開發,而一個提交了的功能被推遲使用,你就要在完全不一樣的功能上開發,而在此之前,你要還原你在主線上的修改。功能分支能讓你隔離變化並使合併的過程簡化,不過,一旦你開始使用功能分支,你就會發現命令列不再是無所謂的。想要正確地理解git併成功地使用它,就該首先掌握它的命令。
為什麼要git
專利軟體塑造了版本控制系統(VCS)來適應如下需求:
- 專案有嚴格的釋出時間
- 團隊是搭配好的的
- 有明確的主任務,沒什麼支線劇情
- 分支是為不同的發行版,或有風險的功能而準備的
- 集中的(原始碼)伺服器是與世隔絕的
以上是集中式VCS的誕生背景。但集中式VCS (例如 Subversion)對於開源專案的如下特點,就不適合了:
- 釋出時間不定
- 貢獻者可能遍佈全球
- 歡迎各種創意,不管它是徹底顛覆的,或是曠日持久的
- 分支是必須的,因為開發者們著眼於不同功能點,而非同一目標
- 程式碼全世界可見
git是軟體工程理念的精粹。如果工具不適合你的個案,你就自創工具。git是分散式版本控制系統(DVCS),用於解決開源專案與傳統VCS之間的阻抗失配。
UI像Tortoise SVN這樣的subversion是令人滿意的,我也很少用到他的命令列。基於主線的開發方式只需簡單的版本控制,所以在圖形化介面就能操作。
git有多種workflow styles可供選擇。你也可以繼續按使用基於主線的開發(這篇博文的程式碼例子就是這樣管理的),但如果你想為開源專案做貢獻,你就得熟悉一下“功能分支”。
為什麼要功能分支
git的分支是“日常用品”,軟體的各種功能可在隔離的分支裡開發。這是合理的,因為合併的過程有時會不受控制。如果你在預設主線上開發,而一個提交了的功能被推遲使用,你就要在完全不一樣的功能上開發,而在此之前,你要還原你在主線上的修改。功能分支能讓你隔離變化並使合併的過程簡化,不過,一旦你開始使用功能分支,你就會發現命令列不再是無所謂的。想要正確地理解git併成功地使用它,就該首先掌握它的命令。
一個功能分支的例子
我決定給Bitronix Transaction Manager 新增一個Metrics 支援,所以第一步就是新增一個metrics分支。
首先檢查下目前有什麼分支:
1 2 |
D:\wrk\vladmihalcea\btm>git branch * master |
我只有一個主線,所以建立一條新線來容納我的修改:
1 2 |
D:\wrk\vladmihalcea\btm>git checkout -b metrics Switched to a new branch 'metrics' |
以上的命令幹了兩件事:
- 建立了一條本地的metrics線
- 它將工作目錄切到這條新線
我們可以看到當前的分支指向改變了:
1 2 3 |
D:\wrk\vladmihalcea\btm>git branch2 master * metrics |
通常在最後版本之前,你會做多次的commit。但為了簡化merge過程,你需要壓縮commit,就像這樣:
1 2 3 4 5 6 7 8 9 |
commit f75838a7cf8cfdb9ceeb364a0f0faae24642d39e Author: vladmihalcea <mih_vlad@yahoo.com> Date: Thu Jan 23 11:57:16 2014 +0200 add metrics support (Codahale) add PoolingDataSource connection wait time histogram add PoolingDataSource in-use connections histrogram |
所有之前的改變都只存在我的本地庫,因此我要將它公開。這個過程叫建立遠端分支,是這樣做的:
1 2 3 4 5 6 7 8 9 10 11 |
D:\wrk\vladmihalcea\btm>git push --set-upstream origin metrics Username for 'https://github.com': vladmihalcea Password for 'https://vladmihalcea@github.com': Counting objects: 56, done. Delta compression using up to 4 threads. Compressing objects: 100% (32/32), done. Writing objects: 100% (34/34), 7.64 KiB | 0 bytes/s, done. Total 34 (delta 15), reused 0 (delta 0) To https://github.com/vladmihalcea/btm.git * [new branch] metrics -> metrics Branch metrics set up to track remote branch metrics from origin. |
現在,我的metrics的本地分支都push到了遠端分支。
1 2 3 4 |
D:\wrk\vladmihalcea\btm>git push Username for 'https://github.com': vladmihalcea Password for 'https://vladmihalcea@github.com': Everything up-to-date |
現在去github看下結果:
為了提醒產品所有者我做的貢獻,我們需要發個pull request。
產品所有者可以稽核我的修改,並決定是否和合適merge到主線。在稽核期間,他可能會叫你再作修改,才準merge,所以你要:
- 在本地metrics線commit新的修改
- 把新修改和就修改壓在一起
- 強push到遠端(例如 git push -f)
有個經驗法則,你不應經常將commit的歷史重寫。因為這會影響其他以你的分支為起點的貢獻者。但你的分支也不一定會被其他貢獻者使用。
想更瞭解git,你可以看下網上免費的Pro Git ,或者這個不錯的compact guide 。