Biorąc pod uwagę identyfikator zatwierdzenia, jak określić, czy bieżąca gałąź zawiera zatwierdzenie?
156
To, co próbuję zrobić, to sprawdzenie wersji. Chcę się upewnić, że kod pozostaje na szczycie wersji minimalnej. Potrzebuję więc sposobu, aby wiedzieć, czy bieżąca gałąź zawiera określone zatwierdzenie.
Zobacz proponowany duplikat, aby dowiedzieć się, jak znaleźć wszystkie gałęzie zawierające określone zatwierdzenie. Aby dowiedzieć się, czy bieżąca gałąź zawiera zatwierdzenie C , użyj polecenia „plumbing” git merge-base --is-ancestor. Bieżąca gałąź zawiera C, jeśli C jest przodkiem HEAD, więc:if git merge-base --is-ancestor $hash HEAD; then echo I contain commit $hash; else echo I do not contain commit $hash; fi
torek
1
Cześć, prześlij to jako odpowiedź, aby można ją było wybrać jako prawidłową odpowiedź =)
Ben
1
@Ben - dodałem go jako odpowiedź wiki społeczności.
Zitrax
1
@Remover: w skryptach powłoki zero jest prawdą, wartość niezerowa jest fałszem: odwrotność konwencji C. /bin/truezostał pierwotnie zaimplementowany jako exit 0i /bin/falsejako exit 1. (Współczesne pociski miały wtedy wbudowane.)
torek
Odpowiedzi:
220
Istnieje wiele sposobów osiągnięcia tego wyniku. Pierwszą naiwną opcją jest użycie git logi wyszukanie określonego zatwierdzenia za pomocą grep, ale nie zawsze jest to dokładne
git log | grep <commit_id>
Lepiej jest użyć git branchbezpośrednio, aby znaleźć wszystkie gałęzie zawierające podane COMMIT_IDużycie
git branch --contains $COMMIT_ID
Następnym krokiem jest ustalenie bieżącej gałęzi, którą można zrobić od czasu git 1.8.1użycia
Ale powyższe polecenie nie zwraca prawdy ani fałszu i istnieje krótsza wersja, która zwraca kod zakończenia 0, jeśli zatwierdzenie znajduje się w bieżącej gałęzi LUB kod zakończenia 1, jeśli nie
git merge-base --is-ancestor $COMMIT_ID HEAD
Kod zakończenia jest fajny, ale jeśli chcesz napisać truelub falsejako odpowiedź, musisz dodać trochę więcej, a następnie połączyć z ifz basha.
if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi
To nie jest poprawne; grepmoże spowodować fałszywie dodatnich jeśli git logwspomina commit SHA z innych powodów, np to wspomniano w commit wiadomość w wyniku port z innego oddziału.
grepTutaj może również powodować fałszywych alarmów, jeśli istnieją inne gałęzie zawierające popełnić których nazwy zawierają również <branch-name>jako podciąg.
Adam Spiers
1
Tak @AdamSpiers, zaktualizowałem odpowiedź, podając dokładne dopasowanie nazwy oddziału przezgrep -E '(^|\s)branchname$'
Sajib Khan.
1
Zgodnie z tym komentarzem do pokrewnego pytania przydatne może być dodanie opcji -r(„zdalne”) lub -a(„wszystkie”) w git branchcelu wyszukania gałęzi, które mogą nie być replikowane w lokalnym klonie repozytorium.
sxc731
To nie zadziałało dla mnie, potrzebowałem git branch --all --contains <commit-id>
Arthur Tacca
7
Wyodrębniony komentarz @torek jako odpowiedź:
Zobacz proponowany duplikat, aby dowiedzieć się, jak znaleźć wszystkie gałęzie zawierające określone zatwierdzenie.
Aby dowiedzieć się, czy bieżąca gałąź zawiera zatwierdzenie C, użyj polecenia „plumbing” git merge-base --is-ancestor. Bieżąca gałąź zawiera C, jeśli C jest przodkiem HEAD, więc:
if git merge-base --is-ancestor $hash HEAD; then
echo I contain commit $hash
else
echo I do not contain commit $hash
fi
(Na marginesie: w skryptach powłoki polecenie, które wychodzi z zera, jest „prawdziwe”, a wyjście niezerowe jest „fałszywe”).
To działa najlepiej dla mnie, ponieważ działałoby również na zdalnych gałęziach buforowanych lokalnie, takich jak remotes/origin/master, na których git branch --containsnie będzie działać.
Obejmuje to więcej niż pytanie OP dotyczące tylko "bieżącej gałęzi", ale uważam, że głupio jest zadawać "dowolną gałąź" tego pytania, więc i tak zdecydowałem się opublikować tutaj.
Możesz otrzymać ten błąd w 2 przypadkach 1. Kiedy podana <nazwa oddziału> nie zawiera podanego <ID zatwierdzenia> 2. Do kasy <nazwa oddziału> nie jest podana <nazwa oddziału>
DreamUth
0
Ponieważ to pytanie ma kilka fajnych odpowiedzi skryptowych, dodaję moje ulubione.
Ten pokaże ci, dla ostatnich $nzatwierdzeń, w $brktórych gałęziach znajdują się:
git merge-base --is-ancestor
. Bieżąca gałąź zawiera C, jeśli C jest przodkiemHEAD
, więc:if git merge-base --is-ancestor $hash HEAD; then echo I contain commit $hash; else echo I do not contain commit $hash; fi
/bin/true
został pierwotnie zaimplementowany jakoexit 0
i/bin/false
jakoexit 1
. (Współczesne pociski miały wtedy wbudowane.)Odpowiedzi:
Istnieje wiele sposobów osiągnięcia tego wyniku. Pierwszą naiwną opcją jest użycie
git log
i wyszukanie określonego zatwierdzenia za pomocągrep
, ale nie zawsze jest to dokładneLepiej jest użyć
git branch
bezpośrednio, aby znaleźć wszystkie gałęzie zawierające podaneCOMMIT_ID
użycieNastępnym krokiem jest ustalenie bieżącej gałęzi, którą można zrobić od czasu
git 1.8.1
użyciaI połączone razem jako
Ale powyższe polecenie nie zwraca prawdy ani fałszu i istnieje krótsza wersja, która zwraca kod zakończenia 0, jeśli zatwierdzenie znajduje się w bieżącej gałęzi LUB kod zakończenia 1, jeśli nie
Kod zakończenia jest fajny, ale jeśli chcesz napisać
true
lubfalse
jako odpowiedź, musisz dodać trochę więcej, a następnie połączyć zif
z basha.źródło
grep
może spowodować fałszywie dodatnich jeśligit log
wspomina commit SHA z innych powodów, np to wspomniano w commit wiadomość w wyniku port z innego oddziału.--format=format:%H
dogit log
.Uzyskaj listę gałęzi, które zawierają określone zatwierdzenie.
Sprawdź, czy gałąź ma określone zatwierdzenie.
Wyszukaj gałąź (powiedzmy
feature
) z dokładnym dopasowaniem .np Jeśli masz 3 lokalne oddziały zwane
feature
,feature1
,feature2
następnieMożna też szukać w obu
local
iremote
oddziałów (zastosowanie-a
) lub tylko wremote
gałęzi (wykorzystania-r
).źródło
grep
Tutaj może również powodować fałszywych alarmów, jeśli istnieją inne gałęzie zawierające popełnić których nazwy zawierają również<branch-name>
jako podciąg.grep -E '(^|\s)branchname$'
-r
(„zdalne”) lub-a
(„wszystkie”) wgit branch
celu wyszukania gałęzi, które mogą nie być replikowane w lokalnym klonie repozytorium.git branch --all --contains <commit-id>
Wyodrębniony komentarz @torek jako odpowiedź:
Zobacz proponowany duplikat, aby dowiedzieć się, jak znaleźć wszystkie gałęzie zawierające określone zatwierdzenie.
Aby dowiedzieć się, czy bieżąca gałąź zawiera zatwierdzenie C, użyj polecenia „plumbing”
git merge-base --is-ancestor
. Bieżąca gałąź zawiera C, jeśli C jest przodkiem HEAD, więc:(Na marginesie: w skryptach powłoki polecenie, które wychodzi z zera, jest „prawdziwe”, a wyjście niezerowe jest „fałszywe”).
źródło
Aby wyświetlić lokalne gałęzie zawierające zatwierdzenie:
git branch --contains <commit-id>
i wymienić wszystkie gałęzie, w tym tylko zdalne, zawierające zatwierdzenie:
git branch -a --contains <commit-id>
Podobnie, aby sprawdzić, czy zatwierdzenie znajduje się w konkretnej gałęzi:
git log <branch> | grep <commit_id>
a jeśli gałąź nie istnieje lokalnie, przedrostek nazwy gałęzi z
origin/
źródło
-a
. Dzięki za radę!Tak, inna alternatywa:
To działa najlepiej dla mnie, ponieważ działałoby również na zdalnych gałęziach buforowanych lokalnie, takich jak
remotes/origin/master
, na którychgit branch --contains
nie będzie działać.Obejmuje to więcej niż pytanie OP dotyczące tylko "bieżącej gałęzi", ale uważam, że głupio jest zadawać "dowolną gałąź" tego pytania, więc i tak zdecydowałem się opublikować tutaj.
źródło
Zwróci nazwę gałęzi docelowej, jeśli identyfikator zatwierdzenia istnieje w tej gałęzi. W przeciwnym razie polecenie zakończy się niepowodzeniem.
źródło
error: malformed object name 'branch-name'
Ponieważ to pytanie ma kilka fajnych odpowiedzi skryptowych, dodaję moje ulubione.
Ten pokaże ci, dla ostatnich
$n
zatwierdzeń, w$br
których gałęziach znajdują się:Ten jest podobny, ale robi to samo dla listy oddziałów:
źródło