Jak "pokazać git" commit scalający z połączonym wyjściem diff, nawet jeśli każdy zmieniony plik zgadza się z jednym z rodziców?

Po wykonaniu" prostego " scalenia (bez konfliktów), git show zazwyczaj pokazuje tylko coś w rodzaju

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

Dzieje się tak dlatego, że w przypadku łączenia git show używa połączonego formatu diff, który pomija pliki, które zgadzają się z którąkolwiek z wersji nadrzędnych.

Czy istnieje sposób, aby zmusić Gita do pokazania wszystkich różnic w połączonym trybie różnicowania?

Robienie git show -m pokaże różnice (używając Pairwise diffs pomiędzy nową i wszystkimi wersjami nadrzędnymi odpowiednio), ale wolałbym mieć że z różnicami oznaczonymi + / - w odpowiednich kolumnach, jak w trybie kombinowanym.

 156
Author: Tilman Vogel, 2011-02-22

10 answers

Nie, Nie da się tego zrobić git show. Ale z pewnością czasami byłoby to miłe i prawdopodobnie byłoby stosunkowo łatwe do zaimplementowania w kodzie źródłowym Gita (w końcu musisz tylko powiedzieć mu, aby nie przycinał to, co myśli, że jest obce), więc patch, który to zrobi, prawdopodobnie zostałby zaakceptowany przez opiekunów Gita.

Bądź jednak ostrożny, czego sobie życzysz; połączenie gałęzi z jednowierszową zmianą, która została rozwidlona trzy miesiące temu, nadal będzie miało ogromny różnice w stosunku do linii głównej, a więc takie pełne różnice byłyby prawie całkowicie nieprzydatne. Dlatego git tego nie pokazuje.

 9
Author: apenwarr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 19:43:09

Spójrz na komunikat commit:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

Zwróć uwagę na linię:

Merge: fc17405 ee2de56
Weź te dwa identyfikatory commitów i odwróć je. więc aby uzyskać diff, który chcesz, wykonaj:
git diff ee2de56..fc17405

Aby pokazać tylko nazwy zmienionych plików:

git diff --name-only ee2de56..fc17405

I aby je wyodrębnić, możesz dodać to do swojego gitconfig:

exportfiles = !sh -c 'git diff $0 --name-only | "while read files; do mkdir -p \"$1/$(dirname $files)\"; cp -vf $files $1/$(dirname $files); done"'

Następnie użyj go, wykonując:

git exportfiles ee2de56..fc17405 /c/temp/myproject
 206
Author: rip747,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 22:54:19

Lepsze rozwiązanie (wspomniane przez @ KrisNuttycombe):

git diff fc17405...ee2de56

Dla commit merge:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Aby pokazać wszystkie zmiany na ee2de56, które są dostępne z commitów na fc17405. Zwróć uwagę na kolejność skrótów zatwierdzania - jest taka sama jak pokazana w informacji o scalaniu: Merge: fc17405 ee2de56

Zwróć również uwagę na 3 kropki ... zamiast dwóch!

Do listy zmienionych plików można użyć:

git diff fc17405...ee2de56 --name-only
 48
Author: CoDEmanX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 21:31:53

Możesz utworzyć gałąź z nagłówkiem ustawionym na jeden commit przed scaleniem. Wtedy możesz zrobić:

git merge --squash testing

To połączy się, ale nie zatwierdzi. Wtedy:

git diff
 10
Author: side2k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-18 10:10:22

Myślę, że wystarczy 'git show-C $ref'. Wypróbowanie tego w repozytorium git na a8e4a59 pokazuje kombinację różnic (plus / minus znaki w jednej z 2 kolumn). Jak wspomina podręcznik git-show, w zasadzie deleguje do 'git diff-tree', więc te opcje wyglądają na użyteczne.

 4
Author: patthoyts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-22 01:22:12

Wygląda na to, że tutaj: http://thread.gmane.org/gmane.comp.version-control.git/191553/focus=191557

Więc w podobny sposób działa

$ git diff --cc $M $M^1 $m^2 $(git merge-base $m^1 $m^2)

Powinien pokazać łączony patch, który wyjaśnia stan w $M względem Stany zapisane w jego rodzicach i bazie merge.

 4
Author: max630,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-26 23:32:04

W Twoim przypadku wystarczy

git diff HEAD^ HEAD^2

Lub po prostu hash dla Ciebie:

git diff 0e1329e55^ 0e1329e55^2
 2
Author: gurugray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 15:49:18

Zbudowałem ogólne podejście do wykonywania różnych operacji na commitach scalenia.

Krok pierwszy : Dodaj alias do git przez edycję ~/.gitconfig:

[alias]
  range = "!. ~/.githelpers && run_on_merge_range"

Krok drugi : W ~/.githelpers zdefiniuj funkcję bash:

run_on_merge_range() {
  cmd=$1; shift
  commit=$1; shift
  range=$(git show $commit | grep Merge: | awk '{print $2 "..." $3}')
  echo "git $cmd $range $@"
  if [ -z $range ]; then
    echo "No merge detected"
    exit 1
  fi
  git $cmd $range $@
}

Krok Trzeci : Zysk!

git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only

Prawdopodobnie jest tu dużo miejsca na poprawę, po prostu zebrałem to razem, aby przejść przez irytującą sytuację. Możesz wyśmiewać moją składnię i/lub logikę Basha.

 0
Author: Nerdmaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-07 19:08:06

Możesz użyć polecenia diff-tree z flagą-C. To polecenie pokazuje, jakie pliki zostały zmienione w zatwierdzeniu scalania.

git diff-tree -c {merged_commit_sha}

Dostałem opis flagi-c z Git-Scm:

Ta flaga zmienia sposób wyświetlania commita scalającego (co oznacza, że jest użyteczna tylko wtedy, gdy zostanie podana Komenda, lub --stdin). Pokazuje różnice od każdego z rodziców do wyniku połączenia jednocześnie zamiast pokazywać różnice między rodzicem a wynik po kolei (co robi opcja-m). Ponadto wymienia tylko pliki, które zostały zmodyfikowane od wszystkich rodziców.

 0
Author: Ehsan Mirsaeedi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-14 22:43:36

Jeśli twój commit merge to commit 0e1329e5, jak wyżej, możesz uzyskać różnicę zawartą w tym merge przez:

git diff 0e1329e5^..0e1329e5
Mam nadzieję, że to pomoże!
 0
Author: hesham_EE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 20:33:36