
GitHubのデフォルトブランチを変更するときは既存のPull RequestのBaseブランチも忘れずに変更する(GitHub CLI)
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部 IoT事業部の若槻です。
GitHubの新規Repositoryのデフォルトブランチの名前はかつてmasterでしたが、2020/10よりmainに変更されました。
私はこのアップデート後もしばらくの間は、アップデート以前に作成したRepositoryはブランチ名をmasterのまま使い続けていましたが、最近になって既定でmainで作成されたRepositoryがほとんどを占めて来たため、すべてのRepositoryでmainに統一したくなりました。
そこでmasterのままになっているRepositoryのデフォルトブランチをmainに変更する操作を行ったのですが、その際に既存のPull RequestのBaseブランチを忘れずに変更する必要があったので、対処内容を書き残しておきます。
デフォルトブランチをmainに変更
ローカルのブランチ名をmasterからmainに変更してリモートにPushします。
git branch -m master main git push -u origin main
次にGitHub側のBranchesでデフォルトブランチをmainに変更します。

あとはリモートからmasterブランチを削除すれば変更は完了なのですが、masterをBaseブランチとしているPull Requestが残っているので、masterを削除するとPull Requestは自動でクローズされるという警告が表示されます。

勝手にクローズされては困りますし、(いずれにせよ対応としては必要なので)masterを削除する前に既存のPull RequestのBaseブランチをmainに変更します。
既存のPull RequestのBaseをmainに変更
Open中のPull Requestの数が結構あるので、Baseブランチの変更はGitHub CLIを使って行います。
$ gh --version gh version 2.14.4 (2022-08-10) https://github.com/cli/cli/releases/tag/v2.14.4
gh pr listでPull Request一覧を出力してみると、masterをBaseとしたものが20近く残っていますね。これらをGUIから一つずつ変更するのは大変なのでCLIで対応しましょう。
$ gh pr list --json number,baseRefName --jq '.[]'
{"baseRefName":"main","number":1612}
{"baseRefName":"main","number":1608}
{"baseRefName":"master","number":1602}
{"baseRefName":"master","number":1599}
{"baseRefName":"master","number":1598}
{"baseRefName":"master","number":1590}
{"baseRefName":"master","number":1557}
{"baseRefName":"master","number":1553}
{"baseRefName":"master","number":1540}
{"baseRefName":"master","number":1535}
{"baseRefName":"master","number":1531}
{"baseRefName":"master","number":1529}
{"baseRefName":"master","number":1526}
{"baseRefName":"master","number":1524}
{"baseRefName":"master","number":1521}
{"baseRefName":"master","number":1513}
{"baseRefName":"master","number":1477}
{"baseRefName":"master","number":1440}
{"baseRefName":"master","number":1433}
{"baseRefName":"master","number":1430}
{"baseRefName":"master","number":1416}
--jqオプションではjqのクエリが使用できます。selectクエリを使えばbaseRefNameがmasterであるPull request一覧を取得できます。
$ gh pr list --json number,baseRefName --jq '.[] | select(.baseRefName == "master") | .'
{"baseRefName":"master","number":1602}
{"baseRefName":"master","number":1599}
{"baseRefName":"master","number":1598}
{"baseRefName":"master","number":1590}
{"baseRefName":"master","number":1557}
{"baseRefName":"master","number":1553}
{"baseRefName":"master","number":1540}
{"baseRefName":"master","number":1535}
{"baseRefName":"master","number":1531}
{"baseRefName":"master","number":1529}
{"baseRefName":"master","number":1526}
{"baseRefName":"master","number":1524}
{"baseRefName":"master","number":1521}
{"baseRefName":"master","number":1513}
{"baseRefName":"master","number":1477}
{"baseRefName":"master","number":1440}
{"baseRefName":"master","number":1433}
{"baseRefName":"master","number":1430}
{"baseRefName":"master","number":1416}
BaseブランチがmasterのPull RequestのNumber一覧を改行区切りで取得します。
$ pulls=$(gh pr list --json number,baseRefName --jq '.[] | select(.baseRefName == "master") | .number') $ echo $pulls 1602 1599 1598 1590 1557 1553 1540 1535 1531 1529 1526 1524 1521 1513 1477 1440 1433 1430 1416
各Numberに対してgh pr editを実行し、Baseブランチをmainに変更します。
echo $pulls | while read line do gh pr edit $line --base main done
再度Pull Request一覧を出力してみると、すべてでBaseブランチがmainに変更できていますね!
$ gh pr list --json number,baseRefName --jq '.[]'
{"baseRefName":"main","number":1612}
{"baseRefName":"main","number":1608}
{"baseRefName":"main","number":1602}
{"baseRefName":"main","number":1599}
{"baseRefName":"main","number":1598}
{"baseRefName":"main","number":1590}
{"baseRefName":"main","number":1557}
{"baseRefName":"main","number":1553}
{"baseRefName":"main","number":1540}
{"baseRefName":"main","number":1535}
{"baseRefName":"main","number":1531}
{"baseRefName":"main","number":1529}
{"baseRefName":"main","number":1526}
{"baseRefName":"main","number":1524}
{"baseRefName":"main","number":1521}
{"baseRefName":"main","number":1513}
{"baseRefName":"main","number":1477}
{"baseRefName":"main","number":1440}
{"baseRefName":"main","number":1433}
{"baseRefName":"main","number":1430}
{"baseRefName":"main","number":1416}
これによりmasterブランチが問題なく削除できるようになりました。

おわりに
GitHubのデフォルトブランチを変更するときは既存のPull requestのBaseブランチも忘れずに変更しようということで対応してみました。
個人的にはmasterよりもmainの方が文字数が少なくて打鍵もしやすいので気に入っています。
参考
- masterからmainに変更する(githubのリモート&ローカルブランチ)branches - Qiita
- jqを使って少し複雑な条件式でフィルタリングする方法をまとめてみた - Qiita
- 【bash】行ごとに処理する - Qiita
以上






