Git Branch(清單、新建、刪除、重新命名、切換)

前言

在使用 Git 時,不管是在自己的專案開發或多人合作的專案,分支(Branch)都是個很重要的功能。它可以讓不同的事情「同步進行」,不會相互影響、也不需要互相等待。這篇主要針對建立、刪除、切換及重新命名來介紹。

查看分支清單(git branch)

每個分支都會有一個指標,告訴使用者這個分支目前的進度到哪裡,這個指標會指向該分支最新的 commit。所以只要建立一個新的 commit ,這個指標就會同步向前。

當想要查看現有分支時,可以執行 git branch 指令。它會列出專案裡所有的有指標的分支,並在所在分支上用 * 標註。

git branch


如果想在查看所有分支的同時,列出該分支指標分別在哪個 commit 上,則可以使用 git branch -v
-vverbose 參數,可以查看本地端分支更詳細得訊息。如果使用 -vv 則可以連遠端儲存庫的指標都一起列出來。

git branch verbose

而比較特別的是,在我們新建了一個儲存庫 (執行 git init) 後,Git 雖然會直接幫我們建立一個分支 main (也可能是 master ,要看當初安裝 Git 時選哪個選項),但是因為沒有任何一個 commit 存在,main 分支的指標沒有指向任何東西。這時如果使用 git branch 指令,並不會看到任何分支。在這種情況下 commit ,Git 會自動在 main 分支上 commit 並將 main 分支的指標移到這個 commit 上。

什麼是 HEAD

HEAD 介紹

HEAD 也是一種指標,它會指向使用者目前所在的 commit 位置。一般來說, HEAD 都會指向所在分支最新的 commit(也就是該分支的指標位置)。

如果使用 sourcetree 查看,HEAD 會是一個空心的圓圈。

detached HEAD

有一種例外情況是使用 git checkout <commit> ,也就是查看特定的 commit 版本,這種情況下 HEAD 就會指向該 commit 而不是指向分支指標,也就是 HEAD 不在任何一個分支指標上(即使該 commit 是某分支的指標位置也一樣),會出現 detached HEAD 訊息。

不過看到這個訊息也不用太緊張,它只是做個提醒而已,仍然可以瀏覽檔案和編輯。如果希望從這個 commit 開始做些新進度,也可以直接從這裡建立新分支。

新建分支(git branch <branch-name>)

要建立新的分支,只要使用 git branch <branch-name> 指令即可。需要注意的是,他會從 HEAD 的指標位置「長出」新分支,但是 HEAD 位置仍然維持在原分支上,不會移動到新分支上。

所以就要提到一個特殊情況,前面有提到,剛建立一個儲存庫時並沒有 commit 存在,所以也沒有 HEAD 指標。如果我們的第一個 commit 不想用預設的 main 分支,而是想直接 commit 在自己新建的分支上,直接使用 git branch <branch-name> 的話, Git 會因為無法從 HEAD 產生新分支而跳出錯誤訊息。這時候可以使用 git switch -c <branch-name> 來處理。

切換分支(git switch <branch-name>)

git switch 是比較近期出現的指令(2019年 Git 2.23 Release Notes 釋出)。原本要切換分支是使用 git checkout <branch-name> ,這個指令還是可以用,只是 git checkout 的功能較多,容易造成使用上的混淆,因此可以改用新指令 git switch <branch-name>

使用 git switch <branch-name> 可以直接切換分支,將 HEAD 指標移向該分支指標。另外,使用 -c 參數(create) 可以直接切換到新建立的分支。

刪除分支(git branch -d <branch-name>)

要刪除一個分支的話,首先要確認自己目前「不在」要刪除的分支上,接著要確認該分支是否已經和它的上游分支「merge」。

刪除分支可以使用兩種參數: -d-D-d 會檢查要刪除的分支是否已經和它的上游分支合併,如果沒有則會跳出提示訊息。 -D 則是無論是否進行過合併分支都要直接進行刪除,因此在使用上要特別小心。

重新命名分支(git branch -m <new-name>)

重新命名一個分支則是要確認自己目前「在」目標分支上,然後使用 -m 參數加上新名字來重新命名。

如果有使用過 git commit -m 來進行 commit 的話,可能會對 -m 這個參數感到混淆,這邊特別說明一下。在 git commit 時的 -m 參數是「message」的意思;而 git branch 時的 -m 參數則是「move」的意思。

在 command line 的世界裡,「move」可以用來移動檔案和重新命名。

1
2
# 把 abc.txt 重新命名為 123.txt
mv abc.txt 123.txt

文章內容如有錯誤,歡迎留言討論!


本 Blog 上的所有文章除特别聲明外,均採用 CC BY-SA 4.0 協議 ,轉載請註明出處!