Post

GitHub Fork Pull Request Base Repository Trap

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/vimrcvgod/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 送到錯的地方。

參考資料

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