Git分支操作介紹:為何以及如何使用分支?
在這個(gè) Git 入門(mén)系列的第三篇中,我們來(lái)學(xué)習(xí)一下如何添加和刪除 Git 分支。
在本系列的前兩篇文章中,我們開(kāi)始使用 Git,學(xué)會(huì)如何克隆項(xiàng)目,修改、增加和刪除內(nèi)容。在這第三篇文章中,我將介紹 Git 分支,為何以及如何使用分支。
tree branches
不妨用樹(shù)來(lái)描繪 Git 倉(cāng)庫(kù)。圖中的樹(shù)有很多分支,或長(zhǎng)或短,或從樹(shù)干延伸或從其它分支延伸。在這里,我們用樹(shù)干比作倉(cāng)庫(kù)的 master 分支,其中 master
代指 ”master 分支”,是 Git 倉(cāng)庫(kù)的中心分支或***個(gè)分支。為簡(jiǎn)單起見(jiàn),我們假設(shè) master
是樹(shù)干,其它分支都是從該分支分出的。
為何在 Git 倉(cāng)庫(kù)中使用分支
使用分支的主要理由為:
- 如果你希望為項(xiàng)目增加新特性,但很可能會(huì)影響當(dāng)前可正常工作的代碼。對(duì)于該項(xiàng)目的活躍用戶(hù)而言,這是很糟糕的事情。與其將特性加入到其它人正在使用的
master
分支,更好的方法是在倉(cāng)庫(kù)的其它分支中變更代碼,下面會(huì)給出具體的工作方式。 - 更重要的是,Git 其設(shè)計(jì)用于協(xié)作。如果所有人都在你代碼倉(cāng)庫(kù)的
master
分支上操作,會(huì)引發(fā)很多混亂。對(duì)編程語(yǔ)言或項(xiàng)目的知識(shí)和閱歷因人而異;有些人可能會(huì)編寫(xiě)有錯(cuò)誤或缺陷的代碼,也可能會(huì)編寫(xiě)你覺(jué)得不適合該項(xiàng)目的代碼。使用分支可以讓你核驗(yàn)他人的貢獻(xiàn)并選擇適合的加入到項(xiàng)目中。(這里假設(shè)你是代碼庫(kù)唯一的所有者,希望對(duì)增加到項(xiàng)目中的代碼有完全的控制。在真實(shí)的項(xiàng)目中,代碼庫(kù)有多個(gè)具有合并代碼權(quán)限的所有者)
創(chuàng)建分支
讓我們回顧本系列上一篇文章,看一下在我們的 Demo 目錄中分支是怎樣的。如果你沒(méi)有完成上述操作,請(qǐng)按照文章中的指示從 GitHub 克隆代碼并進(jìn)入 Demo 目錄。運(yùn)行如下命令:
pwd
git branch
ls -la
pwd
命令(是當(dāng)前工作目錄的英文縮寫(xiě))返回當(dāng)前你所處的目錄(以便確認(rèn)你在 Demo
目錄中),git branch
列出該項(xiàng)目在你主機(jī)上的全部分支,ls -la
列出當(dāng)前目錄下的所有文件。你的終端輸出類(lèi)似于:
Terminal output
在 master
分支中,只有一個(gè)文件 README.md
。(Git 會(huì)友好地忽略掉其它目錄和文件。)
接下來(lái),運(yùn)行如下命令:
git status
git checkout -b myBranch
git status
***條命令 git status
告知你當(dāng)前位于 branch master
,(就像在終端中看到的那樣)它與 origin/master
處于同步狀態(tài),這意味著 master 分支的本地副本中的全部文件也出現(xiàn)在 GitHub 中。兩份副本沒(méi)有差異,所有的提交也是一致的。
下一條命令 git checkout -b myBranch
中的 -b
告知 Git 創(chuàng)建一個(gè)名為 myBranch
的新分支,然后 checkout
命令將我們切換到新創(chuàng)建的分支。運(yùn)行第三條命令 git status
確保你已經(jīng)位于剛創(chuàng)建的分支下。
如你所見(jiàn),git status
告知你當(dāng)前處于 myBranch
分支,沒(méi)有變更需要提交。這是因?yàn)槲覀兗葲](méi)有增加新文件,也沒(méi)有修改已有文件。
Terminal output
如果希望以可視化的方式查看分支,可以運(yùn)行 gitk
命令。如果遇到報(bào)錯(cuò) bash: gitk: command not found...
,請(qǐng)先安裝 gitk
軟件包(找到你操作系統(tǒng)對(duì)應(yīng)的安裝文檔,以獲得安裝方式)。
(LCTT 譯注:需要在有 X 服務(wù)器的終端運(yùn)行 gitk
,否則會(huì)報(bào)錯(cuò))
下圖展示了我們?cè)?Demo 項(xiàng)目中的所作所為:你***一次提交(的對(duì)應(yīng)信息)是 Delete file.txt
,在此之前有三次提交。當(dāng)前的提交用黃點(diǎn)標(biāo)注,之前的提交用藍(lán)點(diǎn)標(biāo)注,黃點(diǎn)和 Delete file.txt
之間的三個(gè)方塊展示每個(gè)分支所在的位置(或者說(shuō)每個(gè)分支中的***一次提交的位置)。由于 myBranch
剛創(chuàng)建,提交狀態(tài)與 master
分支及其對(duì)應(yīng)的記為 remotes/origin/master
的遠(yuǎn)程 master
分支保持一致。(非常感謝來(lái)自 Red Hat 的 Peter Savage 讓我知道 gitk
這個(gè)工具)
Gitk output
下面讓我們?cè)?myBranch
分支下創(chuàng)建一個(gè)新文件并觀察終端輸出。運(yùn)行如下命令:
echo "Creating a newFile on myBranch" > newFile
cat newFile
git status
***條命令中的 echo
創(chuàng)建了名為 newFile
的文件,接著 cat newFile
打印出文件內(nèi)容,*** git status
告知你我們 myBranch
分支的當(dāng)前狀態(tài)。在下面的終端輸出中,Git 告知 myBranch
分支下有一個(gè)名為 newFile
的文件當(dāng)前處于 untracked
狀態(tài)。這表明我們沒(méi)有讓 Git 追蹤發(fā)生在文件 newFile
上的變更。
Terminal output
下一步是增加文件,提交變更并將 newFile
文件推送至 myBranch
分支(請(qǐng)回顧本系列上一篇文章獲得更多細(xì)節(jié))。
git add newFile
git commit -m "Adding newFile to myBranch"
git push origin myBranch
在上述命令中,push
命令使用的分支參數(shù)為 myBranch
而不是 master
。Git 添加 newFile
并將變更推送到你 GitHub 賬號(hào)下的 Demo 倉(cāng)庫(kù)中,告知你在 GitHub 上創(chuàng)建了一個(gè)與你本地副本分支 myBranch
一樣的新分支。終端輸出截圖給出了運(yùn)行命令的細(xì)節(jié)及命令輸出。
Terminal output
當(dāng)你訪問(wèn) GitHub 時(shí),在分支選擇的下拉列表中可以發(fā)現(xiàn)兩個(gè)可供選擇的分支。
GitHub
點(diǎn)擊 myBranch
切換到 myBranch
分支,你可以看到在此分支上新增的文件。
GitHub
截至目前,我們有兩個(gè)分支:一個(gè)是 master
分支,只有一個(gè) README.md
文件;另一個(gè)是 myBranch
分支,有兩個(gè)文件。
你已經(jīng)知道如何創(chuàng)建分支了,下面我們?cè)賱?chuàng)建一個(gè)分支。輸入如下命令:
git checkout master
git checkout -b myBranch2
touch newFile2
git add newFile2
git commit -m "Adding newFile2 to myBranch2"
git push origin myBranch2
我不再給出終端輸出,需要你自己嘗試,但你可以在 GitHub 代碼庫(kù) 中驗(yàn)證你的結(jié)果。
刪除分支
由于我們?cè)黾恿藘蓚€(gè)分支,下面刪除其中的一個(gè)(myBranch
),包括兩步:
-
刪除本地分支 你不能刪除正在操作的分支,故切換到
master
分支 (或其它你希望保留的分支),命令及終端輸出如下:git branch
可以列出可用的分支,使用checkout
切換到master
分支,然后使用git branch -D myBranch
刪除該分支。再次運(yùn)行git branch
檢查是否只剩下兩個(gè)分支(而不是三個(gè))。 -
刪除 GitHub 上的分支 使用如下命令刪除
myBranch
的遠(yuǎn)程分支:git push origin :myBranch
Terminal output
上面 push
命令中分支名稱(chēng)前面的冒號(hào)(:
)告知 GitHub 刪除分支。另一種寫(xiě)法為:
git push -d origin myBranch
其中 -d
(也可以用 --delete
) 也用于告知 GitHub 刪除你的分支。
我們學(xué)習(xí)了 Git 分支的使用,在本系列的下一篇文章中,我們將介紹如何執(zhí)行 fetch
和 rebase
操作,對(duì)于多人同時(shí)的貢獻(xiàn)的項(xiàng)目而言,這是很必須學(xué)會(huì)的。