想獨立門戶嗎(Git進行中03):Git分支介紹

SHOW YOU THE 場景

想獨立門戶嗎(Git進行中03):Git分支介紹

分支,可以說是Git的一大“討人喜愛(tao'yan)”的特點,在介紹這位朋友之前,我想用一個場景來讓它鋪一條出道紅毯。

假設!

你們正在迭代項目的新版本功能,正開發到一半!

萬惡之源的產品出現了:“哎呀,有個小需求我希望能在現有版本上先上線,新版本後面上的時候也要包括它,我知道你能做到的啦,靠你了”!

可是,由於我們已經對目前的代碼有了很大的修改,自然是不可能在現有這個基礎上增加那個小需求,那怎麼辦。

我們可以這樣想,現在的代碼庫我們無法做到,那麼如果是開發新版本之前的代碼庫呢?

之前的代碼庫自然是可以做到的,因為那時候的它,風華正茂,正好是上個版本的最終穩定代碼庫。

那麼為了我們可以實現這樣的時間線的切換,我們就需要Git的分支功能了,從版本庫中開闢出一條新的時間線,這條時間線的代碼和你目前正在操作的代碼,是互不影響的,我們就可以在這條新的時間線上進行開發,而不會受到其他代碼的影響。

這些新開闢出來的時間線,我們稱之為分支。

介紹

想獨立門戶嗎(Git進行中03):Git分支介紹

分支的使用,可以讓我們的開發不受他人、不受時間的影響,我們可以把工作從目前開發的那條主線上分離開來,以免影響開發主線,就如同例子裡的新版本和舊版本的新需求,兩者可以互不影響的進行。

實際上,分支並不是Git一家獨有,其他版本控制工具也擁有該功能, 那為何Git的分支功能如此出眾,以至於能夠成為它的一大利器呢?

原因還是因為對於其他版本工具而言,分支的使用是一個低效的過程,它需要完全創建一個源代碼目錄的副本,對於大型項目而言,十分耗時。而Git的分支操作,是非常便捷的,因為它是基於指針而不是一個完整副本來進行的。

我們要先了解,Git的每一次提交,都會產生一個提交對象(commit),裡面會包括提交人信息、暫存內容快照的指向指針。Git會通過HEAD指針來指向當前分支,以及當前分支的提交點。

想獨立門戶嗎(Git進行中03):Git分支介紹

master分支就是我們一開始的唯一分支

而當我們新建一個分支的時候,會產生一個分支的指針(假設是dev分支,也就是dev指針),會指向master的當前提交對象,同時HEAD會指向到dev分支,認為dev是當前分支,此時的開發工作就會都基於該分支來進行。

想獨立門戶嗎(Git進行中03):Git分支介紹

也就是說,每次新建一個分支,只是創建了一個指針,並修改HEAD的指向,這就使得Git的分支創建十分便捷和快速。

那麼切換分支,也就只是修改HEAD的指向,而刪除分支,也只是刪除指針。

而最為關鍵的分支上代碼的合併,也是十分簡單。

舉個小“慄”子:

我有一個release的分支,用來指向穩定版本庫,另外有一個從release分支切換出來的dev的開發分支(這代表著,這個時候dev分支所指向的提交對象就是release的當前提交對象);

隨後在dev上進行開發,而等到開發完成後,此時dev分支上的代碼就是最新的調試完成的版本,而release還是指向上一個穩定的提交對象,這時候我需要把dev上的代碼合併到release上,這一步的過程是:

將release指向到dev的當前提交對象。

想獨立門戶嗎(Git進行中03):Git分支介紹

便完成了合併。

也就是說,合併操作也只是指針的修改。

至此可見,Git的分支是多麼強大(超棒棒)。

說完了Git它自己的工作,接下來我們來說一下我們的工作。

新建分支

想獨立門戶嗎(Git進行中03):Git分支介紹

git branch 新分支名

該操作會在本地創建一個新的分支,名稱為“release”

關聯遠端

單純在本地創建分支是不夠的,遠端也需要有對應的分支關聯,才能進行後續的提交、更新等操作。

本地創建分支,並推送到遠端

git branch release

在當前分支的情況下:

想獨立門戶嗎(Git進行中03):Git分支介紹

git push --set-upstream origin 分支名

這樣會在遠端生成一個分支release,且代碼與本地的一樣,同時本地也與遠端關聯成功。

本地創建分支,關聯遠程已有分支

git branch release

在當前分支的情況下:

想獨立門戶嗎(Git進行中03):Git分支介紹

git branch --set-upstream-to=origin/遠程分支名 本地分支名

若出現ambiguity,需要刪除.git/refs/orgin/分支名:

 rm .git/refs/origin/release

再進行set-upstream-to

這樣會將本地的release分支與遠端的release分支實現關聯。

直接從遠程上checkout分支到本地

若遠端已存在分支,則直接從遠端將代碼拉取下來,實現本地與遠端的關聯

想獨立門戶嗎(Git進行中03):Git分支介紹

git checkout -b 本地分支名 遠程分支名

會在本地生成一個release的分支,該分支綁定遠程的release分支。

更改分支名

若當前分支不是要修改的那個分支,需要指定分支:

想獨立門戶嗎(Git進行中03):Git分支介紹

git branch -m 原名字 新名字

或者當處於該分支的時候:

想獨立門戶嗎(Git進行中03):Git分支介紹

git branch -m 新名字

切換分支

當我們本地有多個分支的情況下,我們需要根據情境而切換分支:

想獨立門戶嗎(Git進行中03):Git分支介紹

git checkout 分支名

當前我正處於master分支,該操作將切換本地分支為release分支。

有沒有發現這條命令與上面的從遠端拉取分支的命令很相似:

git checkout -b 本地分支名 遠程分支名

相比之下,缺少了屬性 -b 及 遠端分支名,-b的意思便是切換並創建分支。

刪除分支

在我們合併了分支後,可以對分支進行刪除。

想獨立門戶嗎(Git進行中03):Git分支介紹

git branch -d 分支名

該操作將刪除本地的分支,如果需要將關聯的遠端分支一併刪除,需要:

想獨立門戶嗎(Git進行中03):Git分支介紹

git push origin --delete 分支名

兩個命令一同使用,將完整的刪除分支。

但實際上,刪除了分支,只是刪除了分支指針,相關提交對象還是存在的,在git提交日誌裡(git log)仍然可以查看到,也同樣可以在這些提交commit上新建分支。

查看分支情況

查看本地及遠程的分支情況

想獨立門戶嗎(Git進行中03):Git分支介紹

git branch -a

可以看到,本地只有一個master分支,且當前分支是master(帶點綠)

而遠端的HEAD指針指向了遠端的master分支。

若發現遠程分支裡面,沒有實際存在的分支,則先切換到master,執行git pull,會把缺少的分支更新下來,然後可以執行前面的關聯命令。

查看本地分支和遠程分支的關聯

想獨立門戶嗎(Git進行中03):Git分支介紹

git branch -vv

可以看到,本地的master分支關聯到了遠端的master分支。

後續

想獨立門戶嗎(Git進行中03):Git分支介紹

關注“居家程序員”呀

看到這裡想必你也發現了一件事。

好像少了什麼東西?

老生常談的合併分支操作呢?

我放到後面再說哈哈哈哈


分享到:


相關文章: