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

シェアする

  • このエントリーをはてなブックマークに追加

スポンサードリンク

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

TortoiseGitを使っていて、リポジトリにコミットしたり、プッシュしたり、プルしたりしていると、ある時から「Git Sync...」と「Pull...」が表示されなくなりました。

image

こんな感じの表示です。
「Git Sync...」と「Pull...」がきれいになくなっています。

スポンサードリンク

原因の調査と解決

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

xxx@aaa /root/test_repository (master|MERGING)
$ git pull
You have not concluded your merge (MERGE_HEAD exists).
Please, commit your changes before you can merge.

 

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

xxx@aaa /root/test_repository (master|MERGING)
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 20 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
nothing to commit, working directory clean

 

Your branch and 'origin/master' have divergedとは、要はリモートのorigin/masterとローカルのmasterが分岐してしまったようです。
コンフリクト、衝突はないけれど、分岐をマージしている最中であるっている状態になっているらしいです。
バイナリファイルのマージに失敗するとこのような状態になります。
git commitしたら、マージは完了するらしいので、git commitしてみます。

xxx@aaa /root/test_repository (master|MERGING)
$ git commit
[master 80655da] Merge branch 'master' of ssh://aa.bb.cc.dd/var/lib/git/test_repository
xxx@aaa /root/test_repository (master)

 

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

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

xxx@aaa /root/test_repository (master)
となりました。
ここで、git pullしてみます。

$ git pull
aaa@aa.bb.cc.dd's password:
remote: Counting objects: 147, done.
remote: Compressing objects: 100% (106/106), done.
remote: Total 107 (delta 86), reused 0 (delta 0)
Receiving objects: 100% (107/107), 1.18 MiB | 1023.00 KiB/s, done.
Resolving deltas: 100% (86/86), completed with 36 local objects.
From ssh://aa.bb.cc.dd/var/lib/git/test_repository
c00525c..2499600  master     -> origin/master
warning: Cannot merge binary files: a1.xls
(HEAD vs. 2499600zzzzzcabce0b10a481b6c2bdfyyyyyyyy)
warning: Cannot merge binary files: a2.xls
(HEAD vs. 2499600zzzzzcabce0b10a481b6c2bdfyyyyyyyy)
warning: Cannot merge binary files: a3.dll (HEAD vs. 2499600zzzzzcabce0b10a481b6c2bdfyyyyyyyy)
warning: Cannot merge binary files: a4.dll (HEAD vs. 2499600zzzzzcabce0b10a481b6c2bdfyyyyyyyy)
warning: Cannot merge binary files: a5.dll (HEAD vs. 2499600zzzzzcabce0b10a481b6c2bdfyyyyyyyy)
warning: Cannot merge binary files: a6.exe (HEAD vs. 2499600zzzzzcabce0b10a481b6c2bdfyyyyyyyy)
warning: Cannot merge binary files: a7.db (HEAD vs. 2499600zzzzzcabce0b10a481b6c2bdfyyyyyyyy)
warning: Cannot merge binary files: a8.db (HEAD vs. 2499600zzzzzcabce0b10a481b6c2bdfyyyyyyyy)
warning: Cannot merge binary files: a9.db (HEAD vs. 2499600zzzzzcabce0b10a481b6c2bdfyyyyyyyy)
warning: Cannot merge binary files: a10.db (HEAD vs. 2499600zzzzzcabce0b10a481b6c2bdfyyyyyyyy)
Auto-merging a11.cs
Auto-merging a1.xls
CONFLICT (content): Merge conflict in a1.xls
Auto-merging a2.xls
CONFLICT (content): Merge conflict in a1.xls
Auto-merging a3.dll
CONFLICT (content): Merge conflict in a3.dll
Auto-merging a4.dll
CONFLICT (content): Merge conflict in a4.dll
Auto-merging a5.dll
CONFLICT (content): a5.dll
Auto-merging a6.exe
CONFLICT (content): a6.exe
Auto-merging a7.db
CONFLICT (content): Merge conflict in a7.db
Auto-merging a8.db
CONFLICT (content): Merge conflict in a8.db
Auto-merging a9.db
CONFLICT (content): Merge conflict in a9.db
Auto-merging a10.db
CONFLICT (content): Merge conflict in a10.db
Automatic merge failed; fix conflicts and then commit the result.

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

 

なんと、またmaster|MERGINGになってしまった。
バイナリファイルはAuto-merge出来ないんです。
もう一度、git commitしてみます。

xxx@aaa /root/test_repository (master|MERGING)
$ git commit
U       a10.db
U       a9.db
U       a8.db
U       a7.db
U       a6.exe
U       a5.dll
U       a4.dll
U       a3.dll
U       a2.xls
U       a1.xls
error: 'commit' is not possible because you have unmerged files.
hint: Fix them up in the work tree,
hint: and then use 'git add/rm <file>' as
hint: appropriate to mark resolution and make a commit,
hint: or use 'git commit -a'.
fatal: Exiting because of an unresolved conflict.

 

失敗しました。。
どうやら、git commitに「-a」オプションを付ける必要があるらしいです。
「-a」オプションを付けて実行すると変更が加えられたファイルを自動検出してコミットできるらしいです。
という訳で、git commitに「-a」オプションを付けて実行します。

xxx@aaa /root/test_repository (master|MERGING)
$ git commit -a
[master 56749c1] Merge branch 'master' of ssh://aa.bb.cc.dd/var/lib/git/test_repository
xxx@aaa /root/test_repository (master)

 

正常に戻ったようです。

xxx@aaa /root/test_repository (master)
$ git pull
aaa@aa.bb.cc.dd's password:
Already up-to-date.

xxx@aaa /root/test_repository (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
xxx@aaa /root/test_repository (master)

 

origin/masterとは、同期が取れたけど、ローカルブランチの方が3個コミットが進んでるよっていう意味のようです。
ホッと一安心です。

スポンサードリンク

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

ここまでの解決方法は、あまりに行き当たりばったりでした。
もう少し論理的に解決してみることにします。
まず、MERGING状態を取り消すために、git merge --abortします。

xxx@aaa /root/test_repository (master|MERGING)
$ git merge --abort

 

MERGING状態でなくなりました。
git statusで状態を
見てみます。

xxx@aaa /root/test_repository (master)
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 20 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working directory clean

この状態のままgit pullしていまうと、また自動マージを行うために、バイナリのマージに失敗して、MERGING状態になってしまいます。
従って、ここでコンフリクト状態を解決しないといけません。
今回はローカルのgit commitは無効として、リモートの変更を採用することとします。

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

 

ハッシュ値を見つけたら、git reset --hard (ハッシュ値)でローカルブランチを戻します。

$ git reset --hard (ハッシュ値)
HEAD is now at 21c9eec Merge branch 'master' of ssh://aa.bb.cc.dd/var/lib/git/test_repository

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

xxx@aaa /root/test_repository (master)
$ git pull
aaa@aa.bb.cc.dd's password:
remote: Counting objects: 663, done.
remote: Compressing objects: 100% (184/184), done.
remote: Total 407 (delta 304), reused 266 (delta 206)Receiving objects:  92% (37
Receiving objects:  94% (383/407), 28.74 MiB | 5.62 MiB/
Receiving objects: 100% (407/407), 29.18 MiB | 5.51 MiB/s, done.
Resolving deltas: 100% (304/304), completed with 181 local objects.
From ssh://aa.bb.cc.dd/var/lib/git/test_repository
3db4d28..yyyyyyy  master     -> origin/master
Updating 3db4d28..yyyyyyy


xxx@aaa /root/test_repository (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

 

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

まとめ

バイナリファイルは自動マージできないので、バイナリファイルの競合が発生すると、今回のようにTortoiseGitで「Git Sync...」と「Pull...」が表示されなくなるようです。

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

落ち着いて競合を回避しさえすれば問題はないですが、TortoiseGitの仕様として、「Git Sync...」と「Pull...」が表示されなくなってしまうのはイマイチのような気がします。

Gitの学習には定番は以下の本がお勧めです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です