> For the complete documentation index, see [llms.txt](https://git101.gitbook.io/gitlab/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://git101.gitbook.io/gitlab/er-git-ji.md).

# 二、Git基礎

Git指令基礎介紹

## 1. 初始化一個Git本地倉儲

假設這是一個全新的開始，我們要在個人PC上面找個資料夾讓Git落地生根，還記得第一章我們將HOME設定到D:\git下面嗎 ? 建議在HOME下開一個以你們組織為名的資料夾，在此資料夾延伸各專案資料夾。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-czoNxyToNqALFbRc%2F-LD-go_8M8nWosCvS1uf%2F2018_05_21_11_10_26_MINGW64_d_git_kenda_test.png?alt=media\&token=5f32db3f-7fd8-42bc-a162-bcea694c15d0)

上面這個範例做了幾件事情：

* 在HOME(\~)目錄下建立了kneda/test目錄
* 使用cd指令移至建立的目錄
* git init 將這個目錄初始化&#x20;

至此你會看到Git Bash上面顯示了master字樣，若仔細觀察，其實D:\git\kenda\test\也長出了.git目錄，未來在.git進行版控操作都會在這個目錄有所紀錄。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-czoNxyToNqALFbRc%2F-LD-iYa5mHASPrQy_LB8%2F2018-05-21%2011_24_03-.git.png?alt=media\&token=3ac06cd7-cc9e-4acc-a1d4-d60d9305e1ee)

## 2. 將本地倉儲連向遠端倉儲

現假設在遠端(此指[gitlab.kenda.com.tw](https://gitlab.kenda.com.tw/)) 並無建立倉儲，那我們必須在遠端建立一個倉儲，才能將本地指向遠端，進行版控管理。

### 2.1 建立並註冊SSH Key

在開始進行之前你必須先建立SSH Key讓並在個人帳號授權此SSH Key，才能讓gitlab信任。請跟著下列步驟操作：

![開啟Git GUI](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDplgW2wig4GBYR-Fk2%2F-LDpmM9npyJUOsWw7_2d%2Fimage.png?alt=media\&token=c5465a62-3930-4fa4-8ffc-b6f9f3b767da)

![Help→Show SSH key](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDplgW2wig4GBYR-Fk2%2F-LDpmPWBt7OAYVLhmsrc%2Fimage.png?alt=media\&token=28497d69-328d-4a96-b945-b37f79de575a)

![Generate Key](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDplgW2wig4GBYR-Fk2%2F-LDpmS6bi6uqmysA4ReE%2Fimage.png?alt=media\&token=e6815095-68f4-489e-b4a8-a8e06338fd37)

![輸入加密密碼(可選，若不輸入按OK即可)](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDplgW2wig4GBYR-Fk2%2F-LDpmX9aVang5FpgyKsM%2Fimage.png?alt=media\&token=63bdac94-1341-4200-9df1-c7d6186c1f1d)

![Copy To Clipboard](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDplgW2wig4GBYR-Fk2%2F-LDpmZBxmaZFikk-MvgM%2Fimage.png?alt=media\&token=e3652be6-abb1-4d09-b4d7-cb95b6d05345)

SSH Key 建立後回到gitlab進行註冊，右上角個人圖示，點選setting，進入設定畫面，頁面左方會有SSH Keys，點選後進入註冊頁面。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDplgW2wig4GBYR-Fk2%2F-LDpnIr3oZpG9UosbeJp%2Fimage.png?alt=media\&token=ac81605d-5364-460d-b589-e6733c1658bd)

在Key 這個欄位將剛剛複製的KEY貼上，並按下Add Key，即完成註冊。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDplgW2wig4GBYR-Fk2%2F-LDpndEgpbTWS_k5pGKq%2Fimage.png?alt=media\&token=2e042ca4-3666-4437-8c79-0b072954e4c4)

若你有留意，應該會發現gitlab會發送郵件到你的個人信箱，通知你已註冊了信任的SSH key。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDplgW2wig4GBYR-Fk2%2F-LDpodlDI_EQjjB78PlM%2Fimage.png?alt=media\&token=1b0aed68-749e-408d-a13b-4a2dbf78d874)

### 2.2 建立一個遠端倉儲

登入[gitlab.kenda.com.tw](https://gitlab.kenda.com.tw/)後選擇右上角綠色按鈕\[New project] > 選擇群組 (saxon) > 輸入 Project name (gittest) > 按下 \[Create project] 即建立完成。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-czoNxyToNqALFbRc%2F-LD-kgWV7RpXLP9l-aQm%2F2018-05-21%2011_30_20-Projects%20%C2%B7%20Dashboard%20%C2%B7%20GitLab.png?alt=media\&token=8cf41d6d-7f02-499d-9296-cc78f6189a82)

![測試群組一般選個人帳號，下面可以進一步選公開(Public)或私人(Private)。](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-czoNxyToNqALFbRc%2F-LD-kth8IMwNR4glX_V6%2F2018-05-21%2011_34_26-New%20Project%20%C2%B7%20GitLab.png?alt=media\&token=eb5b8403-99f3-4df1-8a86-529507f2f075)

接著頁面會自動切換到專案的初始頁面，並告訴你這個專案的**repository** 是空白的，並給你一些操作建議，因為我們早已初始化本地倉儲，這邊就跟著**Existing folder**的步驟操作

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-czoNxyToNqALFbRc%2F-LD-nU4tbpwETGVnkWJZ%2F2018-05-21%2011_44_27-MINGW64__d_git_kenda_test.png?alt=media\&token=5e6597a0-c011-431f-a545-15b2e00320f3)

上面這個範例做了幾件事情：

1. 在本地倉儲建立遠端倉儲連結 (此處將遠端倉儲命名為org\_test)
2. 建立README.md 檔案
3. 將本地倉儲加入暫存庫&#x20;
4. 提交當前暫存庫說明
5. 將本地倉儲分支(master) 推向遠端倉儲分支(org\_test/master)，並追蹤遠端分支。

至此你已建立本地與遠端倉儲的連結，並將本地的README.md推至遠端倉儲，你可以在gitlab按下重新整理，README.md即顯示在該頁面上。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-czoNxyToNqALFbRc%2F-LD-pSW9_SwY1NPt6esi%2F2018-05-21%2011_54_32-saxon%20_%20gittest%20%C2%B7%20GitLab.png?alt=media\&token=12f80d69-46f5-4a6a-ad98-582ad224eb8a)

### 2.3 檢查上面操作的指令

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-czoNxyToNqALFbRc%2F-LD-pdTPctBCVSRqO2hM%2F2018-05-21%2011_53_46-MINGW64__d_git_kenda_test.png?alt=media\&token=48640d7a-d267-40c1-9e77-bb88f6f4f5d3)

* git remote -v : 顯示所有的遠端倉儲與ssh網址
* git status : 顯示當前狀態，此處可以看到本地master與org\_test/master已連上
* git log : 顯示操作紀錄，此處可以看到剛剛的commit 操作紀錄，本地master，遠端org\_test/maste都在同一節點。

## 3. 紀錄變更到版本庫中

### 3.1 git status : 檢查狀態

在開始之前先介紹一下git status這個指令 這個指令的用途是用來查詢現在這個目錄的「狀態」，在\~/kenda/test/下執行這個指令

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-rODnf0hyA5n11GD7%2F-LD-t9RZ6ux2jNCRgNI2%2F2018-05-21%2012_10_36-MINGW64__d_git_kenda_test.png?alt=media\&token=ee21aae5-7ad0-405a-92c0-9947515228dc)

在這個目錄裡，現在除了 Git 幫你產生的那個 `.git` 隱藏目錄跟已經push過的README.md外什麼都沒有，所以上面這段訊息就是要跟你說「現在沒東西可以提交（nothing to commit）」。接下來，在這個目錄裡透過touch指令建立一個a名為mouse的空白檔案。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-rODnf0hyA5n11GD7%2F-LD-trZx_3RduBNcSfLx%2F2018-05-21%2012_13_44-MINGW64__d_git_kenda_test.png?alt=media\&token=4c6f4c54-e919-46e4-9b5d-de943730e599)

再次使用git status 檢查當前狀態，可以看到目前有一個Untracked的檔案，這代表mouse這個檔案，git尚未追蹤，還不認識它，它只是剛剛加入這個目錄而已。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-rODnf0hyA5n11GD7%2F-LD-u4nzX5sYgesKfGue%2F2018-05-21%2012_14_39-MINGW64__d_git_kenda_test.png?alt=media\&token=295cf2d0-8d02-4174-b036-859549897f94)

### 3.2 git add : 提交至暫存

既然這個檔案尚未追蹤，那我們要如何將它交給git，讓git追蹤它呢？我們接著下git add mouse，並再次下git status 檢查當前狀態，可以看到這個檔案(mouse)從 `Untracked` 變成 `new file` 狀態了。這個表示這個檔案已經被安置到暫存區(Staging Area)，等待稍後跟其它檔案一起被存到儲存庫裡。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-xL_aj3s87xHnuAVL%2F-LD-yCcThtvuueOZaaBh%2F2018-05-21%2012_32_42-MINGW64__d_git_kenda_test.png?alt=media\&token=05bdf118-f025-45cc-b76a-95aabca840da)

> 這裡的status可以看到(use "git reset HEAD \<file>..." to unstage)，這是git的貼心小提示，它告訴我們若要將檔案從暫存區移開，可以使用上述指令移開，這邊的例子是git reset HEAD mouse，即將mouse從stage改為unstage。

#### Q1 : 除了`Untracked` 以外，其他常見的檔案狀態？ 如果在 `git add` 之後又修改了那個檔案的內容？

試想一下我們剛剛將mouse add到暫存區，又再次echo一些資料到mouse這個檔案裡，現在的狀態是什麼？ 我們一樣透過git status一探究竟，可以看到除了new file外多出了modified，的狀態，代表檔案已經被修改過。 **對 Git 來說，echo的內容並沒有再次被加到暫存區，所以這時候在暫存區裡的資料還是你尚未echo資料前加進來的那個檔案。**&#x82E5;本次的修改也需要提交，請再次將檔案add。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD-xL_aj3s87xHnuAVL%2F-LD02PDJAjTRPzzTFMuN%2F2018-05-21%2012_54_28-MINGW64__d_git_kenda_test.png?alt=media\&token=00eabbac-1e59-4e92-b9c4-fe4b40be2b0a)

#### Q2 : 我好懶，不想檔名一個一個add怎麼辦？

> 我們可以使用`git add --all`，將當前目錄所有的檔案放置到暫存區。

#### Q3 :  有些檔案我不想add，該怎麼辦？

> 我們可以設定 `.gitignore` 將不需要add的檔案類型列在此檔案中，git會依照此清單過濾掉不需要add的檔案。
>
> 一般 `.gitignore`放在工作區下，此例為`D:\git\kenda\test\`，若無此檔案請手動新增一個。
>
> 可以重新產生的檔案(如編譯產生的檔案)，或沒必要放到正式區檔案(如log紀錄或暫存)，都應該放置到`.gitignore`中，以避免汙染遠端倉儲。

![上圖為.gitignore範例](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD1GtM2QgnYuCpQww1A%2F-LD4OSGcieGLrSE52giC%2Fimage.png?alt=media\&token=69db650d-6103-4fc6-bcb6-cad1e3080640)

### 3.3 git commit : 將暫存提交至本地倉儲

如果僅是透過 `git add` 指令把異動加到暫存區是不夠的，這樣還不算是完成整個流程。要讓暫存區的內容永久的存下來的話，使用的是 `git commit` 指令：

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD068qghmbihsKBODPg%2F-LD0BtIfA_dUjYNo3H9Q%2F2018-05-21%2013_36_58-MINGW64__d_git_kenda_test.png?alt=media\&token=befe0d7e-c977-4408-8dd3-08a14e22eb29)

在這個例子我們使用git commit -m " add mouse" 將這次的修改提交到本地倉儲，-m 將修改說明附加上去，若沒有使用-m 則會開啟預設的修改器，請你輸入。(若按第一章的設定會打開VS Code)

#### Q1: 這個訊息重要嗎 ?

很重要！在 Commit 的時候，如果沒有輸入這個訊息，Git 預設是不會讓你完成 Commit 這件事的。它最主要的目的就是告訴你自己以及其它人「這次的修改做了什麼」，若將來push到遠端庫，將萬世流芳。

**Q2：我什麼時候要commit ?**&#x20;

一般commit的時機是在，一個功能完成的時候，假設本次將為程式增加addfun()、modfun()、delfun()，三個功能，那麼建議在這三個功能分別完成時各commit一次，將來追蹤時也可以分別檢查三個功能個改了什麼。

### 3.4 git log : 檢視提交紀錄

為什麼說commit的說明將萬世流芳？ 我們透過git log 可以列出每次修改的commit紀錄，這樣的資訊未來push到遠端倉儲，也會一併更新上去。

下圖可以看到兩筆commit紀錄，紅字(org\_test/master)部分，是遠端倉儲master分支的位置，綠字部分master，是本地倉儲master分支的位置，從此處可看到，我們的修改已比遠端倉儲多了一個commit。藍字HEAD是一種指標，代表你在當前分支的位置，至於那串像亂碼的是每個commit的身分證字號。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD068qghmbihsKBODPg%2F-LD0E2Mm4ivexJ0Q-tj4%2F2018-05-21%2013_45_48-MINGW64__d_git_kenda_test.png?alt=media\&token=00f2b74a-6704-4e49-9ea1-d13501f82835)

#### Q1. 我想查某人改了提交了哪些修改紀錄怎麼做？

使用git log --author user\_id 可以簡單地取得該user\_id所有的修改紀錄。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDn_Wh39p816o2sRSCH%2F-LDn_w64OXKitf_4tKNE%2Fimage.png?alt=media\&token=20f6f141-8f88-4e38-903e-ffdc66a630ea)

#### Q2. 我想查特定commit的資訊怎麼做?

使用`git log --grep 'keyword'` 可以針對commit訊息進行搜尋。

> grep 是區分大小寫的，你可以添加 -i 以忽略大小寫。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDn_Wh39p816o2sRSCH%2F-LDnaNvWHvB-5ggp66df%2Fimage.png?alt=media\&token=f05d58f4-7b98-4734-8971-51e94cf5f0f4)

#### Q3. 我想查特定檔案的修改紀錄怎麼做?

使用`git log -p filename` 可以看到該檔案每個 commit分別修改了什麼。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LDn_Wh39p816o2sRSCH%2F-LDnb2oTwLu2dH7TDS4w%2Fimage.png?alt=media\&token=7962ad9e-2b77-4ad3-a1ad-8304e51a21b1)

### 3.5 git push : 更新至遠端倉儲

若我們已經確認本地修改無誤，commit也有正確說明了，就可以透過git push (**這裡沒有指定遠端倉儲跟分支是因為第一章已透過push -u 的指令設定過追蹤了，若你沒有追蹤，則需使用git push org\_test master**)將本地的修改跟commit資訊更新至指定遠端倉儲與分支。&#x20;

![ 從上圖可以看到遠端倉儲已從f2fef02更新到8749050 (即commit id前7碼)](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0MTUCVYhr0HiHBBiL%2F-LD0N1dbgjKdl0Zrz9JV%2F2018-05-21%2014_25_37-MINGW64__d_git_kenda_test.png?alt=media\&token=6b0ce23b-dba5-4cd1-81ed-caad3eb0ab83)

### 3.6 流程彙總 : 暫存、本地倉儲、遠端倉儲，好混亂?

講到這裡可能開始有點模糊，用下面這張圖簡單解釋一下。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD068qghmbihsKBODPg%2F-LD0HZB8e7E_hbml5nI7%2F2018-05-21%2014_01_39-\(294\)%20Pinterest.png?alt=media\&token=13ceeaa6-dfcd-4869-9d63-9170922a8016)

* **workspace :** 當前專案目錄，本例是指D:\git\kenda\test\\
* **index :** 即保存被add 並stage檔案的暫存庫，
* **local repository :** 本地版控倉儲，即保存本地所有commit的倉儲。
* **remote repository :** 遠端版控倉儲，即保存各開發者commit資訊的倉儲，本例是指gitlab上的org\_test/master。

從圖中可以看到我們在專案目錄所有的新增/修改/刪除，都須透過git add指令才能提交到暫存區(藍色箭頭)，並再透過commit提交到本地倉儲(綠色箭頭)，至此我們所有的操作都只在個人電腦生效，並未對遠端倉儲進行任何變更，而再透過push指令，則會將本地倉儲的資訊更新至遠端倉儲(黃色向右箭頭)。

## 4. 復原 : 我需要時光機...

{% hint style="info" %}
**注意 : 這些指令並不是總會生效，甚至可能造成資料遺失，因此你提交commit之前都必需慎重考量，而不是依賴這些指令復原。**

**另外：已經push到遠端的commit，是永遠無法修改/刪除的。**
{% endhint %}

### 4.1 git commit --amend

當你提交（commit）後發現寫錯了提交訊息，你可以在提交命令上使用 `--amend` 選項。這個命令會再次把暫存區（staging area）拿來提交，若你加上 -m 選項並輸入新的commit訊息，即更新了commit訊息。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0Oq82TgFKsPZp9pV4%2F-LD0S88CIKRufrzZhXV-%2F2018-05-21%2014_47_29-MINGW64__d_git_kenda_test.png?alt=media\&token=6f7e80dc-e03e-4876-92ec-67923de7b510)

&#x20;如果你提交後才意識到你想要把某些忘記預存（stage）的修改也一併加入到上一個提交中，你可以這樣做：

![從圖中可以看到多了forgot檔案，並修改了commit訊息](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0Oq82TgFKsPZp9pV4%2F-LD0TUjDbMjo-Chx1zGM%2F2018-05-21%2014_53_39-MINGW64__d_git_kenda_test.png?alt=media\&token=46d6f876-e282-48b7-8091-a1613c82dd24)

### 4.2 git reset&#x20;

假設你已經修改了二個檔案，並且想要分別add它們，但是你卻意外地使用 `git add *` 把它們二個都預存了， 要如何將其中一個「移出預存區（unstage）」呢？ `git status` 命令提示你：

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0elEBpTuvMeTMtmid%2F-LD0g0cldHGClKhgkaju%2F2018-05-21%2015_52_42-MINGW64__d_git_kenda_test.png?alt=media\&token=0c5f50ae-41cc-4dae-95ad-203cec75bab6)

reset 還能怎麼用？假設想拆掉最後一次的commit，可以使用`git reset HEAD^`，將當前指向的commit往前推進，下圖可以看到效果，原本 " add mouse and forgot\_file " 的commit消失了。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0elEBpTuvMeTMtmid%2F-LD0ntd3njWOC_64BVBk%2Fimage.png?alt=media\&token=46465940-c539-4926-84ca-89503a197d94)

但真的是消失了嗎? 我們再透過git log --all，將所有的分支納進來看，可以看到遠端庫org\_test/master，依然指向add mouse，所以…push至遠端的commit是無法修改的。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0elEBpTuvMeTMtmid%2F-LD0oJ9UYS6NqY7WycjS%2Fimage.png?alt=media\&token=2a4dc4a7-c3bc-49aa-87c4-5626d28cfea5)

### 4.3 git checkout

把檔案改爛了怎麼辦？  假設有一檔案，我們修改了幾次，發現修改方向錯誤，想要還原到完全未修改的狀態，我們可以使用git checkout來還原。下圖例echo '123'到mouse中，並透過cat顯示echo後的結果，接著進一步使用git checkout後，cat 出來的資料已經沒有123了。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0elEBpTuvMeTMtmid%2F-LD0pgLhEpalRcYYI0RO%2Fimage.png?alt=media\&token=9b12f74c-4b1e-4f5b-af1d-afcebd62c2e0)

## 4. 使用分支

### 4.1 git branch

如果 `git branch` 後面沒接任何參數，它僅會印出目前在這個專案有哪些分支。Git 預設會幫你設定一個名為 `master` 的分支，前面的星號 `*`表示現在正在這個分支上。

![從圖中可以看到我們只有一個分支(master)](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD0t52Wek7OGeUbQY0S%2Fimage.png?alt=media\&token=9fbaf87d-c35b-42bf-ae28-c18eb318ee98)

#### 4.1.1 新增分支&#x20;

要增加一個分支，就是在執行 `git branch` 指令的時候，在後面加上想要的分支的名字：

![從圖中看到有多一個分支，但現分支還是在 master 上](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD0wHgS2xFtde0oJB0Y%2Fimage.png?alt=media\&token=9640bed1-43d3-47bf-892a-07dc0c1984d4)

**4.1.2 切換分支**

透過git checkout 可以切換到另一個分支：

![從圖中可以看到分支從master切到cat了(藍括號)](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD0whEcVbGAQDhAQ5zZ%2Fimage.png?alt=media\&token=7ba17fa9-cba9-4be0-8819-2c9b078e7070)

**4.1.3 刪除分支**

透過git branch -d 可以刪除分支：

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD0zqKro_jIWAW1jP76%2Fimage.png?alt=media\&token=ebec86f2-1184-4c13-aecf-2facaf24c744)

咦? 為什麼刪不掉? 原來git 有自我保護機制，不能刪除自身分支，必須先切換到另一個分支才能進行刪除，先切換到master再刪除就可以了！

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD1-TtFkdecTXmuQX0U%2Fimage.png?alt=media\&token=d2a0f7df-3c42-44f8-acd0-2dd906569221)

#### 4.1.4 **分支名稱不喜歡怎麼辦 ?**

透過-m 可以修改分支名稱：

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD0x5oYxSQ1C7bG89Eo%2Fimage.png?alt=media\&token=377c2fe3-a5af-4e5a-9b62-3c2ea7e7cc76)

### 4.2 開始玩分支

我們嘗試在tiger分支上建立一個檔案tiger並提交commit，

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD121frAgdL9cxMu3oV%2Fimage.png?alt=media\&token=2fbfa590-3f4b-40d0-a471-e04a97adfb21)

在使用git log --all看一下現在分支長什麼樣，從下圖可以看到tiger分支的位置在" add tiger"，而master仍留在"add mouse"，兩個分支的指標已經分離了。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD12oh8FytL5vf_qnlx%2Fimage.png?alt=media\&token=87eb7763-5144-42de-8344-4f4d6c983c64)

我們再進一步看一下，分支檔案的變化，tiger分支下方可以看到檔案tiger的存在，透過checkout 切換到master，可以發現到檔案tiger不見了。這正是分支的作用，透過切換分支可以不影響到原本正常作業的master分支，因此做任何修改之前，都應該從master分支切出新的分支來。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD14IqEOZJ7q-w4LK27%2Fimage.png?alt=media\&token=245fab78-45c1-492b-8078-ec94abca7f39)

#### 4.3 合併分支

tiger分支的任務若已經結束了，那麼我們應該將tiger分支的修改結果合併到master來。首先我們要切換到master分支，再透過git merge將tiger併進master來。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD19iIyr9iiv-hwl8aO%2Fimage.png?alt=media\&token=d81db3a0-462c-4eb7-8eca-d762091f52d1)

看一下檔案列表，在master分支下也可以看到tiger了。

![](https://1097490385-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LD-JPDFN1rdALMBeWB4%2F-LD0sts8X1sSCV9L0ecf%2F-LD1B28nC6EQXa2wch8_%2Fimage.png?alt=media\&token=07d541e8-891b-49a2-99a1-c27027888e1d)
