使用分支 -- Git branch 命令

語言: CN / TW / HK

本篇文章會對git branch命令進行一次深度審視,其內容還包含有關git分支模式的討論。在很多現代版本控制系統內,分支都是一項必備功能。但在其他版本控制系統內,分支操作會相當昂貴,消耗時間精力和硬碟空間。在Git中,分支是每天開發過程中自然的一部分。Git的分支僅僅是指向快照的一個指標。當新增一個功能或者修改一個BUG時——無論工作量大小——都可以派生一個分支來包含這些改變。這既阻止了不穩定的程式碼合入主程式碼分支,也提供了一個在合併進主分支之前清理提交歷史記錄的機會。

01 Git branch.png

上圖所示是一個倉庫中主分支之外有兩個獨立的開發分支,一個是一次小的功能開發,另一個則是包含大功能的長期開發分支。當時用獨立分支進行開發時,不僅能讓兩個獨立功能並行開發,並同時保證了主分支內不含有這兩個獨立分支中未開發完成的問題程式碼。

相對於其他版本控制工具,Git對於分支的實現輕量很多。其他工具對待分支時,是將檔案從這個目錄拷貝到那個目錄。與此不同,Git對分支資訊的儲存是通過對commit的引用。具體地說,一個分支僅表示一個一系列commits的頂部commit引用——並不是一堆commits的容器。使用對這個commit的引用,可以通過commits之間的先後關係來確定一個分支的所有內容。

它是如何工作的

一個分支代表一個獨立的開發工作。分支的概念其實是對編輯、暫存、提交這一整個流程的抽象。你可以將其想象為是在請求一整塊全新工作區、暫存區,以及專案歷史。新的commit記錄僅會儲存在當前分支的提交歷史中,也就會在整個專案的歷史記錄中產生一個分叉。

git branch命令允許對分支進行建立、列舉、重新命名以及刪除的操作。它不能進行切換分支或者將分叉的commit記錄扔到其他分支裡。因此git branch總是與git checkout以及git merge命令共同出現在使用場景中。

常見選項

git branch

列舉倉庫中的所有分支。此命令與git branch --list是同義詞。

git branch <branch>

建立一個名為 的分支。但此命令並不會自動檢出新建立的分支。

git branch -d <branch>

刪除指定分支。這是一個安全的操作,因為當分支中含有未合併的變更時,Git會阻止這一次刪除操作。

git branch -D <branch>

強制刪除指定分支,即便其中含有未合併的變更。該命令常見於當開發者希望永久刪除某一開發過程中的所有commit。

git branch -m <branch>

對於當前分支重新命名為

git branch -a

列舉所有遠端分支。

建立分支

對於所有分支僅是對於commit的指標這一概念的深刻理解是非常重要的。當你建立一個分支時,Git所需要做的無非是建立一個新的指標,這一過程並不會對倉庫進行任何修改。比如當你對如下圖所示的倉庫進行建立分支的操作:

02 Creating branches.png 然後執行下面的命令來建立一個分支:

git branch crazy-experiment

此時的倉庫提交歷史沒有任何變化。你得到的僅僅是指向當前commit的一個新指標。

03 Creating branches.png

要注意此時你只是建立了這個分支。如需開始對新分支進行提交,要先選擇這個新的分支,使用git checkout命令,然後再使用標準流程git addgit commit等命令。

建立遠端分支

截至目前,我們所展示的操作都只關於本地分支。git branch命令也可以用於遠端分支。為了操作遠端分支,讓我們先為倉庫新增一個遠端倉庫。

``` $ git remote add new-remote-repo http://bitbucket.com/user/repo.git

Add remote repo to local repo config

$ git push crazy-experiment~

pushes the crazy-experiment branch to new-remote-repo

```

以上命令先添加了名為new-remote-repo的遠端倉庫,然後將本地分支crazy-experiment推向遠端。

刪除分支

一旦完成了當前分支的開發內容,並將其合併到主分支之後,就可以放心的刪除該分支,而不用擔心會丟失任何提交歷史:

git branch -d crazy-experiment

然而,如果分支沒有被合併過,以上命令則會輸出下面這樣的錯誤資訊:

error: The branch 'crazy-experiment' is not fully merged. If you are sure you want to delete it, run 'git branch -D crazy-experiment'.

它在向你抗議:如此操作將會丟失當前分支上的所有工作內容。如果你確定要刪除該分支(比如當前分支的開發內容是一次失敗的試驗),你可以使用大寫D的標記:

git branch -D crazy-experiment

這樣刪除操作後,無論什麼狀況都不會再出現任何警告資訊,因此請謹慎使用。

上面的命令會刪除該分支在本地倉庫的拷貝。但遠端倉庫中仍然有這個分支的內容。如需刪除遠端倉庫上的這個分支,請使用以下命令

git push origin --delete crazy-experiment

或者

git push origin :crazy-experiment

這會將刪除訊號推送給遠端倉庫,觸發遠端倉庫刪除crazy-experiment分支。

總結

在這篇文件中,我們討論了Git的分支行為和git branch命令。git branch命令主要用於建立、列舉、重新命名以及刪除分支。為了對產生的分支進行操作,git branch命令總是與其他命令一起使用,比如git checkout命令。