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/master、origin/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。
參考資料
- GitHub 的 pull request merge 說明用來確認 squash merge 會在 base branch 建立一顆包含 PR 內容的新 commit。
- GitHub Docs: About pull request merges
- GitHub 的 merge pull request 說明用來確認 PR merge 後刪除 head branch 的行為。
- GitHub Docs: Merging a pull request
- Git 官方文件用來確認
git pull --ff-only與git fetch --prune的行為。 - Git: git-pull Documentation
- Git: git-fetch Documentation