Chcę wyświetlić listę wszystkich zatwierdzeń, które są tylko częścią określonej gałęzi.
Poniżej wymieniono wszystkie zatwierdzenia z oddziału, ale także od rodzica (master)
git log mybranch
Inną opcją, którą znalazłem, było wykluczenie zatwierdzeń osiągalnych przez mistrza i daje mi to, czego chcę, ALE chciałbym uniknąć potrzeby znajomości nazw innych gałęzi.
git log mybranch --not master
Próbowałem użyć git for-each-ref
, ale zawiera on również listę mojej firmy, więc w rzeczywistości wyklucza wszystkie:
git log mybranch --not $(git for-each-ref --format '^%(refname:short)' refs/heads/)
Aktualizacja:
Testuję nową opcję, którą znalazłem jakiś czas temu i do tej pory wydaje się, że może to być to, czego szukałem:
git log --walk-reflogs mybranch
Aktualizacja (2013-02-13T15: 08):
Opcja --walk-reflogs jest dobra, ale sprawdziłem, czy upłynęła data ważności reflogs (domyślnie 90 dni, gc.reflogExpire ).
Myślę, że znalazłem odpowiedź, której szukałem:
git log mybranch --not $(git for-each-ref --format='%(refname)' refs/heads/ | grep -v "refs/heads/mybranch")
Właśnie usuwam bieżącą gałąź z listy dostępnych gałęzi i używam tej listy do wykluczenia z dziennika. W ten sposób otrzymuję tylko zatwierdzenia, które są osiągalne tylko przez mybranch .
Odpowiedzi:
Z tego, co wydaje się, że powinieneś używać
cherry
:To pokazałoby wszystkie zmiany, które są zawarte w mybranch , ale NIE są w fazie rozwoju . Jeśli odrzucisz ostatnią opcję ( mybranch ), zamiast tego porówna ona obecną gałąź.
Jak zauważył VonC, ZAWSZE porównujesz swoją gałąź do innej gałęzi, więc poznaj swoje gałęzie, a następnie wybierz, którą z nich porównać.
źródło
git cherry -v master
porównanie aktualnej gałęzi z gałęzią główną.fatal: Unknown commit mybranch
.Nie sądzę, aby było to możliwe: gałąź w Git jest zawsze oparta na innym lub przynajmniej innym zatwierdzeniu, jak wyjaśniono w „ git diff nie pokazuje wystarczającej ilości ”:
Potrzebujesz punktu odniesienia dla twojego dziennika, aby pokazać właściwe zatwierdzenia.
Jak wspomniano w „ GIT - skąd mam oddział? ”:
Więc nawet jeśli
git log master..mybranch
jest jedna odpowiedź, nadal pokazuje zbyt wiele zmian, jeślimybranch
jest oparty namyotherbranch
samym sobiemaster
.Aby znaleźć to odniesienie (pochodzenie twojej gałęzi), możesz tylko analizować zatwierdzenia i zobaczyć, w której gałęzi są, jak widać na:
źródło
W końcu znalazłem sposób na zrobienie tego, co chciał PO. To tak proste, jak:
Polecenie wyświetli wszystkie zatwierdzenia, które są osiągalne z podanej gałęzi w formacie wykresu. Ale możesz łatwo filtrować wszystkie zatwierdzenia w tej gałęzi, patrząc na wykres zatwierdzeń, który
*
jest pierwszym znakiem w linii zatwierdzeń.Na przykład spójrzmy na fragment
git log --graph master
repozytorium GitHub cakephp poniżej:Jak widać, tylko rewizje
8314c2ff833280bbc7102cb6d4fcf62240cd3ac4
ic3f45e811e4b49fe27624b57c3eb8f4721a4323b
mają*
jako pierwszy znak w linii popełnić. Te zatwierdzenia pochodzą z gałęzi głównej, a pozostałe cztery z innych gałęzi.źródło
Następujące polecenie powłoki powinno robić, co chcesz:
Ostrzeżenia
Jeśli
mybranch
wymeldowałeś się, powyższe polecenie nie będzie działać. To dlatego, że zatwierdzeniamybranch
są również osiągalne przezHEAD
, więc Git nie uważa, że zatwierdzenia są unikalne dlamybranch
. Aby działał, gdymybranch
jest wyrejestrowany, musisz również dodać wykluczenie dlaHEAD
:Nie należy jednak wykluczać,
HEAD
chyba żemybranch
jest zaznaczone, w przeciwnym razie ryzykujesz pokazanie zatwierdzeń, które nie są wyłącznemybranch
.Podobnie, jeśli masz zdalny oddział o nazwie
origin/mybranch
odpowiadającymybranch
oddziałowi lokalnemu , musisz go wykluczyć:A jeśli gałąź zdalna jest domyślną gałęzią dla zdalnego repozytorium (zwykle tylko dla
origin/master
), musisz również wykluczyćorigin/HEAD
:Jeśli masz wyewidencjonowany oddział, i istnieje gałąź zdalna, a gałąź zdalna jest domyślna dla zdalnego repozytorium, to w rezultacie wykluczasz wiele:
Wyjaśnienie
The
git rev-list
komenda jest komendą niskopoziomową (hydrauliczną), która przeprowadza daną wersję i zrzuca napotkane identyfikatory SHA1. Pomyśl o tym jako równoważnym,git log
z tym wyjątkiem, że pokazuje tylko SHA1 - brak wiadomości w dzienniku, bez nazwiska autora, bez znacznika czasu, żadnych z tych „wymyślnych” rzeczy.Ta
--no-walk
opcja, jak sama nazwa wskazuje, uniemożliwiagit rev-list
chodzenie po łańcuchu przodków. Więc jeśli napiszeszgit rev-list --no-walk mybranch
, wydrukuje tylko jeden identyfikator SHA1: identyfikator zatwierdzenia końcówkimybranch
oddziału.Te
--exclude=refs/heads/mybranch --all
argumenty powiedziećgit rev-list
zacząć od każdego odwołania z wyjątkiemrefs/heads/mybranch
.Tak więc, kiedy uruchomisz
git rev-list --no-walk --exclude=refs/heads/mybranch --all
, Git drukuje identyfikator SHA1 zatwierdzenia tip dla każdego ref z wyjątkiemrefs/heads/mybranch
. Te zobowiązania i ich przodkowie są zobowiązaniami, którymi nie jesteś zainteresowany - są to zobowiązania, które robisz nie interesujesz chcesz widzieć.W innych commity są te, które chcesz zobaczyć, więc zbierać wyjście
git rev-list --no-walk --exclude=refs/heads/mybranch --all
i powiedzieć Git, aby zobaczyć wszystko, ale te rewizje i ich przodków.The
--no-walk
Argumentem jest to konieczne dla dużych repozytoriów (i jest optymalizacja dla małych repozytoriach): Bez niej, Git będzie musiał wydrukować, a powłoka musiałby zbierać (i przechowywać w pamięci) wiele więcej popełnić identyfikatory niż to konieczne. Przy dużym repozytorium liczba zebranych zatwierdzeń może łatwo przekroczyć limit argumentów powłoki w wierszu poleceń.Masz błąd?
Spodziewałbym się, że zadziała:
ale tak nie jest. Zgaduję, że to błąd w Git, ale może to celowe.
źródło
hg log -b <branch>
. Nie rozumiem, dlaczego ludzie mówią, że git jest nieprzyjazny. / sgit log --all --not --exclude=refs/heads/mybranch --all
nie działa, alegit log refs/heads/mybranch --not --exclude=refs/heads/mybranch --all
działa, z tymi samymi zastrzeżeniami dotyczącymi wykluczenia HEAD i pochodzenia.Szybka odpowiedź:
Powiedzmy:
Że masz gałąź główną
Zrób kilka zobowiązań
Utworzyłeś oddział o nazwie b2
Czy
git log -n1
; identyfikator zatwierdzenia jest bazą scalającą między b2 a masterWykonaj kilka zmian w b2
git log
pokaże twoją historię logów b2 i masterUżyj zakresu zatwierdzania, jeśli nie znasz pojęcia, zapraszam do google lub stosu przepełnienia,
W twoim rzeczywistym kontekście możesz to zrobić na przykład
„..” to operator zakresu dla komendy log.
To znaczy, w prostej formie, daj mi wszystkie logi nowsze niż commitID_FOO ...
Spójrz na punkt # 4, bazę scalania
Więc:
git log COMMITID_mergeBASE..HEAD
pokaże różnicęGit może pobrać bazę scalania w ten sposób
Wreszcie możesz zrobić:
źródło
Możesz spróbować czegoś takiego:
Lub, pożyczając z przepisu w Podręczniku użytkownika Git :
źródło
git show-ref --tags
.wyświetli wskazówki dla każdej gałęzi, która nie jest
master
.wyświetli listę wszystkich zatwierdzeń w
master
historii, których nie ma w historii żadnej innej gałęzi.Sekwencjonowanie jest ważne dla opcji, które konfigurują potok filtrów do wyboru zatwierdzania, więc
--branches
musi przestrzegać wszelkich wzorców wykluczeń, które powinien zastosować, i--no-walk
musi podążać za filtrami dostarczającymi zatwierdzenia, lista rewizji nie powinna chodzić.źródło
Spowoduje to wyświetlenie zatwierdzeń w bieżącym oddziale. Jeśli jakikolwiek argument zostanie przekazany, to po prostu wyświetla skróty.
git_show_all_commits_only_on_this_branch
źródło
Używam następujących poleceń:
lub
źródło
Uznałem to podejście za stosunkowo łatwe.
Kasa do oddziału i niż
Biegać
Zapewni to tylko dwa SHA:
1) ostatnie zatwierdzenie oddziału [C1]
2) i zatwierdzić rodzica do pierwszego zatwierdzenia oddziału [C2]
Teraz biegnij
Tutaj C1 i C2 to dwa ciągi znaków, które otrzymasz po uruchomieniu pierwszego polecenia. Wpisz te wartości bez <> w drugim poleceniu.
To da listę historii zmian plików w oddziale.
źródło
W mojej sytuacji korzystamy z Git Flow i GitHub. Wszystko, co musisz zrobić, to: Porównaj gałąź funkcji z gałęzią programowania w GitHub.
Pokaże zatwierdzenia dokonane tylko w gałęzi funkcji.
Na przykład:
https://github.com/your_repo/compare/develop...feature_branch_name
źródło
git
i zamiast tego użyć GitHub, aby po prostu wysłać żądanie ściągnięcia lub porównać gałęzie.