---
# System prepended metadata

title: Git Rebasing
tags: [Git/GitHub]

---

# Git Rebasing
###### tags: `Git/GitHub`


## Comparision: `git rebase`, `git rebase -i`

> ### 1. `git rebase <branch>`: as an alternative to merging 
> ### 2. `git rebase -i <previousCommit>`: as a cleanup tool

<br/>

---

## `git rebase <branch>`
>除了 merging之外的另一選擇

###  `git merge` 在協同開發時的問題

<img src="https://i.imgur.com/UFa4yz2.png" width="400px">

:arrow_up: 同時有很多branch，想要 update 到最新的版本的話，我們的 commit 紀錄會有很多是 merge

![](https://i.imgur.com/VD5ZR67.png)

:arrow_up: 情境A

<img src="https://i.imgur.com/QK0XSqS.png" width="300px">

:arrow_up: 情境B


### 實際使用 `git rebase <branch>` 遇到 conflict 的處理方式

#### resolve conflict =>`git add` => `git rebase --continue`
<!-- 遇到 conflict，需要解掉，git add 以後，再做 `git rebase --continue`  -->


<br>

---

## `git rebase -i` : Interactive Rebasing
> ### as a commit cleanup tool
> #### REWRITE, DELETE, RENAME, or even REORDER commits

### Concepts

![](https://i.imgur.com/fAbfvOR.png)

- 不是與其他 branch 作用，而是<u>基於 HEAD 所在位置</u>，操作目前所在的 branch 先前的 commits
- 使用 **`git rebase -i`** 會讓我們進入一個 interactive mode
- 我們需要指定從多遠以前的 commit 開始做進一步操作我的的 commit

<br>

### `git rebase -i` 在 interactive mode 的操作關鍵字

- **`pick`** : 使用這個 commit（沒有變動，開始 interactive mode 預設都是 pick）
- **`reword`** : 使用這個 commit，但是 編輯 commit 的資訊
- **`drop`** : 移除這個 commit
- **`squash`** : 使用這個 commit，並且與其他 commit 合併
- **`edit`** （沒用過，之後補）
- **`fixup`**（沒用過，之後補）

![](https://i.imgur.com/EuWgkLX.png)

### 各種操作關鍵字使用時機
> 個人經驗分享

#### `drop` 使用時機
有某個 commit 不想要了，例如為了要做測試，暫時 hard coded 一些變數，方便後續開發，把這段 hard-coded 的東西單獨做成一個 commit ，可以直接拿掉

#### `squash` 使用時機
有一些暫存的 commit（例如午休或下班） ，並不是真的 code 開發的一個階段，可以合併掉

#### `reword` 使用時機
要發 PR 時候，發現自己的 commit 亂寫，或是有 typo

---

### GitLens 設定

![](https://i.imgur.com/TuE7jI8.png)

In terminal
```
git config --global core.editor "code --wait"
```

