Come determinare quando è stato creato un ramo Git?

C’è un modo per determinare quando è stato creato un ramo Git? Ho un ramo nel mio repository e non ricordo di averlo creato e ho pensato che forse vedere il timestamp della creazione avrebbe fatto impazzire la memoria.

Uso

  git show --summary `git merge-base foo master` 

Se preferisci vederlo nel contesto, quindi usa

  gitk --all --select-commit = `git merge-base foo master` 

(dove foo è il nome del ramo che stai cercando).

Immagine dello schermo

Come indicato nei commenti e nella risposta di Jackub , se il tuo ramo è più giovane del numero di giorni impostato nell’impostazione di configurazione gc.reflogexpire (il valore predefinito è 90 giorni), puoi utilizzare il tuo reflog per scoprire quando un il riferimento di ramo è stato creato per la prima volta.

Nota che git reflog può assumere la maggior parte git log flag di git log . Si noti inoltre che i selettori di stile [email protected]{0} sono effettivamente nozioni di tempo e, di fatto, vengono gestiti (in un modo hackerato) come stringhe di data. Ciò significa che puoi usare flag --date=local e ottenere output come questo:

  $ git reflog --date = local
 763008c HEAD @ {Fri Aug 20 10:09:18 2010}: pull: Avanzamento veloce
 f6cec0a HEAD @ {Tue ago 10 09:37:55 2010}: pull: Avanzamento veloce
 e9e70bc HEAD @ {Gio 4 feb. 02:51:10 2010}: pull: Avanti veloce
 836f48c HEAD @ {Gio Gen 21 14:08:14 2010}: checkout: passaggio da master a master
 836f48c HEAD @ {Gio 21 Gen 14:08:10 2010}: pull: Avanti veloce
 24bc734 HEAD @ {Mer 20 gen, 12:05:45 2010}: cassa: trasferirsi da 74fca6a42863ffacaf7ba6f1936a9f228950f657 
 74fca6a HEAD @ {Wed Jan 20 11:55:43 2010}: checkout: passaggio da master a v2.6.31
 24bc734 HEAD @ {Wed Jan 20 11:44:42 2010}: pull: Avanti veloce
 964fe08 HEAD @ {lunedì 26 ottobre 15:29:29 2009}: checkout: spostamento da 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 
 4a6908a HEAD @ {lunedì 26 ottobre 14:52:12 2009}: checkout: passaggio da master a v2.6.28

Può anche essere utile a volte utilizzare --date=relative :

  $ git reflog --date = relativo
 763008c HEAD @ {4 settimane fa}: pull: Avanzamento veloce
 f6cec0a HEAD @ {6 settimane fa}: pull: Avanzamento veloce
 e9e70bc HEAD @ {8 mesi fa}: pull: Avanzamento veloce
 836f48c HEAD @ {8 mesi fa}: checkout: passaggio da master a master
 836f48c HEAD @ {8 mesi fa}: pull: Avanzamento veloce
 24bc734 HEAD @ {8 mesi fa}: checkout: passaggio da 74fca6a42863ffacaf7ba6f1936a9f228950f657 al master
 74fca6a HEAD @ {8 mesi fa}: checkout: passaggio da master a v2.6.31
 24bc734 HEAD @ {8 mesi fa}: pull: Avanzamento veloce
 964fe08 HEAD @ {11 mesi fa}: checkout: passaggio da 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 al master
 4a6908a HEAD @ {11 mesi fa}: checkout: passaggio da master a v2.6.28

Un’ultima nota: il flag --all (che in realtà è un flag git-log interpretato da git-reflog) mostrerà i riferimenti per tutti i refs noti in refs/ (invece di semplicemente HEAD ) che mostrerà chiaramente gli eventi del ramo:

  git reflog --date = local --all
 860e4e4 refs / heads / master @ {dom 19 settembre 23:00:30 2010} commit: second.
 17695bc refs / heads / example_branch @ {lun set 20 00:31:06 2010}: branch: creato da HEAD

Innanzitutto, se il tuo ramo è stato creato entro gc.reflogexpire days (predefinito 90 giorni, ovvero circa 3 mesi), puoi usare git log -g o git reflog show per trovare la prima voce in reflog, che sarebbe evento di creazione e assomiglia a qualcosa di seguito (per git log -g ):

 Reflog: @{} (CR Eator ) Reflog message: branch: Created from  

Otterrai chi ha creato un ramo, quante operazioni fa e da quale ramo (beh, potrebbe essere solo “Creato da HEAD”, che non aiuta molto).

Questo è ciò che MikeSep ha detto nella sua risposta .


In secondo luogo, se hai un ramo più lungo di gc.reflogexpire e hai eseguito git gc (o è stato eseguito automaticamente), dovresti trovare un antenato comune con il ramo da cui è stato creato. Dai un’occhiata al file di configurazione, forse c’è la voce branch..merge , che ti dirà su quale ramo è basato questo.

Se si sa che il ramo in questione è stato creato fuori ramo principale (biforcazione dal ramo principale), ad esempio, è ansible utilizzare il seguente comando per visualizzare antenato comune:

 git show $(git merge-base  master) 

Puoi anche provare git show-branch master , in alternativa.

Questo è ciò che ha detto gbacon nella sua risposta .

Pro Git § 3.1 Git Branching – What a Branch Is ha una buona spiegazione di cosa sia veramente un ramo git

Un ramo in Git è semplicemente un puntatore leggero mobile a [a] commit.

Poiché un ramo è solo un puntatore leggero, git non ha alcuna nozione esplicita della sua storia o data di creazione. “Ma aspetta,” ti sento dire “naturalmente git conosce la storia del mio ramo!” Bene, un po ‘.

Se si esegue una delle seguenti operazioni:

 git log  --not master gitk  --not master 

vedrai ciò che assomiglia alla “storia del tuo ramo”, ma in realtà è un elenco di commit raggiungibili da “branch” che non sono raggiungibili dal master. Questo ti dà le informazioni che desideri, ma se e solo se non hai mai unito il “ramo” al master, e non hai mai unito il master in “branch” da quando lo hai creato. Se ti sei unito, questa cronologia delle differenze crollerà.

Fortunatamente il reflog contiene spesso le informazioni che desideri, come spiegato in varie altre risposte qui. Usa questo:

 git reflog --date=local  

per mostrare la storia del ramo. L’ultima voce in questa lista è (probabilmente) il punto in cui hai creato il ramo.

Se il ramo è stato cancellato, allora ‘branch’ non è più un identificatore git valido, ma puoi invece usarlo, il che potrebbe trovare quello che vuoi:

 git reflog --date=local | grep  

O in una shell di cmd di Windows:

 git reflog --date=local | find "" 

Nota che reflog non funzionerà efficacemente sui rami remoti, solo quelli su cui hai lavorato localmente.

Non sono ancora sicuro del comando git, ma penso che tu possa trovarli nei reflog.

 .git/logs/refs/heads/ 

I miei file sembrano avere un timestamp unix in loro.

Aggiornamento: sembra esserci un’opzione per usare la cronologia del reflog invece della cronologia del commit quando si stampano i registri:

 git log -g 

Puoi seguire questo registro anche quando hai creato il ramo. git log mostra la data del commit, tuttavia, non la data in cui è stata eseguita l’azione che ha effettuato una voce nel reflog. Non l’ho ancora trovato, tranne guardando nel reflog attuale nel percorso sopra.

Uso:

 git reflog 

per mostrare tutto il ciclo di vita del tuo repository nella cartella corrente. Il nome del ramo che appare per primo (dal basso verso l’alto) è la fonte che è stata creata.

 855a3ce [email protected]{0}: checkout: moving from development to feature-sut-46 855a3ce [email protected]{1}: checkout: moving from feature-sut-46 to development 855a3ce [email protected]{2}: checkout: moving from feature-jira35 to feature-sut-46 535dd9d [email protected]{3}: checkout: moving from feature-sut-46 to feature-jira35 855a3ce [email protected]{4}: checkout: moving from development to feature-sut-46 855a3ce [email protected]{5}: checkout: moving from feature-jira35 to development 535dd9d [email protected]{6}: commit: insert the format for vendor specific brower - screen.css 855a3ce [email protected]{7}: checkout: moving from development to feature-jira35 855a3ce [email protected]{8}: checkout: moving from master to development 

Ciò significa:

  • Lo sviluppo del ramo viene creato (checkout -b) dal master

  • Viene creata la funzionalità Branch-jira35 (checkout -b) dallo sviluppo

  • La funzionalità Branch-jira-sut-46 viene creata (checkout -b) dallo sviluppo

Prova questo

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' 

Questo è qualcosa che ho trovato prima di trovare questo thread.

 git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1 git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:'