Sto guardando questo commit che è stato eseguito "26 giorni fa" e il commit padre che è stato eseguito "25 giorni fa". In che modo è possibile eseguire il commit del genitore un giorno dopo il commit del bambino?
Sto guardando questo commit che è stato eseguito "26 giorni fa" e il commit padre che è stato eseguito "25 giorni fa". In che modo è possibile eseguire il commit del genitore un giorno dopo il commit del bambino?
Git distingue tra authoring una modifica (in realtà scrivendo il codice nella modifica) e commit una modifica (aggiungendo la modifica al repository) e tiene traccia sia dell'autore e committer, così come la data di creazione e la data di commit separatamente. Immagina, per esempio, qualcuno che ti manda una patch via email: lei è l'autore, tu sei "solo" il committer.
Quindi, potrebbe essere che GitHub mostri la data di authoring invece della data di commit (dopotutto, questa è l'informazione più interessante se vuoi trovarla da dove proviene il codice sorgente) e che il commit in questione è stato creato da una patch creata prima del commit del commit padre. Git mostra i dati dell'autore per impostazione predefinita (e riempie i valori dei dati di commit se mancanti).
Inoltre, Git ti consente di sovrascrivere la data di commit.
Esempio per entrambi:
git init
msg='a regular commit'
GIT_COMMITTER_DATE=2011-01-01T00:00:00Z git commit --allow-empty -m"$msg"
msg='commit with author date set before the commit but after parent'
GIT_COMMITTER_DATE=2012-01-01T00:00:00Z git commit --date=2011-07-01T00:00:00Z --allow-empty -m"$msg"
msg='commit with author date set before parent'
GIT_COMMITTER_DATE=2013-01-01T00:00:00Z git commit --date=2011-12-01T00:00:00Z --allow-empty -m"$msg"
msg='commit with commit date set before parent'
GIT_COMMITTER_DATE=2012-07-01T00:00:00Z git commit --allow-empty -m"$msg"
git log
# commit deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
# Author: Joe Random Developer <[email protected]>
# Date: Tue Apr 5 10:33:10 2016 +0200
#
# commit with commit date set before parent
#
# commit deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
# Author: Joe Random Developer <[email protected]>
# Date: Thu Dec 1 00:00:00 2011 +0000
#
# commit with author date set before parent
#
# commit deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
# Author: Joe Random Developer <[email protected]>
# Date: Fri Jul 1 00:00:00 2011 +0000
#
# commit with author date set before the commit but after parent
#
# commit deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
# Author: Joe Random Developer <[email protected]>
# Date: Tue Apr 5 10:33:10 2016 +0200
#
# a regular commit
#
La causa più probabile è che lo sviluppatore del secondo commit ha rebagliato il suo ramo dal master prima della fusione.
Ecco una serie di comandi che verranno riprodotti (il comando branch
è un alias che passerà a un ramo esistente o ne creerà uno nuovo, il comando master
passa a quello principale):
1 mkdir /tmp/$$
2 cd /tmp/$$
3 git init
4 touch foo
5 git add foo
6 git commit -m "initial commit" foo
7 branch bar
8 touch bar
9 git add bar
10 git commit -m "add bar"
11 master
12 vi foo
13 git commit -m "first change" foo
14 git log
15 branch bar
16 git rebase master
17 git log
Ed ecco l'output del log:
commit 61f2fe8360ceeee15f97b47204ed3205342d1b10
Author: Keith Gregory <redacted>
Date: Tue Apr 5 06:46:05 2016 -0400
add bar
commit 6240517ac68610b7b4f7cd72f1a0508b20d2c220
Author: Keith Gregory <redacted>
Date: Tue Apr 5 06:46:46 2016 -0400
first change
commit ae094204b813ae217fd74a640634c7e82ecb4732
Author: Keith Gregory <redacted>
Date: Tue Apr 5 06:45:51 2016 -0400
initial commit
Se usi il comando cat-file
, puoi vedere che il commit 62 è effettivamente il genitore di 61:
> git cat-file -p 61f2fe8360ceeee15f97b47204ed3205342d1b10
tree b8300b3b463ee72eb18f78d6602e0274087597d1
parent 6240517ac68610b7b4f7cd72f1a0508b20d2c220
author Keith Gregory <[email protected]> 1459853165 -0400
committer Keith Gregory <[email protected]> 1459853233 -0400
È inoltre del tutto possibile che gli orologi sulle workstation dei due sviluppatori non fossero sincronizzati. Github non tocca affatto i commit, quindi userà qualsiasi tempo specificato dal committer nel loro commit.