TortoiseGitで「Git Sync...」と「Pull...」が表示されない - コンフリクト(競合/衝突)対策

Git

TortoiseGitで「Git Sync...」と「Pull...」が表示されなくなりました。

どうやら、コンフリクト(競合/衝突)しているようなので、対策をまとめました。

スポンサーリンク
スポンサーリンク

TortoiseGitで「Git Sync...」と「Pull...」が表示されない

TortoiseGit を使っていて、

リポジトリにコミットしたり、

プッシュしたり、

プルしたりしていると、

ある時から「Git Sync...」と「Pull...」が表示されなくなりました。

image

こんな感じの表示です。

「Git Sync...」と「Pull...」がきれいになくなっています。

原因の調査と解決

理由がわからないので、Git Bashを使って調べてみます。

まず、git pullしてみます。

どうやら、マージしている途中で失敗したので、MERGINGという状態になっているらしいです。

git statusで状態を確認してみます。

Your branch and 'origin/master' have diverged とは、

要は

リモートのorigin/masterと

ローカルのmasterが

分岐してしまったようです。

コンフリクト、衝突はないけれど、分岐をマージしている最中であるっている状態になっているらしいです。

バイナリファイルのマージに失敗するとこのような状態になります。

git commitしたら、マージは完了するらしいので、git commitしてみます。

なんか状態が修正されたみたいです。

xxx@aaa /root/test_repository (master|MERGING)

xxx@aaa /root/test_repository (master)

となりました。

ここで、git pullしてみます。

なんと、また、master|MERGING になってしまった。

バイナリファイルは、自動マージ、Auto-merge 出来ないんです。

もう一度、git commit してみます。

失敗しました。。

どうやら、git commit に「-a」オプションを付ける必要があるらしいです。

「-a」オプションを付けて実行すると変更が加えられたファイルを自動検出してコミットできるらしいです。

という訳で、git commit に「-a」オプションを付けて実行します。

正常に戻ったようです。

origin/master とは、同期が取れたけど、

ローカルブランチの方が3個コミットが進んでるよっていう意味のようです。

ホッと一安心です。

Your branch and 'origin/master' have diverged をもう少し賢く解決

ここまでの解決方法は、あまりに行き当たりばったりでした。

もう少し論理的に解決してみることにします。

まず、MERGING 状態を取り消すために、

git merge --abort

します。

MERGING 状態でなくなりました。

git status で状態を見てみます。

この状態のまま、

git pull

していまうと、また自動マージを行うために、バイナリのマージに失敗して、MERGING 状態になってしまいます。

従って、ここでコンフリクト状態を解決しないといけません。

今回はローカルの git commit は無効として、リモートの変更を採用することとします。

まず、git log で戻りたい時点のハッシュ値を見つけます。

ハッシュ値を見つけたら、

git reset --hard (ハッシュ値)で

ローカルブランチを戻します。

この後、git pull してみます。

以上で、origin/master と同期が取れるようになりました。

まとめ

バイナリファイルは自動マージできないので、

バイナリファイルの競合が発生すると、今回のように

TortoiseGitで「Git Sync...」と「Pull...」が表示されなくなるようです。

この状態では、MERGE_HEADが存在して、MERGINGという状態になっているらしいです。

落ち着いて競合を回避しさえすれば問題はないですが、

TortoiseGitの仕様として、「Git Sync...」と「Pull...」が表示されなくなってしまう

のはイマイチのような気がします。

Gitについてのおすすめの本

↓Gitについてのおすすめの本はコチラ

Git