Git 分支、標籤、暫存檔案

在公司或團隊中,與其他人一起分工工作時,分支 (branch) 是相當重要的觀念,這篇文章應該是 Git 筆記中內容相對複雜的一篇。

分支

簡介:什麼是分支

通常 master 是指 release 給客戶,完成度較高的版本
我們平常 commit 上去的版本紀錄,就是 master

但是,有時候我們修改 Bug 或是增加新功能之後
想要上傳看看,卻又怕把原版的其他部分改壞
這時候我們通常會再開一條新的 branch

這條新的線就是 develop
通常在確認好開發完成以後,才會加入、合併到正式上線的版本 (master)

這樣就不用擔心公司上傳給客戶的版本檔案之中,有些地方被工程師改壞哩 :P

HEAD - 目前所在位置的指標

HEAD 可以幫助我們瞭解目前所在的位置

  • git branch 瀏覽目前分支

  • git checkout 分支名稱 切換分支

    分支名稱輸入前 4 碼即可,要輸入前 5, 6, 7, 8 碼也行

  • git checkout master 復原成 master

分支創立

為什麼我們要自虐新增一堆分支,搞得這麼複雜呢?
原因在上面有說過,是因為藉由分支,可以避免開發者把檔案改得很亂
讓他們先在分支改完之後,才合併到 master 裡面

  • git branch 分支名稱 分支創立

創立新 branch 後,就可以用 git checkout feature1 切換至 feature1 的分支了

切換至 feature1 分支後,我們編輯與上傳的檔案就只會在 feature1 之中
如果再切換回 master,我們進行的改變就會復原哩 :D

分支合併

  • git merge 分支名稱 合併指定分支到目前的分支

以下說明如何把 master 跟 feature1 合併在一起
合併流程:

  1. git checkout master 把 HEAD 切換到 master
  2. git merge feature1 把 feature1 合併到 master
1
2
3
4
5
6
7
$ git merge feature1
Updating 8bdd94c..957b6f5
Fast-forward
css/all.css | 0
index.html | 3 ++-
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 css/all.css

這樣 master 就會出現 feature1 修改過後的檔案了

分支衝突

自動合併

那如果有一個團隊在改 master,另一個在做 feature1,會不會產生衝突呢?產生衝突又該如何解決?

這邊我就直接 show 一下衝突出現的畫面

GITHUB

這是內容可以直接補過來而出現的 vim 編輯器畫面
不過如果出現這個畫面不用太擔心
直接關掉或輸入 wq! 就可以了!
因為這只是一個提醒的作用 :P

另一種衝突是需要進行更改取捨的,通常是合併後的檔案有增減的狀況
這時候編輯器 (例如 VSCode) 上會顯示你要保留哪一個分支的內容,這時候就要慎選哩 :P
下面就來介紹另一種衝突情況吧!

解決衝突 - 手動合併

剛才提到有一個比較棘手的情況,就是兩位工程師寫的東西衝突到了,導致沒辦法自動合併,這種情況該如何解決呢?

首先,我們先假設小明與漂亮阿姨正在一起寫 Code!

這是小明 (master) 寫的 index.html

GITHUB

這是漂亮阿姨 (feature1) 寫的 index.html

GITHUB

寫完之後,兩人想要合併檔案
於是就在 master 輸入 git merge feature1
結果出現了合併衝突的訊息

GITHUB

訊息內容白話翻譯:本來打算幫你自動合併,但是發現內容有衝突,你需要先修正衝突之後,才能解決這個問題。

接著切換回編輯器,我們會看到下面多出一堆 > = < 的符號

GITHUB

這是在告訴你
上面那行 h1 是 HEAD (也就是 master) 的
下面那行 h1 是 feature 的

這邊我們就貪心一點,兩個都保留下來 :D

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="all.css">
</head>
<body>
<h1>master</h1>
<h1>feature</h1>
</body>
</html>

儲存成功之後,因為沒辦法 merge
所以我們輸入 git add . 以及 git commit -m 'merge feature1 css' 上傳檔案即可

簡單來說,這種方式就是 手動合併 的意思
通常會手動合併,都是因為沒辦法自動合併的時候

標籤

標籤提供查看之前版本的功能,同時還能增加備註
例如:v1, v2

  • 查詢標籤:git tag
  • 查詢詳細標籤:git tag -n

    沒特別新增備註的標籤,預設會顯示 commit 的內容

  • 刪除標籤:git tag -d 標籤名稱

    刪除標籤不會刪除掉 commit 的內容

  • 新增輕量標籤:git tag 標籤名稱

    單純加標籤

  • 新增標示標籤:git tag -am "標註內容" 標籤名稱

    詳細的標籤,可以加一些備註

  • 切換到標籤的 commit:git commit 標籤名稱

    可以回到該版本,查看該標籤版本的歷史紀錄
    可以再用 git commit master 回到 master 線

暫存檔案

情境
小明正在開發 A 專案 (master)
結果 coding 到一半時,主管跑來交代小明新的 B 專案 (issue)
並告訴小明 B 專案比較緊急,要小明優先處理這個 issue
但是小明不想把目前未完成的檔案 commit 上去
那麼他該如何 暫時儲存 手上正在開發的檔案呢?

答案:使用 stash 儲存工作目錄與索引
git stash

那原本的檔案跑哪去了呢?
git stash list

好,那現在小明處理好 issue 了
要怎麼叫回之前的東西呢?
git stash pop

所以 stash 的好處就是,我們可以把開發中的東西先儲存起來,後續再將它們召喚回來

召喚回來之後,小明可以使用 git stash drop 清除最新的一筆暫存

git stash clear 可清除全部暫存

以上資源是我自己整理過後的筆記,若有錯誤歡迎隨時和我聯繫。