GitHub Fork Pull Request Base Repository Trap
問題
今天要替自己的 vimrc 開 PR,本機 remote 已經是正確的:
1
2
origin https://github.com/chiahao/vimrc.git
upstream git://github.com/vgod/vimrc.git
branch 也已經 push 到自己的 repo:
1
git push -u origin fix-markdown-preview-tab-size
但打開這個網址:
1
https://github.com/chiahao/vimrc/pull/new/fix-markdown-preview-tab-size
GitHub 卻自動導到:
1
https://github.com/vgod/vimrc/compare/master...chiahao:vimrc:fix-markdown-preview-tab-size?expand=1
也就是 PR 目標變成 upstream 的 vgod/vimrc,不是自己的 chiahao/vimrc。
原因
chiahao/vimrc 和 vgod/vimrc 有 fork / upstream 關係。
所以 GitHub 某些 PR 入口會把 base repository 預設成 upstream:
1
2
3
4
5
base repository: vgod/vimrc
base: master
head repository: chiahao/vimrc
compare: fix-markdown-preview-tab-size
這不是 git push 推錯,也不是本機 remote 設錯。這是 GitHub PR 頁面預設目標的問題。
正確檢查
開 PR 前固定看三件事:
1
2
3
base repository
base branch
compare branch
這次正確目標應該是:
1
2
3
4
5
base repository: chiahao/vimrc
base: master
head repository: chiahao/vimrc
compare: fix-markdown-preview-tab-size
如果 GitHub 顯示的是同一個 repo 內的 PR,可能只會看到:
1
2
base: master
compare: fix-markdown-preview-tab-size
那就再看網址列,確認是在:
1
github.com/chiahao/vimrc
比較保險的 URL
這次最後用這種 compare URL:
1
https://github.com/chiahao/vimrc/compare/master...fix-markdown-preview-tab-size?expand=1
它比 pull/new/<branch> 更清楚:
- repo 是
chiahao/vimrc - base 是
master - compare 是
fix-markdown-preview-tab-size
但還是要在送出前看 base repository。
公司 GitLab 會不會遇到
要看公司採用哪種工作流程。
GitLab 官方文件列出的 MR 常見流程包含兩種:
- 開發者直接 push feature branch 到同一個 project,再開 MR 合回受保護分支
- 使用 fork workflow,開發者在自己的 fork 裡工作,再開 MR 到 upstream project
這段依據 GitLab 的 Merge request workflows 文件。
如果公司是同一個 project 內開 feature branch:
1
2
team/project:feature-branch
→ team/project:main
就比較不會遇到這次的問題,因為 source project 和 target project 是同一個。
如果公司用 fork workflow:
1
2
user/project:feature-branch
→ team/project:main
就會有類似概念。GitLab 官方文件也說,從 fork 建 MR 時,預設目標是 upstream repository,不是 fork 本身。
所以公司不一定「應該」用 fork。選擇通常取決於權限模型:
- 小團隊或內部專案:常見是同 repo feature branch + protected branch
- 權限隔離較嚴格,或不想讓一般開發者 push 到主 repo:可以用 fork workflow
不管是哪一種,開 MR 前都要確認:
1
2
3
4
source project
source branch
target project
target branch
記住
本機 remote 正確,不代表 GitHub / GitLab PR 或 MR 頁面的目標 project 一定正確。
送出前多看一次:
1
2
3
4
target repo / project
base or target branch
source repo / project
compare or source branch
這幾秒鐘可以避免把 PR / MR 送到錯的地方。
參考資料
- GitHub 的 fork PR 說明用來確認 GitHub base / head repository 的概念。
- GitHub Docs: Creating a pull request from a fork
- GitLab 的 Forks、Create merge requests、Merge request workflows 文件用來確認 fork MR 的預設目標與常見 MR 流程。
- GitLab Docs: Forks
- GitLab Docs: Create merge requests
- GitLab Docs: Merge request workflows