git分支初學指南

unblock發表於2014-03-03

git的分支是“日常用品”,軟體的各種功能可在隔離的分支裡開發。這是合理的,因為合併的過程有時會不受控制。如果你在預設主線上開發,而一個提交了的功能被推遲使用,你就要在完全不一樣的功能上開發,而在此之前,你要還原你在主線上的修改。功能分支能讓你隔離變化並使合併的過程簡化,不過,一旦你開始使用功能分支,你就會發現命令列不再是無所謂的。想要正確地理解git併成功地使用它,就該首先掌握它的命令。

為什麼要git

專利軟體塑造了版本控制系統(VCS)來適應如下需求:

  1. 專案有嚴格的釋出時間
  2. 團隊是搭配好的的
  3. 有明確的主任務,沒什麼支線劇情
  4. 分支是為不同的發行版,或有風險的功能而準備的
  5. 集中的(原始碼)伺服器是與世隔絕的

以上是集中式VCS的誕生背景。但集中式VCS (例如 Subversion)對於開源專案的如下特點,就不適合了:

  1. 釋出時間不定
  2. 貢獻者可能遍佈全球
  3. 歡迎各種創意,不管它是徹底顛覆的,或是曠日持久的
  4. 分支是必須的,因為開發者們著眼於不同功能點,而非同一目標
  5. 程式碼全世界可見

git是軟體工程理念的精粹。如果工具不適合你的個案,你就自創工具。git是分散式版本控制系統(DVCS),用於解決開源專案與傳統VCS之間的阻抗失配。

UI像Tortoise SVN這樣的subversion是令人滿意的,我也很少用到他的命令列。基於主線的開發方式只需簡單的版本控制,所以在圖形化介面就能操作。

git有多種workflow styles可供選擇。你也可以繼續按使用基於主線的開發(這篇博文的程式碼例子就是這樣管理的),但如果你想為開源專案做貢獻,你就得熟悉一下“功能分支”。

為什麼要功能分支

git的分支是“日常用品”,軟體的各種功能可在隔離的分支裡開發。這是合理的,因為合併的過程有時會不受控制。如果你在預設主線上開發,而一個提交了的功能被推遲使用,你就要在完全不一樣的功能上開發,而在此之前,你要還原你在主線上的修改。功能分支能讓你隔離變化並使合併的過程簡化,不過,一旦你開始使用功能分支,你就會發現命令列不再是無所謂的。想要正確地理解git併成功地使用它,就該首先掌握它的命令。

一個功能分支的例子

我決定給Bitronix Transaction Manager 新增一個Metrics 支援,所以第一步就是新增一個metrics分支。

首先檢查下目前有什麼分支:

我只有一個主線,所以建立一條新線來容納我的修改:

以上的命令幹了兩件事:

  • 建立了一條本地的metrics線
  • 它將工作目錄切到這條新線

我們可以看到當前的分支指向改變了:

通常在最後版本之前,你會做多次的commit。但為了簡化merge過程,你需要壓縮commit,就像這樣:

所有之前的改變都只存在我的本地庫,因此我要將它公開。這個過程叫建立遠端分支,是這樣做的:

現在,我的metrics的本地分支都push到了遠端分支。

現在去github看下結果:

為了提醒產品所有者我做的貢獻,我們需要發個pull request。

產品所有者可以稽核我的修改,並決定是否和合適merge到主線。在稽核期間,他可能會叫你再作修改,才準merge,所以你要:

  1. 在本地metrics線commit新的修改
  2. 把新修改和就修改壓在一起
  3. 強push到遠端(例如 git push -f)

有個經驗法則,你不應經常將commit的歷史重寫。因為這會影響其他以你的分支為起點的貢獻者。但你的分支也不一定會被其他貢獻者使用。

想更瞭解git,你可以看下網上免費的Pro Git ,或者這個不錯的compact guide 。