Git分支初學指南
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分支。
首先檢查下目前有什么分支:
D:\wrk\vladmihalcea\btm>git branch
master</pre>
我只有一個主線,所以創建一條新線來容納我的修改:
D:\wrk\vladmihalcea\btm>git checkout -b metrics Switched to a new branch 'metrics'
以上的命令干了兩件事:
- 創建了一條本地的metrics線
- 它將工作目錄切到這條新線
我們可以看到當前的分支指向改變了:
D:\wrk\vladmihalcea\btm>git branch2 master
metrics</pre>
通常在最后版本之前,你會做多次的commit。但為了簡化merge過程,你需要壓縮commit,就像這樣:
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/mih_vlad@yahoo.com</pre>
所有之前的改變都只存在我的本地庫,因此我要將它公開。這個過程叫創建遠程分支,是這樣做的:
D:\wrk\vladmihalcea\btm>git push --set-upstream origin metrics Username 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.</pre>
現在,我的metrics的本地分支都push到了遠程分支。
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 。
原文鏈接: java code geeks 翻譯: 伯樂在線 - unblock
譯文鏈接: http://blog.jobbole.com/60241/- [new branch] metrics -> metrics
Branch metrics set up to track remote branch metrics from origin.</pre>