LoginSignup
214
203

More than 3 years have passed since last update.

本番環境でpullしたらコンフリクト?解決法3パターン!【Please commit your changes or stash them before you merge】

Posted at

はじめに

本番環境で最新の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が中心でした。

214
203
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
214
203