LoginSignup
64

More than 3 years have passed since last update.

gitで「Your branch and 'origin/***' have diverged」と言われたときの対処

Last updated at Posted at 2016-04-12

(注意)この記事の意味がわからない場合は近所のGitウィザードを呼びましょう

git fetch とか git pull とかすると下記のような状態になることがあります。

$ git status
On branch foobar
Your branch and 'origin/foobar' have diverged,
and have 5 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)
nothing to commit, working directory clean

これはどういう状態かというと、リモートブランチとローカルの追跡ブランチとがfast-forwardできない状態になっているということです。上で言えば、共通のコミットから自分の手元では5コミット進んでおり、リモートでは別の1コミットがpushされている状態です。

* - * - * - * - * - * - *
      \                 ↑
        *               origin/foobar
        ↑
        remotes/origin/foobar

このような状態は普通は起こりません。誰か1git push -fなどを実行した可能性が高いでしょう。共同作業中にこのような表示が出た場合は事故の可能性を疑い、関係各所にヒアリングすべきだと思います。このまま無視して作業を続けると誰かのコミットを気付かずに葬り去ってしまうかもしれません。

もちろん、自分で心当たりがある場合は問題ありません。別マシンで自分の見やすさのために歴史改変したような場合であれば、自分の手元の履歴は全て不要ということがわかります。この場合は手元(origin/foobar)をリモート(remotes/origin/foobar)の状態に追従させてしまいましょう。

$ git fetch origin
$ git reset --hard origin/foobar

くれぐれも、心当たりが無いのにgit reset --hardしたりしないように注意してください。また、他人が作業する可能性のあるブランチ上でのgit push -fも基本的には禁止した方がいいでしょう。


  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
64