Table of Contents
1 はじめに
会社のgitlabにプロジェクトを作って、ローカルブランチをgit pushしたら、masterブランチへのマージリクエストになってしまいました。gitlabに作ったプロジェクトにはデフォルトで作られたmainブランチが既にあり、なんとかしなくてはいけません。
これまでgit関係の操作は、ネットで検索しながらおまじないのようにコピペするだけでしたが、少し真面目にgitを勉強しないとダメそうです。
2 mainとmasterブランチ
githubが、master - slaveという単語がoffensiveなため、デフォルトのブランチをmainにしたことは知っていましたが、gitlabの このページ によると、gitlabも去年の5月にデフォルトブランチをmasterからmainに変更したようです。
今回検索して実行した一連のgitコマンドが載っていたWebサイトの情報が古くて、masterブランチを使うことを前提に書いてあったため、困った状況になってしまったものと思われます。
3 リモートのmainブランチにpushする
ということは、masterではなくmainにpushすれば良さそうです。しかし、
(master)$ git push origin main
をすると、エラーが出ました。
error: src refspec main does not match any. error: failed to push some refs to 'git@gitlab.<snip>/<snip>.git'
エラーメッセージでネット検索すると、stackoverflowのページ がヒットしました。ローカルに存在しないブランチにpushしようとしたためのようです。確認してみます。
(master)$ git branch * master
あ、確かに。まずはローカルのmasterをmainにリネームします。
(master)$ git branch -m master main (main)$ git branch * main
変わりました。
再度、origin mainに pushします。
$ git push origin main
またエラーが出ました。
! [rejected] main -> main (fetch first) error: failed to push some refs to 'git@gitlab.<snip>/<snip>.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
ヒントによると、一度pullしてからpushすべしとのこと。pullしてみます。
$ git pull origin main <snip> * branch main -> FETCH_HEAD fatal: refusing to merge unrelated histories
しかしまたエラーです。検索してみると、これはリモートとローカルのmainブランチが全然バラバラなためだそうです。forceオプション(-f)も効きませんでしたが、 --allow-unrelated-histories
オプションを付けるとよさそうです。
$ git pull origin main --allow-unrelated-histories <snip> * branch main -> FETCH_HEAD Merge made by the 'recursive' strategy. README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 README.md
うまくいきました。 この状態でpushします。
$ git push origin main Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (5/5), 689 bytes | 689.00 KiB/s, done. Total 5 (delta 1), reused 0 (delta 0) To gitlab.<snip>.git ca59bc7..b2b785c main -> main
これでやっと、やりたかったことができました。
4 まとめ
今回の問題は、gitlabがデフォルトブランチをmainにしたのに、ローカルのgitはmasterのままだったことが出発点でした。対策として、以下のステップが必要でした。
- ローカルブランチをmasterからmainにリネームする(
git branch -m master main
) - リモートのmainブランチをヒストリー無視オプションをつけてpullする(
git pull origin main --allow-unrelated-histories
) - リモートのmainブランチにpushする(
git push origin main
)