2010-06-22 15 views
12

Qualcuno potrebbe dirmi come clonare il primo commit? Non voglio cancellare i commit recenti, basta fare una copia clone dello stato iniziale in modo da poter prendere alcuni dei file.Git: come clonare il primo commit?

+0

un repository git può avere più 'primi impegna' – knittl

+8

Ok, ragazzi, non fare una tale puzza sul primo commettere una cosaC'è sempre almeno un commit di root, ed è molto raro che ci sia più di uno, specialmente in un repository di un utente che fa una domanda di base come questa. – Cascabel

risposta

9

Per rispondere alla domanda penso che si intende chiedere:

È possibile ottenere l'intero repository nello stato del primo commit con:

git checkout <commit SHA1> 

Dopo aver finito di fare in giro, è può fare git checkout master per tornare dove eri.

E si può ottenere i singoli file nel loro stato dal primo commit con:

git checkout <commit SHA1> <file or directory> ... 

Anche in questo caso, dopo aver finito, si può fare git checkout master <file or directory> per tornare a dove eravate.

Non è necessario "clonare" un commit (con il quale presumo si intenda clonare il repository e controllare il primo commit?). Naturalmente, se per qualche motivo non si può tollerare di modificare alcun file nel proprio repository (ad es. Non si vuole rendere obsoleto lo storico) si potrebbe ovviamente clonarlo, quindi fare esattamente la stessa cosa nel repository clonato .

-1

Penso che tutto ciò che devi fare è creare un nuovo ramo dal commit originale che desideri, verificarlo e quindi unire di nuovo l'HEAD del ramo su cui stai lavorando.

Se abcxyz ... è la SHA1 del impegnano che si desidera e si sta lavorando nel ramo principale, questo è generalmente quello che ci si vuole fare:

git branch oldskool abcxyz... # creates a new branch called oldskool from the commit 
git checkout oldskool 
#make changes 
git rebase master #bring the oldskool branch up to the HEAD of the master branch (shouldn't overwrite the changes in the files you edited) 
git checkout master 
git merge oldskool 
+0

Stai creando oldskool da un antenato di master, quindi il rebase lo sta solo facendo avanzare rapidamente, e quindi l'unione è un no-op. Nessun cambiamento da padroneggiare. Se salti il ​​rebase, l'unione sarà anche un avanzamento rapido e, di nuovo, nessuna modifica al master. – Cascabel

14

penso che voglio fare la stessa cosa Verifica il commit iniziale e il ramo da lì. Non sono sicuro che la risposta sia accettata. Ma immagino che potrebbe (in parte) completare la domanda originale. Dopo aver letto questa discussione, io invece andrò con un po 'di bash scripting intorno

git log --pretty=oneline master | tail -1 

Credo che speravo ci sarebbe qualche riferimento Commitee o albero-ish per questo.

Pertanto è possibile verifica la prima impegnarsi con il seguente comando:

git checkout `git log --pretty=oneline | tail -1 | sed 's/ .*$//'` 

2017 aggiornamento: dal '12 (GIT 1.8.1), disponiamo di una soluzione migliore: git rev-list. Vedi altre risposte qui o KyleMit at superuser per un modo migliore di scrivere questo script.

+3

Se hai usato 'git rev-list --all' invece di' git log --pretty = oneline master', non dovrai analizzare il messaggio di commit perché restituisce solo sha. Vedi la mia risposta a [Usare git, come tornare al primo commit] (http://superuser.com/a/773366/180163) – KyleMit

11

Se per "primo commit" si intende il commit genitore di un ramo che non ha genitori in sé, quindi si desidera utilizzare l'elenco git-rev per farlo. Basta usare

git rev-list --max-parents=0 HEAD

che otterrà il vostro "Initial commit" per l'attuale capo. Utilizzare il master se si elencano o qualsiasi altra specifica di revisione secondaria. avvolgere che in $(...) al fine di utilizzare tale in un'espressione, come ad esempio:

git checkout $(git rev-list --max-parents=0 HEAD)

+2

Grazie, questa è l'unica risposta che copre il caso generale senza una copia intermedia/incolla passo. –

+0

Grazie per la correzione Jesse! –

Problemi correlati