最終更新日:
2024年4月4日
このページの目次
前書き
久しぶりに GitHub に新しいリモートリポジトリを作って、そこにアップロードしようとしたところ、それが中々うまくできませんでした。
どうせなので、その事のメモを忘備録としてこのページで書いていこうと思います。
GitHub でリモートリポジトリを新しく作成しました。
そしてその後、ローカルリポジトリにあるものをそのリモートリポジトリに git push を使ってアップロードと同じ事をしようとしたところ、エラーになってしまいました。
以下は GitBash のコンソールの再現です。
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git remote add origin git@github.com■■■■■■■
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git remote -v
origin git@github.com■■■■■■■■■■(fetch)
origin git@github.com■■■■■■■■■■(push)
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git push -u origin main
Enter passphrase for key ■■■■■■■■■■:
To github.com■■■■■■■■■■
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'github.com■■■■■■■■■■'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usualy 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.
■■■■■■■■■■MINGW64■■■■■■■(main)
$
どうも、fetch して merge をしておく必要があるそうなのです。
ですので、そうしたのですが、
git merge をしても以下の様になり、マージできないそうです。
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git fetch origin
Enter passphrase for key ■■■■■■■■■■:
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 7.24 KiB | 436.00 KiB/s, done.
From github.com:■■■■■■■■■■
* [new branch] main -> origin/main
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git merge origin/main
fatal: refusing to merge unrelated histories
■■■■■■■■■■MINGW64■■■■■■■(main)
$
それでいろいろ調べたところ、以下のWebサイトに今回の問題の対処に関連しそうなものが載っていたのでそれを試しました。
外様のサイト
以下のリンクは、この TextRunRun のブログと全く関係の無い他の方のWebサイトの記事です。
参考サイト
どうやら、 merge を使う時に
–allow-unrelated-histories
このオプションをつけるとよいっぽいのでそれをつけて実行してみました。
git merge –allow-unrelated-histories origin/main
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git merge --allow-unrelated-histories origin/main
Merge made by the 'ort' strategy.
LICENSE | 339 +++++++++++++++++++++++
1 fille changed, 339 insertions(+)
create mode 100644 LICENSE
■■■■■■■■■■MINGW64■■■■■■■(main)
$
これを使うとちゃんとマージできました。
後は push をしてリモートリポジトリにアップロードと同じ事をすれば完了です。
git push -u origin main
これを実行して終わり。めでたし、めでたし
さあ、これで終わりではあるのですが、これでは説明が下手すぎると分かっています。
忘備録として書こうとしているものなので、分かりやすくするために段階を追って説明してみようと思います。
ですので、これ以降は先程の事と同じ説明の繰り返しになります。
先程の説明で意味が分かったという方はこれ以降は見ても意味がない事をつらつら書いている事になります。
この話に付き合える方だけ、読み進めていってください。
ちなみに、実際には今回の事だけでは解決しなかったため、次回のページに今回の続きの事を記入しています。次回はこの話の続きになっています。
新しく作ったリモートリポジトリに push が出来なかった時の事
GitHub で新しいリポジトリを作って、作ったものを GitHub に上げようとした時の事です。
TextRunRun をGitHubに上げようとした時の事でした。
GitHub でまずリモートリポジトリを作る事にしました。
作る際、ライセンスを選ぶ選択肢があったのでそれを選んでリモートリポジトリをつくりました。
( たぶん、このライセンスのファイルを作った事が今回のエラーと関係があると踏んでいます。 )
リモートリポジトリの SSH に使う URL を取得したので、さあ、後はローカルの Git で git push を使えば GitHub に上げる事ができるのだろうなと考えていました。
で、以下を実行した訳です。
git remote add origin [ GitHubから取得したURL ]
そして以下も実行
git push -u origin main
これで完了するだろと思いましたが、以下の様なエラーになりました。
先ほどの例
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git remote add origin git@github.com■■■■■■■
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git remote -v
origin git@github.com■■■■■■■■■■(fetch)
origin git@github.com■■■■■■■■■■(push)
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git push -u origin main
Enter passphrase for key ■■■■■■■■■■:
To github.com■■■■■■■■■■
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'github.com■■■■■■■■■■'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usualy 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.
■■■■■■■■■■MINGW64■■■■■■■(main)
$
このエラーを見るに、どうも先に fetch と merge をする必要がありそうだなーと思ったのでそれを試しました。
以下の2つを実行
git fetch origin
git merge origin/main
すると、以下の様になり、エラーというか上手くいっていない事が分かります。
先ほどの例
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git fetch origin
Enter passphrase for key ■■■■■■■■■■:
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 7.24 KiB | 436.00 KiB/s, done.
From github.com:■■■■■■■■■■
* [new branch] main -> origin/main
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git merge origin/main
fatal: refusing to merge unrelated histories
■■■■■■■■■■MINGW64■■■■■■■(main)
$
fetch は問題なくできてるようです。
ですが、merge の時にはエラーが出力されていないのですがマージはできないといった感じになります。
いろいろあれこれ調べた結果、先ほど挙げたWebサイトが見つかりました。
どうも
–allow-unrelated-histories
のオプションをつけて git merge を使うとマージできるっぽいのでそれを使う事にしました。
git merge –allow-unrelated-histories origin/main
これを実行。
-m のオプションとかをつけずに実行したのでコメントを記入させるためにエディターが開きます。
-m の後にコメントを記入するオプションを使うと、エディターでコメントを書く工程を減らせます。
–no-edit をつけて回避する方法とかもある様です。
エディターを閉じるとさっきのコマンドが実行されます。
先ほどの例
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git merge --allow-unrelated-histories origin/main
Merge made by the 'ort' strategy.
LICENSE | 339 +++++++++++++++++++++++
1 fille changed, 339 insertions(+)
create mode 100644 LICENSE
■■■■■■■■■■MINGW64■■■■■■■(main)
$
ちゃんとマージできていました。
ローカルリポジトリのフォルダ内を確認すると、LICENSE のファイルも存在していました。
( たぶん、このファイルを作った事でコミットが作られた事が原因ではないかと思います。 )
一応、git log を使った時のものも載せておきます。
■■■■■■■■■■MINGW64■■■■■■■(main)
$ git log
commit ■■■■■■■■■■■■■■■■■■■■(HEAD -> main)
Author: buranbon■■■■■■■■■■
Date: wed Mar 29 15:32:27 2023 +0900
Merge remote-tracking branch 'origin/main'
commit ■■■■■■■■■■■■■■■■■■■■(origin/main)
Author: ブランボン■■■■■■■■■■■■■■■■■■■■
Date: wed Mar 29 14:47:01 2023 +0900
Initia commit
commit ■■■■■■■■■■■■■■■■■■■■
Author: buranbon■■■■■■■■■■
Date: wed Feb 8 13:29:30 2023 +0900
E_showMultipleText1Toggle これらを加えた
リモートリポジトリの方でコミットが作られていた様です。
Sourcetree の方で後々確認してみたのでその時の画像も載せておきます。
途中から新しく枝ができてる様です。
( この Sourcetree の画像は少し後でキャプチャーした画像なのでコミットが一つ増えています。 )
大体分かった、さあ、これで解決じゃー
と言いたいところなのですが、腑に落ちないところです。
–allow-unrelated-histories
のオプションを指定してマージするといった説明は今まで見た事がりません。GitHub を説明している本にも書かれていません。
Google で検索してみても、「リモートリポジトリ 新規作成 」 みたいな調べ方では出てきません。
外様のサイト
参考サイト
参考にしたこのページ内でも、この様に書かれていたりします。
おそらく使う機会はそう多くないでしょう。いざ必要になった際、この記事を思い出してもらえると幸いです。
おかしくないか、
–allow-unrelated-histories
の記述は、リモートリポジトリを新しく作ったときは毎回使う様なものではないのか?
リモートリポジトリを作った時点でコミットが枝分かれするものではないのか?
自分以外も同じ様な対処で悩んでいるはずだよなーと思うのですが、同じ問題が起きた例があまり見られません。
考えられるのは自分のリモートリポジトリの作り方がおかしかった事がまず考えられます。
とはいえ、下手な事をしたのはライセンスのファイルを作った事ぐらいしか思いつきません。
自分以外の人がリモートリポジトリを作った際に同じ問題にあったという例が無いのは何でだろう?
やはり、設定とか何かが間違った状態でスタートしているからなのか。
解決はしたものの、間違ってた本当の原因はよく分かっていないです。
しつこく書いていますが、ライセンスのファイルを作った事が原因と思っています。
後書き
さて、このページで
GitHubでリモートリポジトリを作成した時の忘備録
と題して書いていきましたが、実は次回も続きます。
本当は、先程の処理の後の git push を使った時もエラーでうまく行かなかったのでその事について書いていきます。
できれば、この1ページにまとめたかったのですが、記述が長くなりすぎた事と、うまく行かなかった原因が今回の事とは関係なかったため、次のページにして移行する事にしました。
同じ様な内容が続くため、 この下手くそな説明に 付き合える方だけ見て行ってください。
コメントを残す