Zobacz różnice między gałęziami z połączeniem?


159

Wiem, że mogę zobaczyć różnicę między HEAD a obecnym stanem za pomocą meld .. Ale jak mogę zobaczyć różnice między gałęziami, na przykład masteri develprzy meldowaniu?

W tej chwili wykonuję następujące czynności:

  1. Zmień nazwę folderu kopii roboczej
    Na przykład mv /projectA /projectA_master)
  2. Sklonuj projekt ponownie
    git clone url
  3. Przełącz się na develoddział
    cd projectA && git -b devel origin/devel
  4. Zobacz różnice w połączeniu
    meld /projectA_Master projectA

Czy nie ma prostszego sposobu na uzyskanie tego samego wyniku w połączeniu? Potrzebuję go tylko do przeglądu zmian, a nie przede wszystkim do scalania.


Odpowiedzi:


55

Ten problem również mnie denerwuje, więc stworzyłem git meld, który pozwala na wygodniejszy sposób odróżniania arbitralnych zatwierdzeń od drzewa roboczego lub obszaru przemieszczania. Możesz go znaleźć na https://github.com/wmanley/git-meld . To trochę jak skrypt Marka, ale działa do porównywania dowolnego zatwierdzenia, obszaru przemieszczania lub katalogu roboczego z dowolnym innym. Jeśli jedną z rzeczy, z którymi porównujesz, jest drzewo robocze, to jest to również odczyt i zapis, aby nie stracić zmian.


1
Doskonałe narzędzie, Will. Dzięki! Dokładnie polecam ... teraz, gdyby tylko działał również przy scalaniu.
Dipstick

TYVM dla świetnego narzędzia - (przypomnienie dla siebie, aby dodać! Do aliasu)
kfmfe04

26
Cytując Willa, z repozytorium hit github: "UWAGA: git-meld jest przestarzały, ponieważ git difftool nauczył się opcji --dir-diff w git 1.7.11."
oluc

318

Krótkie i słodkie:

git config --global diff.tool meld

Spowoduje to skonfigurowanie Gita do użycia meldjako narzędzia porównywania. (Nie musisz określać argumentów wiersza poleceń, obsługameld jest wbudowana w Git).

Następnie, jeśli chcesz graficznego porównania zamiast tekstowego, po prostu wywołaj git difftoolzamiast git diff(oba przyjmują te same argumenty). W Twoim przypadku:

git difftool master..devel

Aktualizacja: jeśli nie chcesz, aby różnica „jeden plik na raz” była używana, ale zamiast tego chcesz użyć widoku „podkatalogu” meld ze wszystkimi zmianami między dwoma gałęziami, zwróć uwagę na opcję -dlub . Na przykład, kiedy jestem w gałęzi XYZ i chcę zobaczyć, czym różni się ta od gałęzi ABC, uruchamiam to:--dir-diffgit difftool

git difftool -d ABC

3
nie tego szukam. Pokazuje mi różnice plik po pliku. Zarchiwizowałem to wcześniej za pomocą skryptu diff.py i „git diff master..devel”. Chcę zobaczyć wszystkie różnice i drzewo katalogów tak, jak robi to „meld folderA / folderB /”.
Marten Bauer

Marten, tak działa git. To tylko plik śledzenia, więc możesz zobaczyć tylko plik różnicowy po pliku. W git nie możesz sam napisać pustego katalogu. Jest jakiś szczególny powód, dla którego chcesz wyświetlić różnice między dir?
Donny Kurnia

@DonnyKurnia: Zajęło mi trochę czasu, aby dowiedzieć się, co próbuje zrobić OP: Meld ma oddzielny interfejs użytkownika do przeglądania wszystkich zmian w katalogu. Możesz filtrować wyświetlanie plików na podstawie tego, czy są takie same, zmienione, nowe. OP chce użyć tego interfejsu użytkownika, aby pokazać zmiany. (To pozwala zobaczyć listę wszystkich zmian i wybrać te, które chcesz porównać.) Więc nie jest to porównanie między katalogami, ale porównanie między zatwierdzeniami, ale postrzegane jako całość.
idbrii

17
@MartenBauer Myślę, że tego chcesz: git difftool --dir-diff master devel
Stéphane

3
Czy można to zrobić, aby bieżąca gałąź nie znajdowała się w folderze tmp i dlatego umożliwiała edycję?
zkent

100

Począwszy od git v1.7.11, możesz użyć git difftool --dir-diffdo wykonania porównania katalogów. Co działa całkiem dobrze w przypadku połączeń bez skryptów https://github.com/wmanley/git-meld .

Skonfiguruj git

git config --global diff.tool meld

Użyj tego

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

Dla macOS

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true

2
Myślę, że naprawdę tego chciał OP. Zwróć uwagę na opcję -g, aby użyć narzędzia guidiff i opcję -d, aby użyć --dir-diff. Jest to przydatne przy przeglądaniu kodu. Nit: opcja difftool.prompt nie jest wymagana przy podawaniu -d, przynajmniej dla Git 1.8.
Michael Percy,

1
To jest niesamowite. Dokładnie to, czego potrzebowałem. Dziękuję Ci!
Nicholas

5
Czy można to zrobić, aby bieżąca gałąź nie znajdowała się w folderze tmp i dlatego umożliwiała edycję?
zkent

2
Byłbym wdzięczny za odpowiedź na pytanie @zkent ... :(
tavlima

3
@zkent @tavlima: To polecenie już umożliwia edycję bieżącej wersji. Nawet jeśli widzisz flodera tmp do meldowania, jeśli zapiszesz - Ctrl+s- właściwą część, plik zostanie zmodyfikowany.
Benjamin

13

Ważne jest, aby powiedzieć, że używając git difftool -dmożesz nadal edytować swoje pliki robocze w Meld i je zapisywać . Aby to osiągnąć, musisz porównać jakąś gałąź z aktualnym drzewem roboczym, na przykład:

git difftool -d branchname

Meld pokaże, że lewy i prawy katalog znajdują się w / tmp. Jednak pliki w odpowiednim katalogu są w rzeczywistości dowiązaniami symbolicznymi do plików w bieżącym katalogu roboczym (nie dotyczy systemu Windows). Możesz więc edytować je bezpośrednio w Meld, a kiedy je zapiszesz, zmiany zostaną zapisane w katalogu roboczym.

Jeszcze ciekawszą opcją jest porównanie aktualnego katalogu roboczego ze skrytką. Możesz to zrobić, wpisując po prostu:

git difftool -d stash

Następnie możesz przenieść niektóre zmiany ze skrytki (lewe okno) do aktualnej kopii roboczej (prawe okno), bez używania git stash pop/apply i unikania uciążliwego rozwiązywania konfliktów, które mogą być wywołane przez te polecenia.

Myślę, że może znacznie przyspieszyć przepływ pracy ze skrytkami. Możesz stopniowo przenosić zmiany ze skrytki do kopii roboczej i zatwierdzać je pojedynczo, wprowadzając inne zmiany, jeśli chcesz.


Piotr, to jest dokładnie to, co próbowałem zrobić, ale w moim przypadku (na CentOS) nie są tworzone żadne dowiązania symboliczne. Czy istnieje wymagana konfiguracja konfiguracji lub minimalna wersja połączenia, która to obsługuje?
wrjohns

Myślę, że za tworzenie dowiązań symbolicznych odpowiada Git, a nie Meld. Sprawdź podręcznik Gita dla polecenia difftool. Może powinieneś zaktualizować go do nowszej wersji?
Piotr Jurkiewicz

2
kopiowanie nowych plików z gałęzi do katalogu roboczego nie działa :(
pykiss

5

Chociaż z innych odpowiedzi wydaje się, że w tej chwili nie ma sposobu, aby to zrobić bezpośrednio w repozytorium git, łatwo (dzięki odpowiedzi na inne pytanie :)) napisać skrypt, który wyodrębni drzewa dwóch zatwierdzeń do katalogów tymczasowych i uruchom na nich meld, usuwając oba katalogi po zakończeniu meld:

http://gist.github.com/498628

Oczywiście stracisz wszelkie zmiany wprowadzone przez meld, ale myślę, że jest to całkiem miłe dla szybkiego przeglądu różnic.


3

Myślę, że prostym sposobem na zrobienie tego jest użycie git reset --soft:

Cel: porównaj różnice między branch_a i branch_b z połączeniem

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .

0

W git V1.7.9 możesz porównać dwa zatwierdzenia bez wiersza poleceń:

Musisz skonfigurować opcje edycji w „git gui”, globalne: „Użyj narzędzia scalania: meld”.

Uruchom gitk , wybierz zatwierdzenie, kliknij prawym przyciskiem inne zatwierdzenie> " porównaj to -> wybrane ". W sekcji „patch” kliknij prawym przyciskiem myszy plik> „ external diff ”.

meld uruchomi się i wyświetli nadal wybrane, pierwsze zatwierdzenie po prawej stronie.


0

W przypadku połączenia w systemie macOS dodaj to do swojego ~/.gitconfigzgodnie z zaleceniami opiekuna aplikacji macOS, yousseb :

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

Jeśli chcesz, możesz pominąć mergekonfigurację.

Odpowiedź @ GutenYe nie zadziałała dla mnie z powodu automatycznego ucieczki i / lub czegoś z zsh.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.