概要
- 久しぶりに触るEC2サーバーで、ローカルブランチと最新のリモートブランチで差異がありました。サーバー内でいじっていたものがあったのでコミット後、プッシュしたら色々なエラーと出会ってしまったので、その解決手順を残します。
前提
- サーバー(AWS EC2インスタンス)
- OS:Ubuntu 18.04.3 LTS
- Web Server:Apache/2.4.29
エラー内容
- 特定のファイルのみコミットしたかったので、
git add
でファイルを選択してステージングエリアに追加した後にgit commit
。 - そして
git push
すると以下のエラーが表示されました。
To https://github.com/xxxxxxxx/xxxxxxxxxxx.git
! [rejected] develop -> develop (non-fast-forward)
error: failed to push some refs to 'https://github.com/xxxxxxxx/xxxxxxxxxxx.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
-
push
しようとしたブランチ(develop
)がリモートリポジトリにすでに存在しているものの、リモートブランチの状態がローカルブランチの状態と異なるため、リジェクトされた、という内容です。プッシュに失敗しています。 - 4つ目のヒントで、リモートリポジトリにプッシュする前にリモートの変更をローカルにマージする必要があることを示唆しています。ということで、マージするところから始めていきます。
- 結論、以下の2つが問題点と対応方法でした。
- リモートブランチの状態とローカルブランチの状態が異なっていた→ローカルにマージが必要
- 現在の作業ツリーに存在する未追跡ファイルがあった→
stash
で一時避難が必要
実施手順
①リモートとローカルのブランチの状態を同じにする
②未追跡ファイルを一時的に保存する
③リモートからローカルへマージ後、プッシュする
リモートとローカルのブランチの状態を同じにする
- 以下コマンドでリモートブランチの変更を取得します。
$ git fetch
- ローカルブランチをリモートブランチの最新の状態に更新します。
$ git merge origin/develop
error: The following untracked working tree files would be overwritten by merge:
README.md
xxxx/xxxx/xxxxx.sql
Please move or remove them before you merge.
Aborting
- このエラーメッセージは、マージしようとしているブランチに、現在の作業ツリーに存在する未追跡ファイルが含まれているため、マージが中止されたことを示しています。削除するか、stashするかで解決できます。
- この未追跡ファイルは、今回コミットしたくない部分になります。
未追跡ファイルを一時的に保存する
- 未追跡ファイルを一時的に保存するために、作業ツリーから削除します。
-
git stash
コマンドについてはこちらでまとめていますのでご参考までに:【Git】作業中の変更を一時的に保存し、後で復元することができるgit stashコマンドについて
-
$ git stash push --include-untracked
- ちなみに、保存する必要がない場合は、以下コマンドで削除できます。
- dオプションはトラッキングしていない新しいフォルダもしくは新しいファイルを指定するオプション
$ git clean -f -d
リモートからローカルへマージ後、プッシュする
- マージできるようになったので、プルします。
- 競合が発生する可能性があるので、その場合は手動で確認したり変更したりした方が良いかもしれません
$ git pull
- これでプッシュできる状態になったのでプッシュします。
- 最新情報が一致するため通常のプッシュが行えます
$ git push origin develop
- 必要に応じて、保存したstashを復元したい場合は
git stash apply
コマンドを使います。