はじめに
GitHub Actionsで、「ソースリポジトリの最新リリース内容をターゲットリポジトリに反映させるためのPR」 を作成するコマンドを実行したところ、以下エラーに遭遇したので備忘録。
pull request create failed: GraphQL: The upstream-release/v4.3.2-16280363647 branch has no history in common with main (createPullRequest)
発生したエラーに対応する実行コマンドは以下だった。
このときソースブランチは、ソースリポジトリの最新のリリースタグでチェックアウトしていた。
gh pr create --repo <ターゲットリポジトリの名前> --title "<PRタイトル>" --body "<PR説明>" --base main --head <ソースブランチ名>
解説
原因
ターゲットブランチ(=ターゲットリポジトリのmain)とソースブランチとの間に、共通のコミット履歴が存在しない状態でPRを作成しようとしたために発生した。
Git, GitHubでは、2つのブランチをマージしたり、PRを作成する場合は少なくとも過去に同じコミットを共有している必要がある。
By default, git merge command refuses to merge histories that do not share a common ancestor.
今回、ターゲットリポジトリはフォークにより作成しておらず完全新規で作成したため、ソースリポジトリとの間に共通のコミット履歴がなかった
解決方針
git merge を手動実行し、ターゲットリポジトリにソースリポジトリとの共通のコミット履歴を作れば回避できる。
一度作ってしまえば、このエラーは発生しなくなる。したがって、GitHub Actionsのワークフローで条件分岐を定義するより上記で手動でやってしまう方がお手軽で推奨。
解決手順
実際に私が解決した手順をベースにまとめる
①ローカル環境に、ソースリポジトリの最新のものから2番目のリリースタグを取得。(最後にGitHubActionsで最新のリリースをマージできるか動作確認したいので、2番目のリリースタグとした)
# (ソースリポジトリがリモートとして追加されていない場合)リモートURLを追加する git remote add upstream https://GitHub.com/hoge/repo.git # ソースリポジトリから全てのブランチとタグをフェッチする git fetch upstream --tags # (必要に応じて)リリースタグ一覧を確認する git tag -l # ひとつ前のリリースタグでブランチを切る git checkout -b release/previous-upsteam <タグ名>
②ローカル環境で git merge を --allow-unrelated-histories 付きで実行する。
git checkout main git merge release/previous-upsteam --allow-unrelated-histories
③マージしたコミットを GitHub 上にPushする。その後GitHub Actionsで【最新リリースを取り込むPRを作成する】ワークフローを動かしてエラーが起きなくなったことを確認。
終わりに
他のリポジトリの内容を取り込む予定のリポジトリをフォークを経ずに作成する機会が稀だと思うので、このエラーに遭遇する機会も稀だと思います。
...と書いたのですが、あとからGeminiに「フォークリポジトリでもアップストリームリポジトリの履歴を長く取り込んでいなかった場合に発生する可能性あるよ!」と指摘いただきました(いつか巡り合ったら補足します)
2つのリポジトリのマージには、共通の祖先が必要なことを普段は考えないので、今回のトラシュでの学びでした。
菅谷 歩 (記事一覧)