極楽とんぼのロボット製作記

情報工学系大学院生がロボットとその周辺技術や身の回りの出来事について紹介するブログ

git push でreject。 〜fetchしてmergeしてconflict直してpushするまで〜

タイトルでかなり日本語に不自由していますが、これからやろうとしていることをまとめるとタイトル通りになってしまいました。
先日、Gitでpushしようとした時に、こんなメッセージが出ました。

error: failed to push some refs to 'https://bitbucket.org/g104robo/test
ヒント: Updates were rejected because the remote contains work that you do
ヒント: not have locally. This is usually caused by another repository pushing
ヒント: to the same ref. You may want to first integrate the remote changes
ヒント: (e.g., 'git pull ...') before pushing again.
ヒント: See the 'Note about fast-forwards' in 'git push --help' for details.

あれ、pushできない。rejectされている...。原因はローカルリポジトリAからpushした内容をpullしないまま、ローカルリポジトリBで編集を行い、それをmasterにpushしようとしたためです。作業を始める前に

git pull

しておけば発生しない問題でした。直し方はこちらのサイトに3種類ほど載っています。
www.softel.co.jp

ローカルリポジトリBの内容がmasterの内容に変わってしまっても良い場合は素直に

git pull

してしまったほうが楽です。

ローカルリポジトリで編集した箇所が多すぎたり、全て思い出せない場合は

git fetch
git merge origin master

とします。

conflictしなければ、このままめでたしめでたしで終わるのですが、今回はconflictしてしまいました。

CONFLICT (content): Merge conflict in test/src/main.cpp
Automatic merge failed; fix conflicts and then commit the result.

この場合の対処法はこちらが参考になります。
qiita.com

エラーメッセージから/test/src/main.cppでconflictが発生していることがわかるので、

vim /test/src/main.cpp

でソースファイルを開き、
/<<<<
と打って(vimの場合)、<<<<を検索しましょう。
conflictが発生している場合はソースファイルの該当箇所が次のように変更されています。

<<<<<<< HEAD 
自分の環境の変更点(ローカルリポジトリB)
======= 
マージを試みた他の環境での変更点(ローカルリポジトリA)
>>>>>>> [commit id]

今回は自分の環境の変更点を残したいので、変更点以外を残して全て消します。

自分の環境の変更点(ローカルリポジトリB)

この後はいつも通り、

git add .
git commit -m "fixed conflict main"
git push origin master

として終了です。

gitでエラーが出ても、慌てず焦らず、エラーメッセージをよく読んで対処したいものです。