Mam 57 lokalnych oddziałów. Wiem, że dokonałem zmiany w pewnym pliku w jednym z nich, ale nie jestem pewien, który. Czy jest jakieś polecenie, które mogę uruchomić, aby znaleźć gałęzie zawierające zmiany w określonym pliku?
88
Znajdź wszystkie gałęzie, które zawierają zmianę w FILENAME (nawet jeśli przed (nie zarejestrowanym) punktem rozgałęzienia)
FILENAME="<filename>"
git log --all --format=%H $FILENAME | while read f; do git branch --contains $f; done | sort -u
Sprawdź ręcznie:
gitk --all --date-order -- $FILENAME
Znajdź wszystkie zmiany w FILENAME, które nie zostały scalone z wzorcem:
git for-each-ref --format="%(refname:short)" refs/heads | grep -v master | while read br; do git cherry master $br | while read x h; do if [ "`git log -n 1 --format=%H $h -- $FILENAME`" = "$h" ]; then echo $br; fi; done; done | sort -u
git log -Schange …
lubgit log --grep LOGMESSAGE …
(z… reprezentującym resztę polecenia, o którym wspomniałem).gitk --all -- filename
które pokaże graficznie wszystkie zmiany w tym pliku. Jeśli możesz zidentyfikować dane zatwierdzenie, możesz użyć,git branch --contains
aby zobaczyć, do jakich gałęzi zostało przeniesione zatwierdzenie. Jeśli chcesz zobaczyć, w której gałęzi zostało pierwotnie utworzone dane zatwierdzenie , skorzystaj z Google git-what-branch, ale pamiętaj, że szybkie scalanie może zasłonić te informacje.git log --all --format='--contains %H' "$file" | xargs git branch
Wszystko czego potrzebujesz to
Jeśli chcesz od razu poznać oddział, możesz również skorzystać z:
Ponadto, jeśli masz jakieś zmiany nazw, możesz chcieć dołączyć je
--follow
do polecenia dziennika Git.źródło
--source
tam i jesteś złoty.Wygląda na to, że jest to nadal problem bez odpowiedniego rozwiązania. Nie mam wystarczającej liczby kredytów do skomentowania, więc oto mój mały wkład.
Pierwsze rozwiązanie Setha Robertsona trochę zadziałało, ale dało mi tylko lokalne oddziały, wśród których było wiele fałszywych alarmów, prawdopodobnie z powodu fuzji ze stabilnej gałęzi.
Drugie rozwiązanie Adama Dymitruka w ogóle mi się nie udało. Na początek, co to jest --format =% 5? Nie jest rozpoznawany przez git, nie mogłem nic znaleźć na ten temat i nie mogłem go zmusić do pracy z innymi opcjami formatu.
Ale jego pierwsze rozwiązanie w połączeniu z opcją --source i prostym grepem okazało się pomocne:
To daje mi kilka zdalnych tagów i gałęzi oraz jeden oddział lokalny, w którym wprowadziłem najnowsze zmiany w pliku. Nie wiem, jak kompletne jest to.
AKTUALIZUJ zgodnie z żądaniem @nealmcb, sortowanie gałęzi według ostatniej zmiany:
Najpierw możesz zmienić grep na „refs / heads /.*”, co da ci tylko lokalne gałęzie. Jeśli jest tylko kilka gałęzi, możesz sprawdzić najnowsze zatwierdzenie każdej z nich w następujący sposób:
Jeśli jest więcej gałęzi i naprawdę chcesz to zautomatyzować, możesz połączyć te dwa polecenia za pomocą xargs, formatowania dziennika git i innego sortowania w jedną linijkę:
Spowoduje to następujący wynik:
źródło
Wiem, że to pytanie jest starożytne, ale wracałem do niego, zanim opracowałem własne rozwiązanie. Uważam, że jest bardziej elegancki i dzięki zastosowaniu bazy scalającej odfiltrowuje niechciane gałęzie.
Jeśli umieścisz go w PATH as
git-find-changes
(z uprawnieniami do plików wykonywalnych) - możesz to wywołać za pomocągit find-changes /path
Przykładowe dane wyjściowe dla
git find-changes app/models/
źródło
Poniżej znajduje się nieelegancka metoda brutalnej siły, ale spodziewam się, że powinna działać. Upewnij się, że najpierw zachowałeś wszelkie niezatwierdzone zmiany, ponieważ zmieni to gałąź, w której aktualnie jesteś.
źródło
git log -S
for-each-ref
nadal przestrzega tejshort
flagi. To powiedziawszy, zignoruj moją odpowiedź; inne odpowiedzi są lepsze.