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.