Linux中國

Git 分支操作介紹

在本系列的前兩篇文章中,我們開始使用 Git,學會如何克隆項目,修改、增加和刪除內容。在這第三篇文章中,我將介紹 Git 分支,為何以及如何使用分支。

![樹枝](/data/attachment/album/201806/07/232258bokj2oqrqh5ior0i.jpg "tree branches")

不妨用樹來描繪 Git 倉庫。圖中的樹有很多分支,或長或短,或從樹榦延伸或從其它分支延伸。在這裡,我們用樹榦比作倉庫的 master 分支,其中 master 代指 」master 分支」,是 Git 倉庫的中心分支或第一個分支。為簡單起見,我們假設 master 是樹榦,其它分支都是從該分支分出的。

為何在 Git 倉庫中使用分支

使用分支的主要理由為:

  • 如果你希望為項目增加新特性,但很可能會影響當前可正常工作的代碼。對於該項目的活躍用戶而言,這是很糟糕的事情。與其將特性加入到其它人正在使用的 master 分支,更好的方法是在倉庫的其它分支中變更代碼,下面會給出具體的工作方式。
  • 更重要的是,Git 其設計用於協作。如果所有人都在你代碼倉庫的 master 分支上操作,會引發很多混亂。對編程語言或項目的知識和閱歷因人而異;有些人可能會編寫有錯誤或缺陷的代碼,也可能會編寫你覺得不適合該項目的代碼。使用分支可以讓你核驗他人的貢獻並選擇適合的加入到項目中。(這裡假設你是代碼庫唯一的所有者,希望對增加到項目中的代碼有完全的控制。在真實的項目中,代碼庫有多個具有合併代碼許可權的所有者)

創建分支

讓我們回顧本系列上一篇文章,看一下在我們的 Demo 目錄中分支是怎樣的。如果你沒有完成上述操作,請按照文章中的指示從 GitHub 克隆代碼並進入 Demo 目錄。運行如下命令:

pwd
git branch
ls -la

pwd 命令(是當前工作目錄的英文縮寫)返回當前你所處的目錄(以便確認你在 Demo 目錄中),git branch 列出該項目在你主機上的全部分支,ls -la 列出當前目錄下的所有文件。你的終端輸出類似於:

![終端輸出](/data/attachment/album/201806/07/232259fulowhuxc3vmyuyv.png "Terminal output")

master 分支中,只有一個文件 README.md。(Git 會友好地忽略掉其它目錄和文件。)

接下來,運行如下命令:

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 分支,沒有變更需要提交。這是因為我們既沒有增加新文件,也沒有修改已有文件。

![終端輸出](/data/attachment/album/201806/07/232307zypoojs93o2zjgt9.png "Terminal output")

如果希望以可視化的方式查看分支,可以運行 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 這個工具)

![Gitk 輸出](/data/attachment/album/201806/07/232308luoexoj2j3lo22l3.png "Gitk output")

下面讓我們在 myBranch 分支下創建一個新文件並觀察終端輸出。運行如下命令:

echo "Creating a newFile on myBranch" > newFile
cat newFile
git status

第一條命令中的 echo 創建了名為 newFile 的文件,接著 cat newFile 列印出文件內容,最後 git status 告知你我們 myBranch 分支的當前狀態。在下面的終端輸出中,Git 告知 myBranch 分支下有一個名為 newFile 的文件當前處於 untracked 狀態。這表明我們沒有讓 Git 追蹤發生在文件 newFile 上的變更。

![終端輸出](/data/attachment/album/201806/07/232318mp3a74p35nnl9ztt.png "Terminal output")

下一步是增加文件,提交變更並將 newFile 文件推送至 myBranch 分支(請回顧本系列上一篇文章獲得更多細節)。

git add newFile
git commit -m "Adding newFile to myBranch"
git push origin myBranch

在上述命令中,push 命令使用的分支參數為 myBranch 而不是 master。Git 添加 newFile 並將變更推送到你 GitHub 賬號下的 Demo 倉庫中,告知你在 GitHub 上創建了一個與你本地副本分支 myBranch 一樣的新分支。終端輸出截圖給出了運行命令的細節及命令輸出。

![終端輸出](/data/attachment/album/201806/07/232321zg9070fg08c9cnft.png "Terminal output")

當你訪問 GitHub 時,在分支選擇的下拉列表中可以發現兩個可供選擇的分支。

![GitHub](/data/attachment/album/201806/07/232339fb7lfez7jnkzbele.png "GitHub")

點擊 myBranch 切換到 myBranch 分支,你可以看到在此分支上新增的文件。

![GitHub](/data/attachment/album/201806/07/232350w3c7phg2cswcbvs7.png "GitHub")

截至目前,我們有兩個分支:一個是 master 分支,只有一個 README.md 文件;另一個是 myBranch 分支,有兩個文件。

你已經知道如何創建分支了,下面我們再創建一個分支。輸入如下命令:

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),包括兩步:

  1. 刪除本地分支 你不能刪除正在操作的分支,故切換到 master 分支 (或其它你希望保留的分支),命令及終端輸出如下:

git branch 可以列出可用的分支,使用 checkout 切換到 master 分支,然後使用 git branch -D myBranch 刪除該分支。再次運行 git branch 檢查是否只剩下兩個分支(而不是三個)。

  1. 刪除 GitHub 上的分支 使用如下命令刪除 myBranch 的遠程分支:
git push origin :myBranch

![Terminal output](/data/attachment/album/201806/07/232357g7s9vioukdh729k2.png "Terminal output")

上面 push 命令中分支名稱前面的冒號(:)告知 GitHub 刪除分支。另一種寫法為:

git push -d origin myBranch

其中 -d (也可以用 --delete) 也用於告知 GitHub 刪除你的分支。

我們學習了 Git 分支的使用,在本系列的下一篇文章中,我們將介紹如何執行 fetchrebase 操作,對於多人同時的貢獻的項目而言,這是很必須學會的。

via: https://opensource.com/article/18/5/git-branching

作者:Kedar Vijay Kulkarni 選題:lujun9972 譯者:pinewall 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國