Hoe krijg ik commit-geschiedenis voor slechts één branch?

Stel dat ik een nieuwe branch my_experimentheb gemaakt van masteren verschillende commits heb gemaakt voor my_experiment. Als ik een git logdoe op my_experiment, zie ik de commits die zijn gemaakt naar deze branch, maar ook de commits die zijn gemaakt naar mastervóór de my_experimentsbranch is gemaakt.

Ik zou het erg handig vinden om de geschiedenis van alle commits naar de my_experimentsbranch te zien totdat het de creatie van die branch bereikt – in feite een echte geschiedenis van alleen die branch. Anders is het mij niet duidelijk wanneer ik door het logboek kijk of de commits zich in de my_experimentsbranch bevonden of niet.

Is er een manier om dit met Git te doen?


Antwoord 1, autoriteit 100%

Je kunt hiervoor een bereikgebruiken.

git log master..

Als je je my_experimentbranch hebt uitgecheckt. Dit vergelijkt waar masteris met HEAD(de tip van my_experiment).


Antwoord 2, autoriteit 6%

Opmerking: als je dat log beperkt tot de laatste n commit (laatste 3 commits bijvoorbeeld, git log -3), zorg er dan voor dat je een spatie plaatst tussen ‘n’ en je branch:

git log -3 master..

Vóór Git 2.1 (augustus 2014), zou deze fout: git log -3master..je eigenlijk de laatste 3 commits van de huidige branch laten zien (hier my_experiment) , waarbij de master-limiet wordt genegeerd (wat betekent dat als my_experimentslechts één commit bevat, er nog steeds 3 worden vermeld, waarvan er 2 van master)

Zie commit e3fa568door Junio C Hamano (gitster):

revisie: ontleden “git log -<count>” zorgvuldiger

Deze verkeerd getypte opdrachtregel negeert eenvoudig “master” en toont uiteindelijk twee commits van de huidige HEAD:

$ git log -2master

omdat we “2master” invoeren in atoi()zonder ervoor te zorgen dat de hele string wordt geparseerd als een geheel getal.

Gebruik in plaats daarvan de strtol_i()-helpfunctie.


Antwoord 3, autoriteit 5%

Het git merge-basecommando kan worden gebruikt om een gemeenschappelijke voorouder te vinden. Dus als my_experiment nog niet is samengevoegd met master en my_experiment is gemaakt vanuit master, kun je:

git log --oneline `git merge-base my_experiment master`..my_experiment

Antwoord 4

Ik denk dat een optie voor jouw doeleinden git log --online --decorateis. Dit laat je de aangevinkte commit weten, en de top commits voor elke branch die je in je verhaallijn hebt. Door dit te doen, heb je een mooi zicht op de structuur van je repo en de commits die aan een specifieke branch zijn gekoppeld. Ik denk dat het lezen van ditkan helpen.


Antwoord 5

U kunt alleen git log --oneline

. gebruiken


Antwoord 6

Ik weet dat het erg laat is voor deze… Maar hier is een (niet zo eenvoudige) oneliner om te krijgen wat je zocht:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • Wij zijn vermelding commits met filiaalnaam en relatieve posities voor de daadwerkelijke branchestanden met git show-branch(het verzenden van de waarschuwingen naar /dev/null).
  • Dan houden we alleen die met onze filiaalnaam in de beugel met grep -E "\[$BRANCH_NAME".
  • waar daadwerkelijk $BRANCH_NAMEwordt verkregen met git branch | grep -E '^\*' | awk '{ printf $2 }'(de tak met een ster, echode zonder die ster).
  • Van onze resultaten verwijderen we de redundante lijn aan het begin met tail -n+2.
  • En dan reinigen we de uitgang op door alles voorafgaand aan te verwijderen met [$BRANCH_NAME]met sed -E "s/^[^\[]*?\[/[/".

Other episodes