Daydreaming in Brookline, MA

gitlabのmasterとmainブランチ

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のままだったことが出発点でした。対策として、以下のステップが必要でした。

  1. ローカルブランチをmasterからmainにリネームする(git branch -m master main)
  2. リモートのmainブランチをヒストリー無視オプションをつけてpullする(git pull origin main --allow-unrelated-histories)
  3. リモートのmainブランチにpushする(git push origin main)

Tech Tech