在本系列的前兩篇文章中,我們開始使用 Git,學會如何克隆專案,修改、增加和刪除內容。在這第三篇文章中,我將介紹 Git 分支,為何以及如何使用分支。
不妨用樹來描繪 Git 倉庫。圖中的樹有很多分支,或長或短,或從樹幹延伸或從其它分支延伸。在這裡,我們用樹幹比作倉庫的 master 分支,其中 master
代指 ”master 分支”,是 Git 倉庫的中心分支或第一個分支。為簡單起見,我們假設 master
是樹幹,其它分支都是從該分支分出的。
為何在 Git 倉庫中使用分支
使用分支的主要理由為:
- 如果你希望為專案增加新特性,但很可能會影響當前可正常工作的程式碼。對於該專案的活躍使用者而言,這是很糟糕的事情。與其將特性加入到其它人正在使用的
master
分支,更好的方法是在倉庫的其它分支中變更程式碼,下面會給出具體的工作方式。 - 更重要的是,Git 其設計用於協作。如果所有人都在你程式碼倉庫的
master
分支上操作,會引發很多混亂。對程式語言或專案的知識和閱歷因人而異;有些人可能會編寫有錯誤或缺陷的程式碼,也可能會編寫你覺得不適合該專案的程式碼。使用分支可以讓你核驗他人的貢獻並選擇適合的加入到專案中。(這裡假設你是程式碼庫唯一的所有者,希望對增加到專案中的程式碼有完全的控制。在真實的專案中,程式碼庫有多個具有合併程式碼許可權的所有者)
建立分支
讓我們回顧本系列上一篇文章,看一下在我們的 Demo 目錄中分支是怎樣的。如果你沒有完成上述操作,請按照文章中的指示從 GitHub 克隆程式碼並進入 Demo 目錄。執行如下命令:
1 2 3 4 |
pwd git branch ls -la |
pwd
命令(是當前工作目錄的英文縮寫)返回當前你所處的目錄(以便確認你在 Demo
目錄中),git branch
列出該專案在你主機上的全部分支,ls -la
列出當前目錄下的所有檔案。你的終端輸出類似於:
在 master
分支中,只有一個檔案 README.md
。(Git 會友好地忽略掉其它目錄和檔案。)
接下來,執行如下命令:
1 2 3 4 |
git status git checkout -b myBranch git status |
第一條命令 git status
告知你當前位於 branch master
,(就像在終端中看到的那樣)它與 origin/master
處於同步狀態,這意味著 master 分支的本地副本中的全部檔案也出現在 GitHub 中。兩份副本沒有差異,所有的提交也是一致的。
下一條命令 git checkout -b myBranch
中的 -b
告知 Git 建立一個名為 myBranch
的新分支,然後 checkout
命令將我們切換到新建立的分支。執行第三條命令 git status
確保你已經位於剛建立的分支下。
如你所見,git status
告知你當前處於 myBranch
分支,沒有變更需要提交。這是因為我們既沒有增加新檔案,也沒有修改已有檔案。
如果希望以視覺化的方式檢視分支,可以執行 gitk
命令。如果遇到報錯 bash: gitk: command not found...
,請先安裝 gitk
軟體包(找到你作業系統對應的安裝文件,以獲得安裝方式)。
(LCTT 譯註:需要在有 X 伺服器的終端執行 gitk
,否則會報錯)
下圖展示了我們在 Demo 專案中的所作所為:你最後一次提交(的對應資訊)是 Delete file.txt
,在此之前有三次提交。當前的提交用黃點標註,之前的提交用藍點標註,黃點和 Delete file.txt
之間的三個方塊展示每個分支所在的位置(或者說每個分支中的最後一次提交的位置)。由於 myBranch
剛建立,提交狀態與 master
分支及其對應的記為 remotes/origin/master
的遠端 master
分支保持一致。(非常感謝來自 Red Hat 的 Peter Savage 讓我知道 gitk
這個工具)
下面讓我們在 myBranch
分支下建立一個新檔案並觀察終端輸出。執行如下命令:
1 2 3 4 |
echo "Creating a newFile on myBranch" > newFile cat newFile git status |
第一條命令中的 echo
建立了名為 newFile
的檔案,接著 cat newFile
列印出檔案內容,最後 git status
告知你我們 myBranch
分支的當前狀態。在下面的終端輸出中,Git 告知 myBranch
分支下有一個名為 newFile
的檔案當前處於 untracked
狀態。這表明我們沒有讓 Git 追蹤發生在檔案 newFile
上的變更。
下一步是增加檔案,提交變更並將 newFile
檔案推送至 myBranch
分支(請回顧本系列上一篇文章獲得更多細節)。
1 2 3 4 |
git add newFile git commit -m "Adding newFile to myBranch" git push origin myBranch |
在上述命令中,push
命令使用的分支引數為 myBranch
而不是 master
。Git 新增 newFile
並將變更推送到你 GitHub 賬號下的 Demo 倉庫中,告知你在 GitHub 上建立了一個與你本地副本分支 myBranch
一樣的新分支。終端輸出截圖給出了執行命令的細節及命令輸出。
當你訪問 GitHub 時,在分支選擇的下拉選單中可以發現兩個可供選擇的分支。
點選 myBranch
切換到 myBranch
分支,你可以看到在此分支上新增的檔案。
截至目前,我們有兩個分支:一個是 master
分支,只有一個 README.md
檔案;另一個是 myBranch
分支,有兩個檔案。
你已經知道如何建立分支了,下面我們再建立一個分支。輸入如下命令:
1 2 3 4 5 6 7 |
git checkout master git checkout -b myBranch2 touch newFile2 git add newFile2 git commit -m "Adding newFile2 to myBranch2" git push origin myBranch2 |
我不再給出終端輸出,需要你自己嘗試,但你可以在 GitHub 程式碼庫 中驗證你的結果。
刪除分支
由於我們增加了兩個分支,下面刪除其中的一個(myBranch
),包括兩步:
- 刪除本地分支 你不能刪除正在操作的分支,故切換到
master
分支 (或其它你希望保留的分支),命令及終端輸出如下:git branch
可以列出可用的分支,使用checkout
切換到master
分支,然後使用git branch -D myBranch
刪除該分支。再次執行git branch
檢查是否只剩下兩個分支(而不是三個)。 - 刪除 GitHub 上的分支 使用如下命令刪除
myBranch
的遠端分支:
12git push origin :myBranch
上面 push
命令中分支名稱前面的冒號(:
)告知 GitHub 刪除分支。另一種寫法為:
1 2 |
git push -d origin myBranch |
其中 -d
(也可以用 --delete
) 也用於告知 GitHub 刪除你的分支。
我們學習了 Git 分支的使用,在本系列的下一篇文章中,我們將介紹如何執行 fetch
和 rebase
操作,對於多人同時的貢獻的專案而言,這是很必須學會的。