2010-08-24 31 views
123

He clonado un repositorio remoto de git hace un mes. El repositorio remoto ha sufrido muchos cambios y ahora se ha vuelto inestable. Ahora necesito otra copia del repositorio, una versión idéntica a la que cloné hace un mes.Git clone versión particular del repositorio remoto

¿Cómo puedo hacer esto?

+0

duplicado Posible de http://stackoverflow.com/questions/3489173/how-to-clone-git-repository-with-specific-revision-changeset –

Respuesta

174

Puede "restablecer" su repositorio a cualquier confirmación que desee (por ejemplo, hace 1 mes).

Uso git-reset para ello:

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

Usted no lo mencionó, pero esto sólo reinicie la rama 'master', que está desprotegida por defecto en un clon. Si una rama que no sea 'master' es la rama de desarrollo principal que debe ser revisada primero antes de' git reset' –

+0

@Steve true! +1 –

+10

¿por qué no harías un pago simple de la confirmación deseada? – nemoo

28

Uso git log para encontrar la revisión que desea revertir a, y tomar nota de cometer el hash. Después de eso, usted tiene 2 opciones:

  1. Si va a cometer nada después de esa revisión, yo recomendaría usted a la comprobación de una nueva rama: git checkout -b <new_branch_name> <hash>

  2. Si no lo hace plan para comprometer algo después de esa revisión, simplemente puede pagar sin una sucursal: git checkout <hash> - NOTA: Esto colocará su repositorio en un estado 'HEAD separado', lo que significa que actualmente no está conectado a ninguna rama - entonces you'll have some extra work to merge new commits to an actual branch.

Ejemplo:

$ 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. 

De esa manera no se pierde ninguna información, así que puede pasar a una nueva revisión cuando se vuelve estable.

+2

Pero también nothe que está en un cabezal separado, lo cual está bien para operaciones de solo lectura. Pero cuando pretenda realizar cambios a partir de esta revisión, debe crear una nueva. Consulte http://sitaramc.github.com/concepts/detached-head.html para obtener más información. – Rudi

+0

@Rudi: Gracias. Fue solo un ejemplo para mostrar el uso. Actualizado para mencionarlo. – jweyrich

+0

Para volver al "estado de trabajo" puede simplemente 'git checkout develop' donde develop es el nombre de su sucursal. –

0

El árbol fuente que está solicitando está todavía disponible en el repositorio de git, sin embargo, necesitará el SHA1 de la confirmación que le interese. ¿Asumiría que puede obtener el SHA1 del clon actual que tiene?

Si puede obtener esa SHA1, puede crear una bifurcación/restablecer allí para tener el repositorio idéntico.

comandos como por la respuesta de Rui

2

diferencia de los sistemas de control de versiones centralizados, los clones Git todo el repositorio, por lo que no sólo obtener los archivos remotos actuales, sino toda la historia. Tu repositorio local incluirá todo esto.

Puede haber sido etiquetas para marcar una versión particular en ese momento. Si no, puede crearlos usted mismo localmente. Una buena forma de hacerlo es usar git log o quizás más visualmente con herramientas como gitk (quizás gitk --all para ver todas las ramas y etiquetas). Si puede detectar los valores hash de confirmaciones que se usaron en ese momento, puede etiquetarlos usando git tag <hash> y luego verificarlos en nuevas copias de trabajo (por ejemplo, git checkout -b new_branch_name tag_name o directamente con el hash en lugar del nombre de la etiqueta).

-1

Cuando estoy en busca de una confirmación por un autor determinado (por ejemplo yo) puedo filtrar el registro con

git log --author=[authorname] 
+3

Esto no responde a la pregunta –

48

usted puede utilizar simplemente

git checkout commithash 

en esta secuencia

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

commit hash se parece a esto "45ef55ac20ce2389c9180658fdba35f4a663d204"

+3

Me gusta esta respuesta la mejor. Creo que se debe evitar un '' git reset --hard', a favor de 'git checkout commit-hash'. Un 'git reset --hard' elimina parte del historial de git que a veces no es deseable. –

0

Probablemente git reset resuelva su problema.

git reset --hard -#commit hash- 
Cuestiones relacionadas