2010-08-24 12 views
123

Ho clonato un repository git remoto circa un mese fa. Il repository remoto ha subito molte modifiche e ora è diventato instabile. Ora ho bisogno di un'altra copia del repository, versione identica a quella che ho clonato un mese fa.Git clone versione particolare del repository remoto

Come posso fare?

+0

Eventuali duplicati di http://stackoverflow.com/questions/3489173/how-to-clone-git-repository-with-specific-revision-changeset –

risposta

174

È possibile "reimpostare" il repository su qualsiasi commit desiderato (ad esempio, 1 mese fa).

Usa git-reset per questo:

git clone [remote_address_here] my_repo 
cd my_repo 
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT] 
+21

Lei non ne ha parlato, ma questo solo la volontà resettare il ramo 'master', che è selezionato per default su un clone. Se un ramo diverso da 'master' è il ramo di sviluppo principale che deve essere estratto prima di' git reset' –

+0

@Steve true! +1 –

+10

perché non dovresti fare un semplice checkout del commit voluto? – nemoo

28

Usa git log per trovare la revisione che si desidera eseguire il rollback a, e prendere nota del hash commit. Dopo di che, si hanno 2 opzioni:

  1. Se avete intenzione di commettere nulla dopo che la revisione, ho raccomandare voi alla verifica a un nuovo ramo: git checkout -b <new_branch_name> <hash>

  2. Se non lo fai pianifica di eseguire il commit di qualsiasi cosa dopo tale revisione, puoi semplicemente effettuare il checkout senza una filiale: git checkout <hash> - NOTA: Questo metterà il tuo repository in uno stato 'HEAD distaccato', che significa che attualmente non è collegato a nessun ramo, quindi you'll have some extra work to merge new commits to an actual branch.

Esempio:

$ git log 
commit 89915b4cc0810a9c9e67b3706a2850c58120cf75 
Author: Jardel Weyrich <suppressed> 
Date: Wed Aug 18 20:15:01 2010 -0300 

    Added a custom extension. 

commit 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7 
Author: Jardel Weyrich <suppressed> 
Date: Wed Aug 18 20:13:48 2010 -0300 

    Missing constness. 

$ git checkout 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7 
Note: moving to '4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7' 
which isn't a local branch 
If you want to create a new branch from this checkout, you may do so 
(now or later) by using -b with the checkout command again. Example: 
    git checkout -b <new_branch_name> 
HEAD is now at 4553c14... Missing constness. 

In questo modo non si perde qualsiasi informazione, quindi si può passare ad una revisione più recente quando diventa stabile.

+2

Ma non si tratta di una testina staccata, che è OK per le operazioni di sola lettura. Ma quando intendi apportare modifiche a partire da questa revisione, devi creare un nuovo ramo. Vedi http://sitaramc.github.com/concepts/detached-head.html per ulteriori informazioni. – Rudi

+0

@Rudi: Grazie. Era solo un esempio per mostrare l'utilizzo. Aggiornato per menzionarlo. – jweyrich

+0

Per tornare a "stato di lavoro" puoi semplicemente "git checkout develop" dove sviluppare è il nome del tuo ramo. –

0

L'albero dei sorgenti che stai richiedendo è ancora disponibile nel repository git, tuttavia, avrai bisogno dello SHA1 del commit che ti interessa. Suppongo che tu possa ottenere lo SHA1 dal clone attuale che hai?

Se è possibile ottenere tale SHA1, è possibile creare un ramo/reimpostare lì per avere il repository identico.

comandi come per la risposta di Rui

2

A differenza dei sistemi di controllo di versione centralizzati, Git cloni l'intero repository, in modo da non ottenere solo i file remoti in corso, ma tutta la storia. Il tuo repository locale includerà tutto questo.

Potrebbero esserci state etichette per contrassegnare una versione particolare al momento. In caso contrario, è possibile crearli localmente. Un buon modo per farlo è usare git log o forse più visivamente con strumenti come gitk (forse gitk --all per vedere tutti i rami e tag). Se è possibile individuare gli hash di commit che sono stati utilizzati al momento, è possibile taggarli utilizzando git tag <hash> e quindi controllare quelli in nuove copie di lavoro (ad esempio git checkout -b new_branch_name tag_name o direttamente con l'hash anziché il nome del tag).

-1

Quando sto cercando un commit da un certo autore (per esempio me) a filtrare il registro con

git log --author=[authorname] 
+3

Questo non risponde alla domanda –

48

è possibile utilizzare semplicemente

git checkout commithash 

in questa sequenza

git init  
git clone `URLTORepository` 
cd `into your cloned folder` 
git checkout commithash 

hash di commit simile a questo "45ef55ac20ce2389c9180658fdba35f4a663d204"

+3

Mi piace questa risposta la migliore. Penso che un 'git reset --hard' dovrebbe essere evitato, a favore di' git checkout commit-hash'. Un 'git reset --hard' rimuove parte della cronologia git che a volte non è desiderabile. –

0

Probabilmente git reset risolve il problema.

git reset --hard -#commit hash- 
Problemi correlati