---
# System prepended metadata

title: '[Git] Branch分支'
tags: [Git]

---

#    [Git] Branch分支
###### tags: `Git`

### 1. 加入Poem1.txt
```
git init
git add .
git commit -m 'Add poem1.txt'
```

### 2.建立分支
```
git branch lee-by
```
* 從特定分支(lee-by)，建立新的分支(lee-by2)
```
git branch lee-by2 lee-by
```
![](https://i.imgur.com/dcxYQs2.png)
* 建立檔案2 Poem2.txt並commit
```
git add .
git commit -m 'Add poem2.txt'
```
### 3. 切換分支
* 切換後並建立檔案3 Poem3.txt並commit
```
git checkout lee-by
git add .
git commit -m 'Add poem3.txt'
```

#### 此時master分支只有Poem1&2.txt
#### lee-by分支只有Poem1&3.txt

### 4. 利用gitk顯示分支
```
git --all
```
![](https://i.imgur.com/veBQsux.png)
```
git log --grahp --oneline --all --decorate
```
![](https://i.imgur.com/t3JmpWM.png)

### 5. 合併分支
1. 切到A分支
2. B合併到A
3. 刪除B分支
```
git checkout A
git merge B
git branch -d B
```

#    [Cherry-Pick] 處理指定的commit節點版本

```
git cherry-pick commit 節點辨識碼或標籤
```
* 預設建立新節點，加入-n則不建立
* 修改檔案必須先存入Git檔案庫
* 衝突發生時
    * 放棄執行，回到原本狀態
    ```
    git cherry-pick --abort
    ```
* 衝突處理好
    ```
    git add .
    git cherry-pick --continue
    ```
    
#    主分支的修改，合併到開發中的分支
###    rebase指令的使用
* 代替merge指令
* 避免分支與主分支互相交織的網狀型態，最後再合併到主分支
![](https://i.imgur.com/kQP55EJ.png)
```
git checkout 分支名稱
git rebase master
```
* 放棄本次rebase回到上一步
```
git rebase --abort
```
* 解決衝突後
```
git add .
git rebase --continue
```

# HEAD是甚麼?
* 代表當前分支的最新提交名稱
* 建立新的數據庫時，Git會預設HEAD指向master分支
![](https://i.imgur.com/mymfGoC.png)
([圖片參考網址](https://backlog.com/git-tutorial/tw/stepup/stepup1_3.html))
    * 用~(Tilde)和^(caret)，指向某個提交的相對位置
        * ~(Tilde）可以指向第幾代的父代
        * ^(caret) 可以指向幾世代以前的父代

### reflog查詢舊HEAD資料
* 查詢HEAD 或
* 查詢任何分支變動的紀錄
```
git reflog HEAD 或任何分支名稱
```
![](https://i.imgur.com/vWeO0Bd.png)
![](https://i.imgur.com/YFeDznU.png)
* {0}表示目前最新的commit節點
* 時間越早的顯示越下面


