#はじめに
本番環境で最新のmasterをpullしようとした際に、エラーが起きた時の対処方法をメモしておきます。
Gitの知識が浅いため、誤った認識の記述があればお知らせください。
#エラー文
SSHに接続してgit pull origin master
をすると
$ git pull origin master
From https://github.com/user-name/app-name
* branch master -> FETCH_HEAD
Updating e05c05f..050505
error: Your local changes to the following files would be overwritten by merge:
Gemfile.lock
config/initializers/devise.rb
Please commit your changes or stash them before you merge.
Aborting
$
「次のファイルに対するローカルの変更は、マージによって上書きされます」
「マージする前に変更をコミットするか、隠してください」
とコンフリクトのエラー文。
前提
もちろん、思い当たるブランチや変更があればそちらの確認から。
- エディタで変更→マージ→ローカルのプルは正常にできる→本番環境でプルしてコンフリクトと言われる
- コミットしていない変更は無い状態なのに言われる
などの場合は参考にしてください。
対処①ファイルを一度削除する
gemfile.lockなどはバージョンやgem fileに変更があるたびに更新されるため、一度消してしまっても問題ないです。
# ファイルのあるディレクトリへ移動
$ rm Gemfile.lock
$ git pull origin master
#対処②スタッシュで一旦退避
とりあえずコンフリクトと指摘されたものをスタッシュしておき、反映させたい部分を確認することを優先。
マージされたものを本番環境にpullしたいだけなので、正直最新のものは表示できるようになる。
ただし、コンフリクトと言われている以上戻すと同じエラーがでる。
# 1) コンフり起こしてるファイルを一時退避
$ git stash
# 2) 退避したコミットしていないものが表示されるのでpullする
$ git pull origin master
# 3) スタッシュを戻す
$ git stash pop
#対処③強制的にマージする
リモートの最新状況に合わせに行くような強制マージなので、問題になることは無いはずです。
もちろん、pullしようとしていたmasterが正しい前提。
# 1) リモートの最新を取ってきておいて・・
$ git fetch origin master
# 2) masterを、リモート追跡のmasterに強制的に合わせる
$ git reset --hard origin/master
#おわり
使用するgitのコマンド自体はローカルと同じものなので、コマンド操作に慣れている方は問題ないかと思います。
本番環境で起きたこのコンフリクトのエラーはgemfile、gemfile.lockが中心でした。