(注意)この記事の意味がわからない場合は近所の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
このような状態は普通は起こりません。誰か1がgit push -f
などを実行した可能性が高いでしょう。共同作業中にこのような表示が出た場合は事故の可能性を疑い、関係各所にヒアリングすべきだと思います。このまま無視して作業を続けると誰かのコミットを気付かずに葬り去ってしまうかもしれません。
もちろん、自分で心当たりがある場合は問題ありません。別マシンで自分の見やすさのために歴史改変したような場合であれば、自分の手元の履歴は全て不要ということがわかります。この場合は手元(origin/foobar)をリモート(remotes/origin/foobar)の状態に追従させてしまいましょう。
$ git fetch origin
$ git reset --hard origin/foobar
くれぐれも、心当たりが無いのにgit reset --hard
したりしないように注意してください。また、他人が作業する可能性のあるブランチ上でのgit push -f
も基本的には禁止した方がいいでしょう。
-
後述する通り、この「誰か」が自分のこともあります ↩