Git clone versión particular de repositorio remoto


181

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

¿Cómo hago esto?



Respuestas:


242

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

Use git-reset para eso:

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

27
No lo mencionó, pero esto solo restablecerá la masterrama, que está desprotegida por defecto en un clon. Si una rama que no mastersea ​​su rama de desarrollo principal debe verificarse antesgit reset
Steve Folly

16
¿por qué no harías un simple pago del commit deseado?
nemoo

10
Porque estará en el estado "HEAD separado" después de pagar a un commit particular.
Rui Carneiro

66
@RuiCarneiro sería mejor usarlo git checkout -b new_branch hashpara crear una nueva rama basada en el hash sin tocar ninguna otra rama. Mover la cabeza de una sucursal existente puede causar problemas cuando es hora de enviar algo a un servidor remoto.
Loïc Faure-Lacroix

1
@YuriGhensev Si el commit ya fue enviado a una rama remota, puede hacer lo git pull origin [branch]contrario, afaik, se pierde.
Rui Carneiro

94

Puedes usar simplemente

git checkout  commithash

en esta secuencia

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

commit hash se parece a esto "45ef55ac20ce2389c9180658fdba35f4a663d204"


9
Me gusta esta respuesta la mejor. Creo que se git reset --harddebe evitar a favor de a git checkout commit-hash. A git reset --hardelimina parte del historial de git que a veces no es deseable.
Jordan Stewart

8
git initno es necesario
Lautaro Paskevicius

37

Use git logpara encontrar la revisión a la que desea revertir y tome nota del hash de confirmación. Después de eso, tienes 2 opciones:

  1. Si planea confirmar algo después de esa revisión, le recomiendo que realice el pago en una nueva sucursal:git checkout -b <new_branch_name> <hash>

  2. Si no planea comprometer nada después de esa revisión, simplemente puede pagar sin una rama: 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 usted ' tendrá un poco de trabajo extra para fusionar nuevos commits a una rama real .

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 esta forma, no pierde ninguna información, por lo que puede pasar a una nueva revisión cuando se estabilice.


2
Pero tampoco es que esté en una cabeza separada, lo cual está bien para operaciones de solo lectura. Pero cuando tiene la intención de realizar cambios a partir de esta revisión, debe crear una nueva rama. Consulte sitaramc.github.com/concepts/detached-head.html para obtener más información.
Rudi

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

Para volver al "estado de trabajo", puede git checkout developdesarrollar el nombre de su sucursal.
Steve Tauber

1
@SteveTauber, suponiendo que tenga una rama diferente que esté funcionando , cambiar a esa rama es suficiente.
jweyrich

19

Si esa versión que necesita obtener es una rama o una etiqueta, entonces:

git clone -b branch_or_tag_name repo_address_or_path

2

A diferencia de los sistemas de control de versiones centralizados, Git clona todo el repositorio, por lo que no solo obtiene los archivos remotos actuales, sino todo el historial. Su repositorio local incluirá todo esto.

Puede haber etiquetas para marcar una versión en particular en ese momento. Si no, puede crearlos usted mismo localmente. Una buena manera de hacer esto es usar git logo quizás más visualmente con herramientas como gitk(quizás gitk --allpara ver todas las ramas y etiquetas). Si puede detectar los hash de confirmación 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_nameo directamente con el hash en lugar del nombre de la etiqueta).


1

Puedes resolverlo así:

git reset --hard sha

dónde sha por ejemplo:85a108ec5d8443626c690a84bc7901195d19c446

Puede obtener el sha deseado con el comando:

git log

1

uploadpack.allowReachableSHA1InWant

Desde Git 2.5.0, esta variable de configuración se puede habilitar en el servidor, aquí la solicitud de función de GitHub y el compromiso de GitHub habilitan esta función .

Bitbucket Server lo habilitó desde la versión 5.5+ .

Uso:

# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
    touch "$i"
    git add "$i"
    git commit -m "$i"
done

# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"

# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"

# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true

# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"

0

El árbol fuente que necesita todavía está disponible en el repositorio de git, sin embargo, necesitará el SHA1 del commit que le interesa. Supongo que puede obtener el SHA1 del clon actual que tiene.

Si puede obtener ese SHA1, puede crear una rama / restablecer allí para tener el repositorio idéntico.

Comandos según la respuesta de Rui


0

Probablemente git resetresuelva tu problema.

git reset --hard -#commit hash-
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.