GitHubに最初のプッシュをしようとしたときにいくつかのエラーが出たため、こちらで整理します!🙌
今回の肝は、$ git pull --rebase origin main
です。
後ほど再喝しますが、以下の記事が今回の git
コマンドを理解するのに非常に参考になりました。
対象
- 未来の自分
- 以下の前提に合致する方
前提
- GitHubで、リモートリポジトリを作成済み
- リモートリポジトリに
READ.ME
ファイルが生成されている - 初めてのプッシュを行う
本題
私が入力した、はじめのコマンドです。
# GitHubとGitを紐付け
$ git remote add origin https://github.com/ユーザー名/リポジトリ名.git
問題なく実行されたので、プッシュを試みますがエラーが出て失敗しています。
# 新規ファイルなどをGitHubにプッシュ
$ git push -u origin main
error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/ユーザー名/リポジトリ名.git'
このエラーメッセージ「error: src refspec main does not match any」は、指定したブランチ(この場合はmain)がローカルリポジトリに存在しないため、プッシュ操作が失敗したことを示しています。
これを解決するために、まずはリモートリポジトリをローカルに複製します。そうすると、自動的にローカルリポジトリにmainブランチが誕生します。
$ git fetch とは「リモートのコピーをローカルにダウンロードする」コマンドです。ローカルのリモート追跡ブランチ(リモートのコピー置き場)にコピーしてくるだけなのでワーキングツリーには何も影響を及ぼしません。
# リモートのコピーをローカルに複製
$ git fetch
もう一度、プッシュを試みますが失敗します。
$ git push -u origin main
error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/ユーザー名/リポジトリ名.git'
エラーメッセージ「error: src refspec main does not match any」と表示される場合、通常、ローカルブランチにまだコミットが存在しないことが原因です。Gitでは、何かしらのコミットが存在しないと、ブランチをリモートにプッシュすることができません。
これを解決するために、新規ファイル(もしくは変更)をワークツリーからインデックスに複製し、それをローカルのリモートリポジトリに複製します。そして最後、GitHubのリモートリポジトリに複製(プッシュ)します。
# 新規ファイルをインデックスに複製
$ git add .
# インデックスにある複製を、今度はローカルのリモートリポジトリに複製
$ git commit -m "Initial commit"
# 最後、ローカルのリモートリポジトリの複製をリモートリポジトリ(GitHub)に複製
$ git push -u origin master
プッシュを試みた際のエラーです。
$ git push -u origin main
To https://github.com/ユーザー名/リポジトリ名.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/ユーザー名/リポジトリ名.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
エラーメッセージによると、リモートのmainブランチにはローカルブランチにない変更が存在しており、それがプッシュの拒否の原因になっています。これは通常、他の誰かがリポジトリにプッシュした結果、ローカルとリモートの履歴が食い違っている場合に発生します。
これを解決するためには、リモートの変更をローカルに統合してから再度プッシュを試みる必要があります。
リモートの変更をローカルに統合(マージまたはリベース)
まず、リモートの変更をローカルブランチに取り込むために git pull
を使用します。ここで git pull
をそのまま実行するとマージが行われますが、履歴を直線的に保ちたい場合はリベースを使用することが推奨されます。
リベースを行うことで、ローカルの変更がリモートの最新の状態の上に適用されます。
$ git pull --rebase origin main
変更をプッシュ
リモートの変更をローカルに統合し、再度プッシュを試みます。
$ git push -u origin main
無事にプッシュができました😊