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 合併在一起
合併流程:
git checkout master
把 HEAD 切換到 mastergit merge feature1
把 feature1 合併到 master
1 | $ git merge feature1 |
這樣 master 就會出現 feature1 修改過後的檔案了
分支衝突
自動合併
那如果有一個團隊在改 master,另一個在做 feature1,會不會產生衝突呢?產生衝突又該如何解決?
這邊我就直接 show 一下衝突出現的畫面
這是內容可以直接補過來而出現的 vim 編輯器畫面
不過如果出現這個畫面不用太擔心
直接關掉或輸入 wq! 就可以了!
因為這只是一個提醒的作用 :P
另一種衝突是需要進行更改取捨的,通常是合併後的檔案有增減的狀況
這時候編輯器 (例如 VSCode) 上會顯示你要保留哪一個分支的內容,這時候就要慎選哩 :P
下面就來介紹另一種衝突情況吧!
解決衝突 - 手動合併
剛才提到有一個比較棘手的情況,就是兩位工程師寫的東西衝突到了,導致沒辦法自動合併,這種情況該如何解決呢?
首先,我們先假設小明與漂亮阿姨正在一起寫 Code!
這是小明 (master) 寫的 index.html
這是漂亮阿姨 (feature1) 寫的 index.html
寫完之後,兩人想要合併檔案
於是就在 master 輸入 git merge feature1
結果出現了合併衝突的訊息
訊息內容白話翻譯:本來打算幫你自動合併,但是發現內容有衝突,你需要先修正衝突之後,才能解決這個問題。
接著切換回編輯器,我們會看到下面多出一堆 > = < 的符號
這是在告訴你
上面那行 h1 是 HEAD (也就是 master) 的
下面那行 h1 是 feature 的
這邊我們就貪心一點,兩個都保留下來 :D
1 |
|
儲存成功之後,因為沒辦法 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
可清除全部暫存
以上資源是我自己整理過後的筆記,若有錯誤歡迎隨時和我聯繫。