Git
Sintassi di Git Revisions
Ricerca…
Osservazioni
Molti comandi Git accettano i parametri di revisione come argomenti. A seconda del comando, indicano un commit specifico o, per i comandi che eseguono il grafico di revisione (come git-log (1) ), tutti i commit che possono essere raggiunti da quel commit. Solitamente sono indicati come <commit>
, <rev>
o <revision>
nella descrizione della sintassi.
La documentazione di riferimento per la sintassi Git revisions è la manpage gitrevisions (7) .
Manca ancora da questa pagina:
- [_] L'output di
git describe
, ad esempiov1.7.4.2-679-g3bee7fb
- [_]
@
da solo come scorciatoia perHEAD
- [_]
@{-<n>}
, ad es.@{-1}
, e-
significa@{-1}
- [_]
<branchname>@{push}
- [_]
<rev>^@
, per tutti i genitori di<rev>
Richiede documentazione separata:
- [_] Riferendosi a BLOB e alberi nel repository e all'indice:
<rev>:<path>
e:<n>:<path>
sintassi:<n>:<path>
- [_]
A..B
revisione comeA..B
,A...B
,B ^A
,A^1
e la revisione che limita come-<n>
,--since
Specifica della revisione per nome oggetto
$ git show dae86e1950b1277e545cee180551750029cfe735
$ git show dae86e19
È possibile specificare la revisione (o in verità qualsiasi oggetto: tag, ad es. Contenuto della directory, blob cioè contenuto del file) utilizzando il nome oggetto SHA-1, una stringa esadecimale completa da 40 byte o una sottostringa che è univoca per il repository.
Nomi di riferimento simbolici: rami, tag, rami di localizzazione remota
$ git log master # specify branch
$ git show v1.0 # specify tag
$ git show HEAD # specify current branch
$ git show origin # specify default remote-tracking branch for remote 'origin'
È possibile specificare la revisione utilizzando un nome di riferimento simbolico, che include rami (ad esempio "master", "next", "maint"), tag (ad esempio "v1.0", "v0.6.3-rc2"), remote- rami di monitoraggio (ad esempio "origine", "origine / master") e riferimenti speciali come "HEAD" per il ramo corrente.
Se il nome di riferimento simbolico è ambiguo, ad esempio se si ha sia il ramo che il tag denominato "fix" (non è consigliabile avere branch e tag con lo stesso nome), è necessario specificare il tipo di ref che si desidera utilizzare:
$ git show heads/fix # or 'refs/heads/fix', to specify branch
$ git show tags/fix # or 'refs/tags/fix', to specify tag
La revisione predefinita: HEAD
$ git show # equivalent to 'git show HEAD'
'HEAD' assegna il commit su cui hai basato le modifiche nell'albero di lavoro, e solitamente è il nome simbolico per il ramo corrente. Molti comandi (ma non tutti) che riportano il parametro di revisione su "HEAD" è impostato su "mancante".
Riferimenti a Reflog: @ { }
$ git show @{1} # uses reflog for current branch
$ git show master@{1} # uses reflog for branch 'master'
$ git show HEAD@{1} # uses 'HEAD' reflog
Un riferimento, in genere una diramazione o HEAD, seguito dal suffisso @
con una specifica ordinale racchiusa in una coppia di parentesi graffe (ad esempio {1}
, {15}
) specifica il n-esimo valore precedente di tale riferimento nel repository locale . È possibile controllare le voci recenti di Reflog con il comando git reflog
o l' --walk-reflogs
/ -g
su git log
.
$ git reflog
08bb350 HEAD@{0}: reset: moving to HEAD^
4ebf58d HEAD@{1}: commit: gitweb(1): Document query parameters
08bb350 HEAD@{2}: pull: Fast-forward
f34be46 HEAD@{3}: checkout: moving from af40944bda352190f05d22b7cb8fe88beb17f3a7 to master
af40944 HEAD@{4}: checkout: moving from master to v2.6.3
$ git reflog gitweb-docs
4ebf58d gitweb-docs@{0}: branch: Created from master
Nota : l'uso di reflog ha praticamente sostituito il vecchio meccanismo di utilizzo di ORIG_HEAD
ref (grosso modo equivalente a HEAD@{1}
).
Riferimenti a Reflog: @ { }
$ git show master@{yesterday}
$ git show HEAD@{5 minutes ago} # or HEAD@{5.minutes.ago}
Un riferimento seguito dal suffisso @
con una specifica data racchiusa in una coppia di parentesi graffe (ad esempio {yesterday}
, {1 month 2 weeks 3 days 1 hour 1 second ago}
o {1979-02-26 18:30:00}
) specifica il valore del riferimento in un momento precedente nel tempo (o il punto più vicino ad esso). Nota che questo cerca lo stato del tuo ref locale in un dato momento; ad esempio, cosa c'era nella tua filiale "master" la scorsa settimana.
È possibile utilizzare git reflog
con un git reflog
di data per cercare l'ora esatta in cui si è fatto qualcosa al dato ref nel repository locale.
$ git reflog HEAD@{now}
08bb350 HEAD@{Sat Jul 23 19:48:13 2016 +0200}: reset: moving to HEAD^
4ebf58d HEAD@{Sat Jul 23 19:39:20 2016 +0200}: commit: gitweb(1): Document query parameters
08bb350 HEAD@{Sat Jul 23 19:26:43 2016 +0200}: pull: Fast-forward
Succursale tracciato / a monte: @{a monte}
$ git log @{upstream}.. # what was done locally and not yet published, current branch
$ git show master@{upstream} # show upstream of branch 'master'
Il suffisso @{upstream}
aggiunto ad un branchname (forma breve <branchname>@{u}
) si riferisce al ramo che il ramo specificato da branchname è impostato per costruire sopra (configurato con branch.<name>.remote
e branch.<name>.merge
, o con git branch --set-upstream-to=<branch>
). Un nome di diramazione mancante è quello predefinito.
Insieme alla sintassi per gli intervalli di revisione è molto utile vedere il commit che il tuo ramo è più avanti rispetto a monte (commit nel tuo repository locale non ancora presente upstream), e cosa ti spinge indietro (commit in upstream non fuso nel ramo locale), o tutti e due:
$ git log --oneline @{u}..
$ git log --oneline ..@{u}
$ git log --oneline --left-right @{u}... # same as ...@{u}
Impegno catena di appartenenza: ^, ~ , eccetera.
$ git reset --hard HEAD^ # discard last commit
$ git rebase --interactive HEAD~5 # rebase last 4 commits
Un suffisso ^
a un parametro di revisione indica il primo genitore di quell'oggetto commit. ^<n>
significa il <n> -th genitore (cioè <rev>^
è equivalente a <rev>^1
).
Un suffisso ~<n>
a un parametro di revisione indica l'oggetto commit che è l'antenato della generazione precedente <n> dell'oggetto denominato commit, seguendo solo i primi genitori. Ciò significa che per esempio <rev>~3
è equivalente a <rev>^^^
. Come scorciatoia, <rev>~
significa <rev>~1
ed è equivalente a <rev>^1
o <rev>^
in breve.
Questa sintassi è componibile.
Per trovare tali nomi simbolici è possibile utilizzare il comando git name-rev
:
$ git name-rev 33db5f4d9027a10e477ccf054b2c1ab94f74c85a
33db5f4d9027a10e477ccf054b2c1ab94f74c85a tags/v0.99~940
Si noti che --pretty=oneline
e non --oneline
devono essere utilizzati nell'esempio seguente
$ git log --pretty=oneline | git name-rev --stdin --name-only
master Sixth batch of topics for 2.10
master~1 Merge branch 'ls/p4-tmp-refs'
master~2 Merge branch 'js/am-call-theirs-theirs-in-fallback-3way'
[...]
master~14^2 sideband.c: small optimization of strbuf usage
master~16^2 connect: read $GIT_SSH_COMMAND from config file
[...]
master~22^2~1 t7810-grep.sh: fix a whitespace inconsistency
master~22^2~2 t7810-grep.sh: fix duplicated test name
Dereferenziazione di rami e tag: ^ 0, ^ { }
In alcuni casi, il comportamento di un comando dipende dal fatto che gli sia stato assegnato un nome di ramo, un nome di tag o una revisione arbitraria. È possibile utilizzare la sintassi "de-referenziazione" se è necessario il secondo.
Un suffisso ^
seguito da un nome di tipo oggetto ( tag
, commit
, tree
, blob
) racchiuso tra parentesi graffe (ad esempio v0.99.8^{commit}
) significa dereferenziare l'oggetto in <rev>
modo ricorsivo fino a un oggetto di tipo <type>
viene trovato o l'oggetto non può più essere dereferenziato. <rev>^0
è una scorciatoia per <rev>^{commit}
.
$ git checkout HEAD^0 # equivalent to 'git checkout --detach' in modern Git
Un suffisso ^
seguito da una parentesi graffa vuota (ad esempio v0.99.8^{}
) significa dereferenziare il tag in modo ricorsivo finché non viene trovato un oggetto non tag.
Confrontare
$ git show v1.0
$ git cat-file -p v1.0
$ git replace --edit v1.0
con
$ git show v1.0^{}
$ git cat-file -p v1.0^{}
$ git replace --edit v1.0^{}
Il commit di corrispondenza più giovane: ^ {/ },: /
$ git show HEAD^{/fix nasty bug} # find starting from HEAD
$ git show ':/fix nasty bug' # find starting from any branch
Un due punti (' :
'), seguito da una barra (' /
'), seguito da un testo, assegna un commit il cui messaggio di commit corrisponde all'espressione regolare specificata. Questo nome restituisce il commit di corrispondenza più giovane che è raggiungibile da qualsiasi riferimento . L'espressione regolare può corrispondere a qualsiasi parte del messaggio di commit. Per abbinare i messaggi che iniziano con una stringa, si può usare ad esempio :/^foo
. La sequenza speciale :/!
è riservato ai modificatori per ciò che è abbinato. :/!-foo
esegue una corrispondenza negativa, mentre :/!!foo
corrisponde a un valore letterale! personaggio, seguito da foo
.
Un suffisso ^
a un parametro di revisione, seguito da una coppia di coppie che contiene un testo guidato da una barra, è uguale alla seguente sintassi :/<text>
che restituisce il commit di corrispondenza più recente che è raggiungibile da <rev>
prima ^
.