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.
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.
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
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
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
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.
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.
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
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.
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.
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!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