---
# System prepended metadata

title: Squash Merge v.s. Merge
tags: [git]

---

# Squash Merge v.s. Merge

###### tags: `git`

## 優點

在 github 上使用，每個 commit 可以直接看到屬於哪個 PR。

## 缺點

- 如果刪掉開發的 branch，離開 github 後，就難以 trace 每個 branch 內的開發過程。
  > 不要離開 github 就好，讚讚讚

- 需要 rebase，如果沒有正確 rebase 容易 conflict。
  > 正確使用應該就不算缺點？


### Conflict 狀況

有 a, b, c 三個在開發中的 branch：
![](https://i.imgur.com/4fYefDM.png)

假設：
- a 先完成，merge 進 master。
- c 完成， merge 進 master。
- b 想要在有 `c.txt` 的狀況下繼續開發，所以要 merge master。


#### 用 merge

merge 完 a, c 後 checkout 到 b 的狀態：
![](https://i.imgur.com/wpcVUCR.png)

這時 `git merge master` 就很順利，不會有任何 conflict，直接 merge 完成：
![](https://i.imgur.com/cef2QFp.png)


#### 用 squash merge

merge 完 a, c 後 checkout 到 b 的狀態：
![](https://i.imgur.com/8GRGVZg.png)

這時 `git merge master` 就會產生 conflict:
![](https://i.imgur.com/MSBvrqt.png)

##### 解法

merge 完 a, c 後，b 先 rebase master 上 squash merge a 的 commit
![](https://i.imgur.com/gYayoPg.png)

再 merge master
![](https://i.imgur.com/L19uq6A.png)
