TortoiseGitで「Git Sync...」と「Pull...」が表示されなくなりました。
どうやら、コンフリクト(競合/衝突)しているようなので、対策をまとめました。
目次
TortoiseGitで「Git Sync...」と「Pull...」が表示されない
TortoiseGitについては以下をご覧ください。
TortoiseGit を使っていて、
リポジトリにコミットしたり、
プッシュしたり、
プルしたりしていると、
ある時から「Git Sync...」と「Pull...」が表示されなくなりました。
こんな感じの表示です。
「Git Sync...」と「Pull...」がきれいになくなっています。
原因の調査と解決
理由がわからないので、Git Bashを使って調べてみます。
まず、git pullしてみます。
1 2 3 4 |
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で状態を確認してみます。
1 2 3 4 5 6 7 8 9 |
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してみます。
1 2 3 4 |
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してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
$ 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 してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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」オプションを付けて実行します。
1 2 3 4 |
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) |
正常に戻ったようです。
1 2 3 4 5 6 7 8 9 10 11 12 |
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) <span style="background-color: #cccccc;">$ git status</span> 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
します。
1 2 |
xxx@aaa /root/test_repository (master|MERGING) $ git merge --abort |
MERGING 状態でなくなりました。
git status で状態を見てみます。
1 2 3 4 5 6 7 |
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 で戻りたい時点のハッシュ値を見つけます。
1 |
$ git log |
ハッシュ値を見つけたら、
git reset --hard (ハッシュ値)で
ローカルブランチを戻します。
1 2 |
$ git reset --hard (ハッシュ値) HEAD is now at 21c9eec Merge branch 'master' of ssh://aa.bb.cc.dd/var/lib/git/test_repository |
この後、git pull してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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についてのおすすめの本
↓Gitについてのおすすめの本はコチラ
コメント