1. 程式人生 > >Git-----Git中建立與合併分支

Git-----Git中建立與合併分支

Git中建立與合併分支

為什麼需要使用分支?

在總結Git中建立與合併分支前,我們必須要對為什麼使用分支,它有什麼用,為什麼不能在主分支上直接幹活,…. 等等一些列問題做一個闡述,不然我們都不知道用這個東西幹嘛,以及為什麼要用它。

這裡從兩點進行闡述:

一、分支的作用

分支的概念在各個版本控制系統中早已存在,分支對於團隊協作開發來說作用是非常大的,如:

  • 當一個專案還是1.0版時,開發團隊可能要同時進行1.1版和2.0版的開發,此時,程式碼就會出現較大分歧,這時就需要用到分支了,不同的任務組在各自不同的分支上開發,互相之間不會影響。

  • 需要向專案中新增一個新功能,一般的團隊都不會直接在主分支上修改而是新建一個branch,在上面更改程式碼,這樣做的好處一是保證主線程式碼的完整性和可用性,也就是說,主線上都是穩定的程式碼,可以直接拿來發布。二是避免出現其他問題。

  • 釋出是所有的功能模組的整合,分支可能是零散功能的半成品。

  • 萬一出現衝突很嚴重,或者出現各種情況而造成當前的分支出了問題,衝突解決起來很麻煩,如果有一個分支始終保留著最新的穩定版本,最多就是吧當前分支刪掉,從那個穩定分支重新分一支出來,這樣處理起來更方便。

  • 假設你準備開發一個新功能,但是需要兩週才能完成,第一週你寫了50%的程式碼,如果立刻提交,由於程式碼還沒寫完,不完整的程式碼庫會導致別人不能幹活了。如果等程式碼全部寫完再一次提交,又存在丟失每天進度的風險,又或者丟失向領導彙報工作進度的風險。有了分支後,你建立了一個屬於你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工作。

二、分支在Git上的特點

  • Git的技術可以說是非常強大,說一切開發都依賴於分支一點都不過分。一般專案的master分支都是穩定的程式碼,可以直接釋出或者被專案之外的人使用。

  • 新特性和BUG修改都在不同的分支上進行開發和測試,這樣規範了整個軟體的開發流程。

  • 分支之間的互不影響這種特性可以增加團隊合作的效率。

  • Git分支的另外一個重要特性就是可以合併不同軟體倉庫(fork)的分支。如:開發團隊有一個主軟體倉庫,開發者可以fork這個倉庫,相當於克隆了一個私有的軟體倉庫,然後開發者就可以在自己的軟體倉庫中建立分支並開發測試,測試完畢之後,可以向主軟體倉庫提交merge request,這樣新開發的特性就會被合併到主軟體倉庫的某個分支中。這種特性極大地推動了開源專案,多年前參加開源專案都是神話,自從Git出現後,每個人都可能成為開源專案的貢獻者,就是基於這種特性。

  • 其他版本控制系統如SVN等都有分支管理,但是用過之後你會發現,這些版本控制系統建立和切換分支比蝸牛還慢,讓人無法忍受,結果分支功能成了擺設,基本都不去用。但Git的分支是與眾不同的,無論建立、切換和刪除分支,Git在1秒鐘之內就能完成!無論你的版本庫是1個檔案還是1萬個檔案。

三、建立與合併分支

在版本回退裡中已經知道每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。
如果沒有建立過任何分支的情況下,Git中只有一個分支,叫主分支(即master分支)。

當我們建立新的分支,例如test時,Git新建了一個指標叫test,指向master相同的提交,再把HEAD指向test,就表示當前分支在test上。

  • 注:Git建立一個分支很快,因為除了增加一個test指標,改改HEAD的指向,工作區的檔案都沒有任何變化!

    假如我們在test上的工作完成了,就可以把test合併到master上。Git怎麼合併呢?最簡單的方法,就是直接把master指向test的當前提交,就完成了合併。

  • 注:Git合併分支也很快!就改改指標,工作區內容也不變!

    合併完分支後,也可以刪除test分支。刪除test分支就是把test指標給刪掉,刪掉後,就剩下了一條master分支了。

四、操作命令

  • 建立並切換分支 (git checkout -b test

    $ git checkout -b test
    Switched to a new branch ‘test’

    注:git checkout命令加上-b引數表示建立並切換,相當於執行了以下兩條命令:

    $ git branch test

    $ git checkout test
    Switched to branch ‘test’

  • 檢視當前分支 ( git branch
    然後,用git branch命令檢視當前分支:

    $ git branch
    *test
    master

    git branch命令會列出所有分支,當前分支前面會標一個*號。此時,我們就可以在test分支上進行開發並正常提交。

  • 分支的切換 (git checkout master

    如果在test分支上完成了開發,我們可以切換回master分支:

    $ git checkout master
    Switched to branch ‘master’

    注:當切換回master分支後,其實內容是不會有任何改變的,因為你所做的修改和提交工作全部在test分支上完成,而master分支的提交點是沒有任何改變的。

  • 分支合併 (git merge test

    我們試著把test分支下的工作成果合併到master主分支上:

    $ git merge test
    Updating d17efd8..fec145a
    Fast-forward
    ……. | 1 +
    …. file changed, 1 insertion(+)

    git merge 命令用於合併指定分支到當前分支。注意這裡是切換到了master主分支,將指定分支test合併過來。合併後,可以發現master主分支的內容和test分支的最新提交是完全一樣的。

    注:上面的Fast-forward資訊是Git告訴我們,這次合併是“快進模式”,也就是直接把master指向test的當前提交,所以合併速度非常快,當然也不是每次合併都能Fast-forward,後續會總結其他方式的合併。

  • 刪除分支 (git branch -d test

    合併完成後,若不再需要test分支,也可以放心的刪除:

    $ git branch -d test
    Deleted branch test (was fec145a).

    刪除後,再次執行 git branch 命令,可以看到只剩下master分支了。

    建議:因為建立、合併及刪除分支都非常快,所以Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,其實這和直接在master分支上工作效果是一樣的,但過程更安全。

五、總結

  • 檢視分支:git branch

  • 建立分支:git branch <name>

  • 切換分支:git checkout <name>

  • 建立+切換分支:git checkout -b <name>

  • 合併某分支到當前分支:git merge <name>

  • 刪除分支:git branch -d <name>