GitHubのデフォルトブランチを変更するときは既存のPull RequestのBaseブランチも忘れずに変更する(GitHub CLI)

2022.08.22

この記事は公開されてから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クエリを使えばbaseRefNamemasterである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の方が文字数が少なくて打鍵もしやすいので気に入っています。

参考

以上