Git的使用教程(八)分支管理

    分支並非Git特有,其他的諸如SVN的版本控制系統都有,但是創建和切換的速度實在不好恭維,因此逐漸的分支變成了擺設,無用武之地。Git則不同,不論是創建還是切換分支,那速度簡直是槓槓的,不少人評價Git的分支管理簡直是門藝術。既然Git的分支被誇得天上有地上無的,我們是不是得好好的認識下呢。

    什麼是分支?

    就像是樹木,有一個主幹,主幹可以生長出很多枝幹,每個枝幹還可以生出大量的小分支。Git的分支也是類似的情況,我們初始化倉庫的時候Git會生成一個分支master,我們可以在此基礎上創建大量的分支,分支上還可以創建分支。當然Git的分支跟樹木的分枝還是有些區別,首先Git各分支沒有主次之分,如果你不想要master分支也可以刪除,對於樹木的主幹我們可不能這麼任性,不過一般情況下我們默認使用master作爲主分支;其次,Git的分支可以合併,樹木的分枝可沒有get這麼高的技能。

    爲什麼要使用分支?

    爲了讓你的項目更加有條理。默認情況下Git只有唯一分支master,當然我們可以在這個分支上進行所有操作,不論是開發,測試還是修復BUG。但是隨着提交次數的日益增多,master的提交樹會越來越長,我們想要找到需要的版本也會越發困難。終於到了某一天,我們發現居然無法在這麼多提交找到我們需要的版本,那將會是一件多麼悲催的事情。因此我們需要分支來爲我們的各種提交操作分分類,開發操作在開發分支上進行,修復BUG的操作在修復BUG的分支上進行,各分支互不干擾,互不影響,當一個分支任務完成後,可以合併到其他分支,最終形成一個完整的項目。

 

    分支管理策略

    使用分支是毋庸置疑的,平時開發的時候應該使用哪些分支呢?

    主要分支

    master:默認的主分支,該分支上不應該進行開發操作,只保存能夠對外發布的版本。

    develop:開發分支,所有的開發操作都在該分支上進行。

    輔助分支

    feature:功能分支,當有一個新功能需要開發的時候,可以從develop分支上新建一個功能分支,該功能都在這個分支上進行開發。

    hotfixes:修補分支,也可以成爲BUG分支,程序出現BUG在所難免,修復BUG我們應該在BUG分支上進行。

    release:預發行分支,當程序開發到一定程度,沒有新功能要加入的時候,就可以進入預發行狀態,此時只需要對小BUG進行修復後就可以成爲發行版本。

    主要分支(master和develop)一般是我們開發的時候必備的,而輔助分支則看項目需求,上述列舉的幾個輔助分支都是我們開發的時候應該常會用到的,至於是否需要其他的輔助分支,可以根據自身項目情況酌情添加。

    如何使用分支?

    創建分支

 

git branch <branch-name>

在Git中創建一個分支非常容易,只需要輸入“git branch 分支名”即可。

    重命名分支

 

git branch -m <old-branch-name> <new-branch-name>

 

-m之後緊跟的是現有的分支名稱,最後纔是新的分支名稱,兩者位置不要弄錯了。

    切換分支

 

git checkout <branch-name>

對於git checkout相信大家不會陌生,當初在“管理修改”的教程中有使用過,不過當初checkout的作用是撤銷文件的修改狀態,參數中特意加了--,如果沒了--,就變成了今天我們要講的切換分支的命令了。

    創建並切換分支

 

git checkout -b <branch-name>

想要創建分支後就立刻切換,那就嘗試下上面的命令吧。

 

    合併分支(快速合併)

 

git merge <branch-name>

當某個分支的任務完成後,我們就可以把它合併到其他分支。默認的合併方式爲快速合併(Fast-forward)。

 

 

    分支衝突

如果合併分支和被合併分支對於同一文件進行了不同的修改,就會產生分支衝突,從而導致合併失敗。

    

Git會提示你哪些文件產生了合併衝突(例如上圖中的Merge conflict in dev就說明衝突出現在dev文件中),我們找到該文件進行修改。在該文件中會出現<<<<<<< HEAD,=======,>>>>>>> dev等字樣,其中<<<<<<< HEAD和======之間的部分就是當前版本對於衝突文件做出的修改,=======和>>>>>>> dev,就是要合併的分支對於衝突文件做出的修改,我們需要做的就是結合實際情況對該文件做出修改,完成後git add和git commit即可。<<<<<<< HEAD,=======,>>>>>>> dev這些內容只是爲了方便我們知道哪些版本對文件做了哪些修改,沒有任何實際意義,可以沒有顧忌的刪除。

   合併分支(非快速合併)

    剛纔我們嘗試過了快速合併,但是快速合併有一個缺點,就是沒有說明提交是否來自分支,例如我們在dev進行了一個提交,然後合併到master中,此時你通過git log能夠看出來那些提交是來自dev嗎?完全跟在master上提交沒有任何區別,如果此時我們刪除了dev,我們完全找不到dev分支存在過的痕跡。

    在使用git log的時候,我們看到了兩個新的參數,--graph,--abbrev-commit。使用--graph參數之後可以看到開頭多出一些 ASCII 字符串表示的簡單圖形,形象地展示了每個提交所在的分支及其分化衍合情況。使用--abbrev-commit之後,原本40個字符的commit id被縮短到了7個字符。

    如果想要避免這種情況,我們可以加上--no-ff參數,這個參數是禁止使用快速合併,順便加個-m,爲此次合併做個說明。

 

git merge --no-ff -m "commit info" <branch-name>

    使用--no-ff進行合併之後我們再來看看git log,果然有了一些變化。我們可以清楚的看到commit的記錄有了分支,證明有些提交操作是在分支上進行的。

     刪除分支(普通刪除)

 

git branch -d <branch-name>

當合並完成了,如果分支不在有價值,我們可以通過-d參數進行刪除。有一點需要說明,當你有多條分支的時候,例如master,dev,feature,hotfixes四條分支,只有dev分支合併了feature,其他分支沒有合併,那麼只能在dev分支下使用-d進行刪除操作,其他分支(master和hotfixes分支)進行刪除操作會報錯。

    刪除分支(強制刪除)

 

git branch -D <branch-name>

如果某個分支還未開發完成,但是不具備開發價值,我們就需要在不合並狀態下刪除該分支,但是如果不合並,使用-d就無法進行刪除操作。此時-D就派上用場了,它可以在分支沒有被合併的情況下強制刪除分支。

    查看分支

 

git branch      //查看本地分支
git branch -r   //查看遠程分支
git branch -a   //查看所有分支(本地+遠程)

 

    

    團隊協作

    如果開發需要多人協作,本地分支就不能滿足要求了,我們需要藉助遠程分支。

    拉取遠程分支

    當遠程倉庫裏有出現我們本地沒有的分支,我們就需要從遠程庫中拉取(假設我們已經使用git remote add添加了遠程倉庫osc-git)。

    狀況一:本地未建dev分支

 

git fetch osc-git dev
git branch --track dev osc-git/dev

上述兩個命令做了四件事,一拉取遠程分支dev到本地,二建立本地分支dev,三合併遠程分支dev到本地分支dev,四本地分支dev和遠程分支dev建立關係。

    狀況二:本地建立了分支dev

 

git fetch osc-git dev
git checkout dev
git merge osc-git/dev
git branch --set-upstream-to osc-git/dev

 

上述四個命令同樣做了四件事,一拉取遠程分支dev到本地,二切換到本地分支dev,三合併遠程分支dev到本地分支dev,四本地分支dev和遠程分支dev建立關係。

    注意事項

    --track和--set-upstream-to參數中的osc-git/dev是已經被git fetch拉取到本地的遠程分支,如果該遠程分支沒有拉取到本地,使用的時候會報錯,因此使用前應該使用git fetch拉取對應遠程分支到本地。

    推送遠程分支

 

git push osc-git dev

 

在遠程倉庫一節我們已經推送過master分支,其他分支的推送也是一樣。

    刪除遠程分支

刪除本地分支我們使用-d(或者-D)就行,但是本地分支刪除了,遠程分支還在,我們還想刪除遠程分支怎麼辦呢?很簡單,使用如下命令即可。

 

git branch osc-git :dev

或者

 

git branch osc-git --delete dev

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章