Chcę być w stanie znaleźć określony ciąg, który został wprowadzony w dowolnym zatwierdzeniu w dowolnej gałęzi, jak mogę to zrobić? Znalazłem coś (co zmodyfikowałem dla Win32), ale git whatchanged
wydaje się, że nie patrzy na różne gałęzie (zignoruj fragment py3k, to tylko poprawka msys / win line feed)
git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>
Tak naprawdę nie ma znaczenia, czy twoje rozwiązanie jest wolne.
Odpowiedzi:
Możesz to zrobić:
Aby znaleźć wszystkie zatwierdzenia, które dodały lub usunęły ustalony ciąg
whatever
. Ten--all
parametr oznacza rozpoczęcie od każdej gałęzi i--source
oznacza, która z tych gałęzi doprowadziła do znalezienia tego zatwierdzenia. Często przydatne jest dodanie,-p
aby pokazać łatki, które wprowadziłby każdy z tych zatwierdzeń.Wersje git od wersji 1.7.4 również mają podobną
-G
opcję, która przyjmuje wyrażenie regularne . To faktycznie ma inną (i raczej bardziej oczywistą) semantykę, wyjaśnioną w tym blogu od Junio Hamano .Jak wskazuje thameera w komentarzach, musisz wstawić cudzysłowy wokół wyszukiwanego terminu, jeśli zawiera spacje lub inne znaki specjalne, na przykład:
Oto przykład, za pomocą którego
-G
można znaleźć wystąpieniafunction foo() {
:źródło
--decorate
dodaje tylko nazwę gałęzi do zatwierdzenia na końcu każdej gałęzi. W praktyce tak naprawdę nie używam--source
ani--decorate
, a zamiast tego używamgit branch -a --contains <commit-hash>
do znalezienia, które gałęzie zawierają zatwierdzenie, które mnie interesuje.git log -S"dude, where's my car?" --source --all
. @ribamar również napisał to w odpowiedzi poniżej, ale można łatwo przeoczyć tę odpowiedź.--reverse jest również pomocne, ponieważ chcesz pierwszego zatwierdzenia, które dokonało zmiany:
W ten sposób najpierw pojawią się starsze zatwierdzenia.
źródło
Odpowiedź Marka Longaira jest doskonała, ale uważam, że ta prostsza wersja działa dla mnie.
źródło
HEAD
, ale w tym konkretnym pytaniu zadano konkretnie o przejrzeniu wszystkich gałęzi w repozytorium.Bałagan z tymi samymi odpowiedziami:
Teraz możesz zrobić
lub
źródło
Uważaj, aby nie używać spacji między S a „string_to_search”. W niektórych konfiguracjach (git 1.7.1) pojawia się błąd:
źródło
Chociaż nie odpowiada to bezpośrednio na pytanie, myślę, że może to być dobre rozwiązanie dla ciebie w przyszłości. Widziałem część mojego kodu, co było złe. Nie wiedziałam, kto to napisał i kiedy. Widziałem wszystkie zmiany z pliku, ale było jasne, że kod został przeniesiony z innego pliku do tego. Chciałem przede wszystkim dowiedzieć się, kto go dodał.
Aby to zrobić, użyłem Git Bisect , co szybko pozwoliło mi znaleźć grzesznika.
Pobiegłem,
git bisect start
a potemgit bisect bad
, ponieważ sprawdzona wersja miała problem. Ponieważ nie wiadomo, kiedy problem wystąpił, ja kierowane pierwszy popełnić za „dobre”,git bisect good <initial sha>
.Potem po prostu szukałem w repozytorium złego kodu. Kiedy okazało się, że wpadłem
git bisect bad
, a gdy nie było tam:git bisect good
.W ~ 11 krokach omówiłem ~ 1000 zatwierdzeń i znalazłem dokładne zatwierdzenie, w którym problem został wprowadzony. Całkiem dobrze.
źródło
Nie jestem pewien, dlaczego zaakceptowana odpowiedź nie działa w moim środowisku, w końcu uruchamiam poniżej polecenia, aby uzyskać to, czego potrzebuję
źródło