2009-05-27 9 views
59

Mam FileA w branchA i FileB w branchB.Nie można różnicować plików w dwóch oddzielnych gałęziach w Git

Problem polega na tym, że mogę uzyskać dostęp tylko do jednego pliku na raz. Chciałbym móc porównać pliki przez FileMerge lub meld, ponieważ są one jedynymi diffTools, które znalazłem dla Mac.

Jak odróżnić meld/FileMerge od dwóch plików?


[Solved]: 1-ty rozwinięty Problem: FileMerge nie pozwala standardowego wejścia

Masi: Można użyć opendiff to allow FileMerge mieć pliki ze standardowego wejścia. Tak więc następnym problemem jest znalezienie sposobu użycia narzędzia różnicowego git do używania opendiff.


2-ty rozwinięty Problem: aby uczynić narzędzie diff git do korzystania opendiff w Mac

+1

Problemem nie jest to, że nie jest używany git opendiff, to, że README nie istnieje na master. –

Odpowiedz

66

Można użyć „git mergetool” dla łączenia, aw nowoczesnych git (czyli wersji 1.6.3 i później) "git difftool" do porównywania za pomocą narzędzi graficznych. Oczywiście musielibyśmy je najpierw skonfigurować, ale wykonują niektóre autodetekcje (oczywiście z pewnymi zakodowanymi preferencjami), a jeśli dobrze pamiętam, wbudowana jest obsługa opendiff.

I wtedy oczywiście będzie można korzystać z narzędzia graficznego (opendiff/FileMerge) jak można użyć zwykłego „git diff”, na przykład

prompt> git difftool somebranch:UNREADME otherbranch:README 
+0

Jak napisałem git-difftool jest dostępny tylko w git w wersji 1.6.3 i późniejszych (sprawdź wyjście "git --version"). –

+0

Komentarz na temat "git diff" (i używanie diff.external) nie dotyczy mojej odpowiedzi ... –

+0

@ problem rozwiązany: MacPorts ma starego Gita. Musiałem to zaktualizować. -- Dziękuję za Twoją odpowiedź! –

37

Jeśli obecnie kasa się branchA, na przykład, można użyć polecenia:

git diff branchB path/to/common/file/between/branches.txt 

Następnie można edytować różnicę, jeśli chcesz podzestaw zmian lub pozostawić go w niezmienionym stanie, a jako łatkę podać git apply. Jeśli chodzi o narzędzie GUI, które to robi, mam nadzieję, że ktoś inny będzie miał sugestię.

61

git obsługuje nazwy gałęzi jako część ścieżek do repozytoriów. Na przykład, jeśli masz następujące pliki w repozytorium, README tylko na master i UNREADME tylko na branch:

master:README 

branch:UNREADME 

Można diff je poprzez git z:

git diff branch:UNREADME master:README 

można uzyskać repozytorium artefakt standardowe wyjście z git show:

git show branch1:UNREADME 

Więc jeśli zewnętrzne narzędzie diff może tak E 2 pliki w wierszu bash, można diff im coś takiego:

diff-command <(git show branch1:UNREADME) <(git show master:README) 

Gdzie składnia <(...) bash trwa wyjście z zamkniętego polecenia, prowadzi go w rurze i umieszcza ścieżkę rury na wiersz poleceń.

+0

Jak możesz zrobić to samo z zewnętrznym łączeniem plików? - Uruchamiam się bez powodzenia w Mac% open -a filemerge Heee/master: .profile master: .profile –

+1

FileMerge.app nie przyjmuje danych wejściowych ze standardowego wejścia. Możesz mieć szczęście z tego skryptu, który wyprodukował Google: http://kerneltrap.org/mailarchive/git/2007/11/21/435536 –

+1

Możesz także wypróbować Changes.app, który ma narzędzie wiersza poleceń i może akceptować dane wejściowe z stdin ... http://changesapp.com/ –

2

Od the docs, trzeba coś podobnego do poniższego w pliku .git/config:

# Our diff algorithm 
[diff] 
    external = opendiff 
Powiązane problemy