163
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

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

はじめに

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
163
Help us understand the problem. What are the problem?