Mając gałąź, chciałbym zobaczyć listę zatwierdzeń, które istnieją tylko w tej gałęzi. W tym pytaniu omawiamy sposoby sprawdzenia, które zatwierdzenia znajdują się w jednej gałęzi, ale nie w jednej lub więcej określonych innych gałęzi.
To jest nieco inne. Chciałbym zobaczyć, który zobowiązuje się na jednej gałęzi, ale nie na jakichkolwiek innych branż.
Przypadek użycia dotyczy strategii rozgałęziania, w której niektóre gałęzie powinny być tylko scalane i nigdy nie zatwierdzane bezpośrednio. Byłoby to używane do sprawdzania, czy jakiekolwiek zatwierdzenia zostały wykonane bezpośrednio w gałęzi „tylko do łączenia”.
EDYCJA: Poniżej znajdują się kroki, aby skonfigurować fałszywe repozytorium git do przetestowania:
git init
echo foo1 >> foo.txt
git add foo.txt
git commit -am "initial valid commit"
git checkout -b merge-only
echo bar >> bar.txt
git add bar.txt
git commit -am "bad commit directly on merge-only"
git checkout master
echo foo2 >> foo.txt
git commit -am "2nd valid commit on master"
git checkout merge-only
git merge master
Powinien pojawić się tylko zatwierdzenie z komunikatem „złe zatwierdzenie bezpośrednio przy scalaniu”, które zostało wykonane bezpośrednio w gałęzi tylko do scalania.
git log ^branch1 ^branch2 merge-only-branch
składni?git log ^branch1 ^branch2 merge-only-branch
Wymaga wymieniając się każdą gałąź. Można tego uniknąć dzięki sprytnemu użyciu bash / grep (zobacz moją odpowiedź poniżej), ale mam nadzieję, że git ma do tego wbudowaną obsługę. Masz rację, zakładając, że wszystkie gałęzie scalania są zdalne (tylko lokalne są tak dobre, jak nieistniejące dla innych programistów). Użycie--no-merges
powoduje pominięcie wszelkich zatwierdzeń, które zostały scalone, a następnie usunięto ich oryginalną gałąź typu merge-from, więc zakłada się, że gałęzie typu merge-from są zachowywane, dopóki nie zostaną scalone w gałąź non-merge-only (tj. Master).Odpowiedzi:
Właśnie znaleźliśmy to eleganckie rozwiązanie
W twoim przykładzie oczywiście nadal pojawia się początkowe zatwierdzenie.
ta odpowiedź nie odpowiada dokładnie na pytanie, ponieważ początkowe zatwierdzenie wciąż się pojawia. Z drugiej strony wydaje się, że wielu przyjeżdżających tutaj ludzi znajduje odpowiedź, której szukają.
źródło
initial valid commit
, co jest częścią obu gałęzimerge-only
imaster
. Jednakże, jeśli podejmiemy wysiłek włożenia na końcu nazwy bieżącej gałęzi, po której następuje nazwa (nazwy) gałęzi z prefiksem ^, z których wynika, że bieżąca gałąź się wywodzi, rozwiązuje to połowę problemów (z wyłączeniem rzeczy, które zostały scalone). Np .:git log --first-parent --no-merges merge-only ^master
git log --first-parent --no-merges | grep <branch_name>
Dzięki uprzejmości mojego drogiego przyjaciela Redmumby :
... gdzie
origin/merge-only
jest nazwa twojego zdalnego oddziału tylko do scalania. Jeśli pracujesz na lokalnym repozytorium git, zastąprefs/remotes/origin
gorefs/heads
i zastąp nazwę zdalnego oddziału nazwąorigin/merge-only
lokalnego oddziałumerge-only
, tj .:źródło
git for-each-ref
do wyświetlania wszystkich nazw referencyjnych w miejscu pochodzenia igrep -v
do pominięcia gałęzi tylko do scalania.git log
przyjmuje--not
opcję, do której przekazujemy naszą listę wszystkich referencji (z wyjątkiem gałęzi tylko do scalania). Jeśli masz bardziej elegancką odpowiedź na problem, posłuchajmy tego./*
wgit for-each-refs
poleceniach polegać na nie pasujące jakiś istniejący plik i nie posiadającefailglob
lubnullglob
zestaw ( bash opcje, inne pociski zmieniać). Należy albo zacytować / pominąć gwiazdkę, albo po prostu zostawić koniec/*
(git for-each-ref
wzorce mogą być dopasowane „od początku do ukośnika”). Może użyjgrep -Fv refs/remotes/origin/foo
(refs/heads/foo
), aby dokładniej określić, które odwołania są eliminowane.git log --no-merges B1 --not B2
gdzie B1 to gałąź, którą Cię interesuje, a B2 to gałąź, z którą chcesz porównać B1. Zarówno B1, jak i B2 mogą być oddziałami lokalnymi lub zdalnymi, dlatego można określićgit log --no-merges master --not origin/master
, a nawet określić dwa gałęzie zdalne.Spowoduje to wyświetlenie wszystkich zatwierdzeń dokonanych w Twojej gałęzi.
źródło
origin/branchName
będzie wskazywać na głowę zdalnego oddziału ORAZHEAD
wskaże na zatwierdzenie ostatniego lokalnego zatwierdzenia w tej gałęzi. Więc to nie zadziała, jeśli użyłeś git push.Odpowiedź @Prakash działa. Dla jasności ...
wymienia zatwierdzenia w gałęzi funkcji, ale nie w gałęzi nadrzędnej (zazwyczaj jest to główna gałąź).
źródło
Może to mogłoby pomóc:
źródło
Spróbuj tego:
Gruntownie
git rev-list --all ^branch
pobiera wszystkie wersje nie w gałęzi, a następnie wszystkie wersje w repozytorium i odejmuje poprzednią listę, która jest wersjami tylko w gałęzi.Po komentarzach @ Briana:
Z dokumentacji git rev-list:
List commits that are reachable by following the parent links from the given commit(s)
Więc takie polecenie
git rev-list A
gdzie A jest zatwierdzeniem wyświetli listę zatwierdzeń, które są osiągalne z A włącznie z A.Mając to na uwadze, coś w stylu
git rev-list --all ^A
wyświetli listę zatwierdzeń nieosiągalnych z A
Więc
git rev-list --all ^branch
wyświetli listę wszystkich zatwierdzeń nieosiągalnych z końca gałęzi. Który usunie wszystkie zatwierdzenia w gałęzi, lub innymi słowy, zmiany, które są tylko w innych gałęziach.A teraz przejdźmy do
git rev-list --all --not $(git rev-list --all ^branch)
To będzie jak
git rev-list --all --not {commits only in other branches}
Więc chcemy wymienić
all
, do których nie można dotrzećall commits only in other branches
Który jest zbiorem zatwierdzeń, które są tylko w gałęzi. Weźmy prosty przykład:
Tutaj celem jest uzyskanie D i E, a zatwierdzeń nie ma w żadnej innej gałęzi.
git rev-list --all ^branch
dać tylko BTeraz do
git rev-list --all --not B
czego doszliśmy. Co jest równieżgit rev-list -all ^B
- chcemy, aby wszystkie zatwierdzenia nie były osiągalne z B. W naszym przypadku jest to D i E. Właśnie tego chcemy.Mam nadzieję, że to wyjaśnia, jak polecenie działa poprawnie.
Edytuj po komentarzu:
Po wykonaniu powyższych kroków, jeśli zrobisz a
git rev-list --all --not $(git rev-list --all ^merge-only)
, otrzymasz commit, którego szukałeś - ten"bad commit directly on merge-only"
.Ale gdy wykonasz ostatni krok w swoich krokach,
git merge master
polecenie nie da oczekiwanych wyników. Ponieważ na razie nie ma zatwierdzenia, którego nie ma w trybie scalania, ponieważ jedno dodatkowe zatwierdzenie w trybie głównym również zostało scalone, aby uzyskać tylko scalanie. Więcgit rev-list --all ^branch
daje wynik pusty, a tym samymgit rev-list -all --not $(git rev-list --all ^branch)
daje wszystkie te rewizje w seryjnej tylko.źródło
xargs -L 1 -t git branch -a --contains
pokazania wielu fałszywych alarmów (zatwierdzeń, które w rzeczywistości znajdują się w innych gałęziach). Próbowałem zi bez--no-merges
. Dzięki za odpowiedź!git rev-list --all ^branch
da ci wszystkie zatwierdzenia, których nie mabranch
. Następnie odejmujesz to od listy, która jest wbranch
; ale z definicji nie ma wszystkich zatwierdzeń, których niebranch
mabranch
, więc niczego nie odejmujesz. To, czego szuka jimmyorr, to commity, które są,branch
ale ich nie mamaster
, ani żadna inna gałąź. Nie chcesz odejmować zatwierdzeń, których nie mabranch
; chcesz odjąć zatwierdzenia, które są w innych gałęziach.branch
, ale tak samogit rev-list branch
. Po prostu piszeszgit rev-list branch
w bardziej skomplikowany (i wolniejszy) sposób. Nie działa odpowiedź na pytanie, jak znaleźć wszystkie zatwierdzeniabranch
, których nie ma w żadnej innej gałęzi .Kolejna odmiana akceptowanych odpowiedzi do użycia z
master
git log origin/master --not $(git branch -a | grep -Fv master)
Filtruj wszystkie zatwierdzenia, które mają miejsce w dowolnej gałęzi innej niż główna.
źródło
To nie jest do końca prawdziwa odpowiedź, ale potrzebuję dostępu do formatowania i dużo miejsca. Spróbuję opisać teorię stojącą za tym, co uważam za dwie najlepsze odpowiedzi: zaakceptowaną i (przynajmniej obecnie) najwyżej sklasyfikowaną . Ale w rzeczywistości odpowiadają na różne pytania .
Zatwierdzenia w Git są bardzo często „na” więcej niż jednej gałęzi naraz. Rzeczywiście, w dużej mierze o to chodzi w tym pytaniu. Dany:
gdzie wielkie litery stanąć do rzeczywistych Git identyfikatorów hash, jesteśmy często szukają tylko popełnić
H
lub popełnia tylkoI-J
w naszejgit log
mocy. Zatwierdzenia do góryG
znajdują się w obu gałęziach, więc chcielibyśmy je wykluczyć.(Zwróć uwagę, że na wykresach narysowanych w ten sposób nowsze zatwierdzenia znajdują się po prawej stronie. Nazwy wybierają pojedynczy zatwierdzenie najbardziej na prawo w tej linii. Każde z tych zatwierdzeń ma zatwierdzenie nadrzędne, które jest zatwierdzeniem po ich lewej stronie: rodzicem
H
jestG
, a rodzicemJ
jestI
. Element rodzicem znowuI
jestG
. Element nadrzędnyG
jestF
iF
ma rodzica, którego po prostu nie ma tutaj: jest częścią...
sekcji).W tym szczególnie prostym przypadku możemy użyć:
do obejrzenia
I-J
lub:H
tylko do przeglądania . Nazwa po prawej stronie, po dwóch kropkach, mówi Gitowi: tak, te zatwierdzenia . Nazwa po lewej stronie, przed dwiema kropkami, mówi Gitowi: nie, nie te zatwierdzenia . Git zaczyna się na końcu - przy zatwierdzaniuH
lub zatwierdzaniuJ
- i działa wstecz . Aby uzyskać (dużo) więcej informacji na ten temat, zobacz Think Like (a) Git .Sposób sformułowania oryginalnego pytania polega na znalezieniu zatwierdzeń, które są osiągalne z jednej konkretnej nazwy, ale nie z innej nazwy w tej samej kategorii ogólnej. To znaczy, jeśli mamy bardziej złożony wykres:
moglibyśmy wybrać jedną z tych nazw, na przykład
name4
lubname3
, i zapytać: które zmiany można znaleźć pod tą nazwą, ale nie pod żadną inną? Jeśli wybierzemy,name3
odpowiedzią jest zobowiązanieL
. Jeśli wybierzemyname4
, odpowiedź brzmi: w ogóle nie ma zatwierdzeń: zatwierdzenie, któregoname4
nazwy są zatwierdzone,N
ale zatwierdzone,N
można znaleźć, zaczynając odname5
i pracując wstecz.Zaakceptowana odpowiedź działa z nazwami zdalnego śledzenia, a nie nazwami gałęzi, i umożliwia wyznaczenie jednej - pisanej
origin/merge-only
- jako wybranej nazwy i przejrzenie wszystkich innych nazw w tej przestrzeni nazw. Unika również pokazywania scaleń: jeśli wybierzemyname1
jako „interesującą nazwę” i powiemy, że pokażemy mi zatwierdzenia, do których można dotrzeć,name1
ale nie pod inną nazwą , zobaczymy zarówno zatwierdzenie scalające,M
jak i zwykłeI
.Najpopularniejsza odpowiedź jest zupełnie inna. Chodzi o przechodzenie przez wykres zatwierdzeń bez podążania za obydwoma etapami scalania i bez pokazywania jakichkolwiek zatwierdzeń, które są scalane. Jeśli zaczniemy
name1
, na przykład, nie pokażemyM
(jest to scalanie), ale zakładając, że pierwszym rodzicem mergeM
jest commitI
, nie będziemy nawet patrzeć na commitsJ
iK
. Będziemy skończyć pokazując popełnieniaI
, a także zobowiązuje sięH
,G
,F
, i tak dalej, żaden z nich są commity scalania i wszystkie są osiągalne przez zaczynającM
i działa wstecz, odwiedzając tylko pierwszego rodzica każdego scalającej.Najpopularniejsza odpowiedź jest całkiem odpowiednia, na przykład do sprawdzenia,
master
kiedymaster
ma być gałęzią tylko do scalania. Jeśli cała "prawdziwa praca" została wykonana na gałęziach bocznych, które następnie zostały scalonemaster
, otrzymamy następujący wzór:gdzie wszystkie zatwierdzenia nienazwane na litery
o
są zwykłymi (nie łączonymi) zatwierdzeniamiM
iN
są zatwierdzeniami scalającymi. CommitI
jest początkowym zatwierdzeniem: pierwszym zatwierdzeniem kiedykolwiek wykonanym i jedynym, który powinien znajdować się na serwerze głównym, który nie jest zatwierdzeniem scalającym. Jeśligit log --first-parent --no-merges master
pokazuje jakikolwiek inny commit niżI
, mamy taką sytuację:gdzie chcemy zobaczyć commit,
*
który został wykonany bezpośredniomaster
, a nie przez scalenie jakiejś gałęzi funkcji.Krótko mówiąc, popularna odpowiedź świetnie nadaje się do sprawdzania,
master
kiedymaster
ma być przeznaczona tylko do scalania, ale nie jest tak dobra w innych sytuacjach. Zaakceptowana odpowiedź działa w innych sytuacjach.Są nazwami zdalnego śledzenia, takimi jak
origin/master
oddział nazw ?Niektóre części Gita mówią, że tak nie jest:
mówi
on branch master
, ale:mówi
HEAD detached at origin/master
. Wolę się zgodzić zgit checkout
/git switch
:origin/master
nie jest nazwą oddziału ponieważ nie można się na nim „załapać”.Zaakceptowana odpowiedź używa nazw zdalnego śledzenia
origin/*
jako „nazw oddziałów”:Środkowa linia, która wywołuje
git for-each-ref
, iteruje po nazwach zdalnego śledzenia dla nazwanego pilotaorigin
.Powodem jest to dobre rozwiązanie pierwotnego problemu jest to, że jesteśmy zainteresowani tutaj w cudze nazwiska branży, zamiast naszymi nazwiskami branży. Ale to oznacza, że zdefiniowaliśmy gałąź jako coś innego niż nasze nazwy gałęzi . W porządku: po prostu bądź świadomy, że to robisz, kiedy to robisz.
git log
przechodzi przez jakąś część (y) wykresu zatwierdzeniaTo, czego tak naprawdę szukamy, to serie tego, co nazwałem dagletami: zobacz Co dokładnie rozumiemy przez „gałąź”? Oznacza to, że szukamy fragmentów w pewnym podzbiorze ogólnego wykresu zatwierdzeń .
Za każdym razem, gdy Git patrzy na nazwę gałęzi
master
, taką jak nazwa taguv2.1
lub nazwa zdalnego śledzenia, taka jakorigin/master
, zwykle chcemy, aby Git powiedział nam o tym zatwierdzeniu i każdym zatwierdzeniu, do którego możemy się dostać z tego zatwierdzenia: zaczynając od tego i pracując wstecz.W matematyce nazywa się to chodzeniem po wykresie . Wykres zatwierdzenia Gita jest ukierunkowanym wykresem acyklicznym lub DAG i ten rodzaj wykresu jest szczególnie odpowiedni do chodzenia. Przechodząc po takim wykresie, odwiedzamy każdy wierzchołek wykresu, do którego można dotrzeć za pomocą używanej ścieżki. Wierzchołki na wykresie Git są zatwierdzeniami, a krawędzie są łukami - łączami jednokierunkowymi - przechodzącymi od każdego dziecka do każdego rodzica. (Tutaj Think Like (a) Git . Jednokierunkowa natura łuków oznacza, że Git musi działać wstecz, od dziecka do rodzica.)
Dwa główne polecenia Gita do poruszania się po wykresie to
git log
igit rev-list
. Te polecenia są niezwykle podobne - w rzeczywistości są w większości zbudowane z tych samych plików źródłowych - ale ich wyjście jest inne:git log
tworzy dane wyjściowe do odczytania przez ludzi, podczas gdygit rev-list
tworzy dane wyjściowe przeznaczone do odczytu przez inne programy Git. 1 Obie komendy wykonują ten rodzaj spaceru po wykresie.Spacer po wykresie, który wykonują, jest konkretnie: mając pewien zestaw zatwierdzeń punktu początkowego (może tylko jeden zatwierdzenie, być może kilka identyfikatorów hash, być może kilka nazw, które rozwiązują się jako hash ID), przejdź po wykresie, odwiedzając commits . Poszczególne dyrektywy, takie jak
--not
lub przedrostek^
, lub--ancestry-path
, lub--first-parent
, w jakiś sposób modyfikują przebieg wykresu .Przechodząc po wykresie, odwiedzają każde zatwierdzenie. Ale drukują tylko wybrany podzbiór zatwierdzeń przechodzących. Dyrektywy takie jak
--no-merges
lub--before <date>
informują kod chodzący po wykresie, który zobowiązuje się do wydrukowania .Aby wykonać tę wizytę, po jednym zatwierdzeniu na raz, te dwie komendy używają kolejki priorytetowej . Uruchomić
git log
albogit rev-list
i nadać mu pewne Punkt startowy zobowiązuje. Umieszczają te zatwierdzenia w kolejce priorytetowej. Na przykład prosty:zamienia nazwę
master
na nieprzetworzony identyfikator skrótu i umieszcza ten identyfikator w kolejce. Lub:zamienia obie nazwy w hash ID i - zakładając, że są to dwa różne hash ID - umieszcza oba w kolejce.
Priorytet zatwierdzeń w tej kolejce jest określany przez jeszcze więcej argumentów. Na przykład argument
--author-date-order
mówigit log
lubgit rev-list
ma używać sygnatury czasowej autora zamiast sygnatury czasowej osoby zatwierdzającej. Domyślnie używa się sygnatury czasowej osoby zatwierdzającej i wybiera zatwierdzenie według daty najnowszej: to z najwyższą datą liczbową. Tak więcmaster develop
, zakładając, że te rozwiązania dotyczą dwóch różnych zatwierdzeń, Git pokaże, który z nich pojawił się później jako pierwszy, ponieważ będzie to na początku kolejki.W każdym razie chodzący kod rewizji działa teraz w pętli:
--no-merges
: nie drukuj nic, jeśli jest to zatwierdzenie scalające;--before
: nic nie drukuj, jeśli jego data nie przypada przed wyznaczonym czasem. Jeśli drukowanie nie jest wyłączone, wypisz zatwierdzenie: forgit log
, pokaż jego dziennik; dlagit rev-list
, wypisuje jego hash ID.--first-parent
pomija wszystkie elementy oprócz pierwszego rodzica każdego scalania.(Oba
git log
igit rev-list
mogą upraszczać historię z lub bez przepisywania rodzica również w tym momencie, ale pominiemy to tutaj).W przypadku prostego łańcucha, takiego jak rozpoczynanie od
HEAD
i praca wstecz, gdy nie ma zatwierdzeń scalających, kolejka zawsze ma jedno zatwierdzenie na początku pętli. Jest jedno zatwierdzenie, więc zdejmujemy go i drukujemy, a następnie umieszczamy jego (pojedynczego) rodzica w kolejce i ponownie jedziemy, a następnie podążamy za łańcuchem wstecz, aż dotrzemy do pierwszego zatwierdzenia, albo użytkownik zmęczy sięgit log
wyjściem program. W tym przypadku żadna z opcji zamówienia nie ma znaczenia: zawsze jest tylko jedno zobowiązanie do wyświetlenia.Kiedy występują połączenia i podążamy za obojgiem rodziców - obydwie „odnogi” scalania - lub gdy dajesz
git log
lubgit rev-list
więcej niż jedno zatwierdzenie początkowe, opcje sortowania mają znaczenie.Na koniec rozważ efekt
--not
lub^
przed specyfikatorem zatwierdzenia. Można je zapisać na kilka sposobów:lub:
lub:
wszystkie oznaczają to samo. To
--not
jest jak przedrostek^
poza tym, że odnosi się do więcej niż jednej nazwy:oznacza nie gałąź1, nie gałąź2, tak gałąź3;ale:
oznacza nie gałąź1, nie gałąź2, nie gałąź3 i musisz użyć drugiej
--not
aby ją wyłączyć:co jest trochę niezręczne. Dwie dyrektywy „nie” są połączone za pomocą XOR, więc jeśli naprawdę chcesz, możesz napisać:
to znaczy nie gałąź1, nie gałąź2, tak gałąź3 , jeśli chcesz zaciemnić .
Wszystko to działa poprzez wpływ na spacer po wykresie. Podczas poruszania się po wykresie
git log
lubgit rev-list
przechodzenia przez wykres, zapewnia, że nie umieszcza w kolejce priorytetów żadnego zatwierdzenia, które jest osiągalne z któregokolwiek z zanegowanych odwołań. (W rzeczywistości wpływają one również na konfigurację początkową: zanegowane zatwierdzenia nie mogą przejść do kolejki priorytetów bezpośrednio z wiersza poleceń, więcgit log master ^master
na przykład nic nie pokazuje).Cała fantazyjna składnia opisana w dokumentacji gitrevisions wykorzystuje to i możesz to ujawnić za pomocą prostego wywołania
git rev-parse
. Na przykład:Składnia z trzema kropkami oznacza zatwierdzenia dostępne z lewej lub prawej strony, ale z wyłączeniem zatwierdzeń osiągalnych z obu . W tym przypadku
origin/master
zatwierdzenieb34789c0b
, jest samo osiągalne zorigin/pu
(fc307aa37...
), więcorigin/master
hash pojawia się dwukrotnie, raz z negacją, ale w rzeczywistości Git osiąga składnię z trzema kropkami, umieszczając dwie dodatnie referencje - dwa nie negowane hash ID - i jeden ujemny, reprezentowany przez^
przedrostek.Podobnie:
Te
^@
środki składniowe wszyscy rodzice dany popełnić , amaster^
sama-pierwszy rodzic commit wybrany przez oddział-namemaster
-jest scalającej, więc ma dwoje rodziców. To są dwoje rodziców. I:Te
^!
środki przyrostek commit się, ale żaden z jego rodzicami . W tym przypadkumaster^
jest0b07eecf6...
. Widzieliśmy już oboje rodziców z^@
przyrostkiem; tutaj są znowu, ale tym razem zaprzeczeni.1 Wiele programów Git działa dosłownie
git rev-list
z różnymi opcjami i czyta ich wyjście, aby wiedzieć, jakich zatwierdzeń i / lub innych obiektów Gita użyć.2 Ponieważ wykres jest acykliczny , można zagwarantować, że żaden z nich nie został jeszcze odwiedzony, jeśli dodamy ograniczenie, nigdy nie pokazuj rodzica przed pokazaniem wszystkich jego dzieci jako priorytetu.
--date-order
,--author-date-order
i--topo-order
dodaj to ograniczenie. Domyślna kolejność sortowania - która nie ma nazwy - nie. Jeśli znaczniki czasu zatwierdzenia są niewyraźne - na przykład niektóre zatwierdzenia zostały wykonane „w przyszłości” przez komputer, którego zegar był wyłączony - może to w niektórych przypadkach prowadzić do dziwnie wyglądających wyników.Jeśli dotarłeś tak daleko, teraz dużo wiesz o tym
git log
Podsumowanie:
git log
polega na wyświetlaniu wybranych zatwierdzeń podczas chodzenia po części lub całości wykresu.--no-merges
Argument znaleźć zarówno w zaakceptowana i aktualnie najlepszych w rankingu odpowiedzi, hamuje pokazujące jakieś rewizje, które są chodził.--first-parent
Argument z aktualnie-top-rankingu-odpowiedź, hamuje chodzenia niektóre części wykresu, podczas wykresu-chodzić sama.--not
Prefiks do argumentów wiersza poleceń, jak stosowane w przyjętym odpowiedź, hamuje kiedykolwiek odwiedzić niektóre części wykresu w ogóle, od samego początku.Korzystając z tych funkcji, otrzymujemy odpowiedzi, które lubimy, na dwa różne pytania.
źródło