Wyobraź sobie następującą historię:
c---e---g--- feature
/ \
-a---b---d---f---h--- master
Jak mogę sprawdzić, kiedy zatwierdzenie „c” zostało scalone z nadrzędnym (tj. Znaleźć polecenie scalające „h”)?
Twój przykład pokazuje, że gałąź feature
jest nadal dostępna.
W takim przypadku h
jest to ostatni wynik:
git log master ^feature --ancestry-path
Jeśli gałąź feature
nie jest już dostępna, możesz wyświetlić zatwierdzenia scalania w linii historii między c
a master
:
git log <SHA-1_for_c>..master --ancestry-path --merges
Będzie to jednak również pokazać wszystkie scala że stało się po h
i między e
i g
na temat feature
.
Porównanie wyniku następujących poleceń:
git rev-list <SHA-1_for_c>..master --ancestry-path
git rev-list <SHA-1_for_c>..master --first-parent
poda SHA-1 h
jako ostatni wspólny wiersz.
Jeśli masz to dostępne, możesz użyć comm -1 -2
na tych wynikach. Jeśli jesteś na msysgit, możesz użyć następującego kodu Perla do porównania:
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
(kod perla z http://www.cyberciti.biz/faq/command-to-display-lines-common-in-files/ , który wziął go od „kogoś z grupy dyskusyjnej comp.unix.shell”).
Zobacz podstawianie procesu, jeśli chcesz, aby było to jednowierszowe.
master
został scalony zfeature
, a następnie natychmiastfeature
jest scalonymaster
jako przewijanie do przodu (wskazówkafeature
zastępujemaster
). Czy to spowodowałoby--first-parent
powrót niewłaściwego rodzica?comm -1 -2
ale to nie zadziałało.comm
działa tylko na posortowanych liniach. (Jedna linijka perla działa, chociaż nie mogłem jej przeczytać.)git find-merge h master
(zwraca nic, ale powinno zwrócić h),git find-merge d master
(zwraca f, ale powinno zwrócić d),git find-merge c feature
(zwraca e, ale powinno zwrócić g).Dodaj to do
~/.gitconfig
:Następnie możesz użyć takich aliasów:
Aby zobaczyć komunikat zatwierdzenia scalającego i inne szczegóły, użyj
git show-merge
z tymi samymi argumentami.(Na podstawie odpowiedzi Gauthiera . Podziękowania dla Rosena Mateva i javabretta za naprawienie problemu z
sort
.)źródło
sort -k2 | uniq -f1 -d | sort -n | tail -1 | cut -f2
nie znajduje poprawnie ostatniego wspólnego wiersza. Oto przykład niepowodzenia.16db9fef5c581ab0c56137d04ef08ef1bf82b0b7
tutaj, kiedy uruchomię go na twojej paście, czy nie jest to oczekiwane? Z jakiego systemu operacyjnego korzystasz?29c40c3a3b33196d4e79793bd8e503a03753bad1
git-get-merge zlokalizuje i pokaże zatwierdzenie scalające, którego szukasz:
Polecenie podąża za elementami podrzędnymi danego zatwierdzenia, dopóki nie zostanie znalezione połączenie z inną gałęzią (prawdopodobnie master).
źródło
Czyli podsumowując post Gauthiera:
EDYCJA: ponieważ używa podstawiania procesu "
<()
", nie jest kompatybilna z POSIX i może nie działać z twoją powłoką. Działa zbash
lubzsh
chociaż.źródło
<()
nie jest zgodna z POSIX. Trzeba użyćbash
,zsh
albo powłokę nośną zmiany procesu . Odpowiednio zredagowałem odpowiedź.Musiałem to zrobić i jakoś znalazłem
git-when-merged
(co faktycznie odnosi się do tego pytania SO, ale Michael Haggerty nigdy nie dodał tutaj odniesienia do swojego bardzo ładnego skryptu Pythona). Więc teraz mam.źródło
Opierając się na świetnej odpowiedzi Gauthiera, nie musimy używać
comm
do porównywania list. Ponieważ szukamy ostatniego wyniku, w--ancestry-path
którym również znajduje się w--first-parent
, możemy po prostu grepować ten drugi w wyniku pierwszego:A jeśli szukasz czegoś zgrabnego i wielokrotnego użytku, oto funkcja, do której można wejść
.bashrc
:źródło
comm
nie działał, gdy dane wejściowe nie były posortowane.Dla tłumu Ruby jest git-skąd . Bardzo łatwe.
źródło
Używam poniżej skryptu bash, który umieszczam na ścieżce
~/bin/git-find-merge
. Jest on oparty na odpowiedź Gauthier jest i odpowiedź evilstreak jest z kilku poprawek do obsługi spraw rożny.comm
zgłasza, gdy dane wejściowe nie są posortowane.grep -f
działa świetnie.Obudowy narożne:
~/bin/git-find-merge
scenariusz:Co pozwala mi to zrobić:
Ten skrypt jest również dostępny na moim githubie .
źródło
Następnie poszukaj pierwszego scalenia przed zatwierdzeniem.
źródło
Moja rubinowa wersja pomysłu @ robinst działa dwa razy szybciej (co jest ważne podczas wyszukiwania bardzo starego commita).
find-commit.rb
Możesz go po prostu użyć w ten sposób:
źródło
Możesz spróbować czegoś takiego. Chodzi o to, aby iterować przez wszystkie zatwierdzenia typu merge i sprawdzić, czy zatwierdzenie „c” jest osiągalne z jednego z nich:
źródło
git rev-list <SHA-1_for_c>..master --ancestry-path --merges
Musiałem to zrobić kilka razy (dzięki wszystkim, którzy odpowiedzieli na to pytanie!) I napisałem skrypt (używając metody Gauthiera), który mogłem dodać do mojej małej kolekcji narzędzi git. Znajdziesz go tutaj: https://github.com/mwoehlke/git-utils/blob/master/bin/git-merge-point .
źródło