Post

GitHub Pull Request Cleanup After Squash Merge

GitHub Pull Request Cleanup After Squash Merge

1. squash merge

GitHub 的 Squash and merge 會把 PR branch 裡的 commits 合成一顆新的 commit,放到 base branch。

例如原本 PR 裡有兩顆 commits:

1
2
fix commit
comment commit

合進 master 後,GitHub 產生一顆新的 commit:

1
bace99e Fix markdown preview tab width (#1)

所以本機原本的 feature branch 和 GitHub 上 master 的歷史不會是同一條 commit 鏈。內容可能一樣,但 commit hash 不同。

這也是為什麼 merge 後不用再保留 feature branch:正式歷史已經在 master 上了。

2. 刪除分支

PR merge 完後,GitHub 會提示 feature branch 可以刪掉。

在 GitHub 頁面按:

1
Delete branch

這是刪 GitHub 上的 feature branch,例如:

1
fix-markdown-preview-tab-size

不是刪 master,也不是刪本機 branch。

GitHub 上刪掉後,本機可能還留著兩種東西:

  • 本機的 feature branch
  • 本機記住的 remote-tracking branch,例如 origin/fix-markdown-preview-tab-size

所以接下來要整理本機。

3. 更新本機 master

先回到本機 master

1
git switch master

再從 GitHub 更新:

1
git pull --ff-only origin master

只允許 本機 master 在只落後 origin/master 時,Git 才會把指標往前移

4. 刪本機 feature branch

GitHub 上的 feature branch 已經刪了,但本機的 branch 還在。

可以刪掉:

1
git branch -d fix-markdown-preview-tab-size

-d 是比較保險的刪除方式。Git 會檢查這個 branch 是否已經被目前歷史包含;如果 Git 判斷還沒合進來,就會拒絕刪除。

如果是 squash merge,有時 Git 不一定能用 commit hash 判斷「這些 commits 已經被合併」,因為 squash 會產生新 commit。這時候要先確認內容確實已經在 master,再決定是否需要用 -D

5. 清掉本機的遠端 branch 紀錄

GitHub 上按 Delete branch 之後,本機還可能記著:

1
origin/fix-markdown-preview-tab-size

這不是 GitHub 上真的還有 branch,而是本機的 remote-tracking branch。

用這個清掉:

1
git fetch --prune

清掉成功:

1
- [deleted]         (none) -> origin/fix-markdown-preview-tab-size

6. 檢查收尾狀態

看本機 branch:

1
git branch -vv

正常狀態可能像這樣:

1
* master bace99e [origin/master] Fix markdown preview tab width (#1)

看工作區:

1
git status --short --branch

正常狀態:

1
## master...origin/master

看圖形紀錄:

1
git log --oneline --decorate --graph --all -8

重點是看到:

1
* bace99e (HEAD -> master, origin/master, origin/HEAD) Fix markdown preview tab width (#1)

這代表本機 master、GitHub 的 origin/masterorigin/HEAD 都對到同一顆 commit。

PR merge 後要分清楚三種東西:

  • GitHub 上的 feature branch
  • 本機的 feature branch
  • 本機記住的 remote-tracking branch

常見收尾順序:

1
2
3
4
5
git switch master
git pull --ff-only origin master
git branch -d feature-branch
git fetch --prune
git status --short --branch

如果用了 squash merge,要記得:PR 裡原本的 commits 不會原封不動進 master,GitHub 會產生一顆新的 commit。

參考資料

This post is licensed under CC BY 4.0 by the author.