ローカルPCとGit Hubの連携の際に少し詰まったので、解決方法となぜ詰まったのかを特定しました。
やりたかったこと
UnityプロジェクトをGitHubで管理
エラー時の状況
ローカルリポジトリを作成し、以下のようにファーストコミットまで終了。
git init
git add .
git commit -m "Initial commit"
次にGitHubでリモートリポジトリを作成(READEMEも同時に作成)。
ローカルリポジトリからリモートリポジトリにpush。
git remote add origin https://github.com/<ユーザー名>/<リポジトリ名>.git
git push -u origin main
しかし、以下のようなエラーが出ました
To https://github.com/user-name/anti-pattern.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/user-name/anti-pattern.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.
連携がうまくいかなかった原因
Git Hubでリポジトリを作成した際に、READEMEを一緒に作成したことでmainブランチにコミットが発生していた。
ローカルではmainブランチでファーストコミットを別の形で行っているため、履歴が異なる。
リモートとローカルの履歴が異なるにもかかわらず、pushしようとしていたことでコミットのコンフリクトのようなことが起きていた。
対処方法
以下を実行する。
git pull origin main --rebase
リモートリポジトリから最新の変更を取得し、ローカルの変更をリモートの変更に 「積み重ねる」 形で履歴を整えることができるためコンフリクトが解消できます。
もう一度push。
git push -u origin main
これでうまくいきました。
根本的に問題を起こさない方法
根本的に問題を起こさない方法は
- リモートリポジトリ作成時にコミットを発生させない(READEMEや.gitignore, ライセンスファイルを作成しない)
- ローカルでコミットを行う前にpullを行う
です。
READEMEを作成しなければリモートでコミットが発生しないので、コンフリクトは起きないです。
ローカルでコミットを行う前にpullを行う
ローカルでコミットを行う前にpullを行うパターンは以下のような流れです。
リモートリポジトリを作成する(READE.MEも同時に作成)。
この時、リモートではREADE.MEを作成したことでコミットが1つ発生する。
以下のコマンドを実行することで、ローカルでリポジトリを作成し、リモートを追加したあとpullを行います。これはリモートで発生したコミットを先に取り込むためです。
git init
git remote add origin https://github.com/<ユーザー名>/<リポジトリ名>.git
git pull origin main
これで今
リモート:READEME
ローカル:READEME・作成したファイルやディレクトリ
という状態です。
次にローカルで作成したファイルやディレクトリをaddし、commitをしてリモートにpushをする
git add .
git commit
git push origin main
これでリモートとローカルが同じ状態になりました。
なので、うまくいったと言えます。
ここからローカルでブランチを切って作業してリモートにpushできます。
コメント