HRR Co., Ltd.

技術的な記録を残していくことを目的としています。1次情報を大事にしています。

強制的にgit pullをしてローカルの内容をリモートの内容で書き換えたい

はじめに

ちょこちょここういう事態が発生するので、自分用にまとめることにしました。
git pushには-f,--forceオプションがありますが、git pullにはありません。
しかしやりたいイメージはそういうことです。

結論だけ書くと

対象をmasterブランチとします。 ローカルの修正は消えますので、要注意です。

# masterブランチにチェックアウト
git checkout master

# リモートの最新の状態を取り込む
git fetch origin master

# リセットする
git reset --hard origin/master

もし既にmasterブランチにいて、git pullgit mergeによりコンフリクトを起こしてたら…

# merge処理の取り消しを行う
git merge --abort

# リモートの最新の状態を取り込む
git fetch origin master

# リセットする
git reset --hard origin/master

実際にあったケースとしては、「masterブランチでgit pullしたときに、なぜかコンフリクトしたぞ?」というときでした。
本人が望まぬcommitをしていたようで。

少し解説

細かいところまで書き出すと長くなるので、軽いところまで…
詳細はぜひ--helpやドキュメントをご参照ください。

git-scm.com

git fetch

git fetchはリモートの最新の情報をローカルに落とすところまで。
mergeはしません。

git pullをするとgit fetchに加えてgit mergeまで行うので、今回の例でいうとmasterブランチに何か修正がcommitされていると、コンフリクトする場合があります。

git reset --hard

上にも書きましたが、ローカルの修正が削除されてしまうので、バックアップを忘れずに!
内容はドキュメントにあるとおりですね。

インデックスと作業ツリーをリセットします。以降の作業ツリー内の追跡されたファイルへの変更はすべて破棄されます。

Git - git-reset Documentation

最後に

自分のブログにGitの記事がなかったことに驚き。
バリバリ使っているので、運用上発生するTIPS的なものは、今後も投稿していこうと思います。

以上でした!