Foros del Web » Programando para Internet » GIT »

[SOLUCIONADO] Git y moverse por los commit

Estas en el tema de Git y moverse por los commit en el foro de GIT en Foros del Web. Tengo un proyecto, con el que uso el control de versiones git, lo que no consigo hacer es moverme por los distintos commits. Por ejemplo, ...
  #1 (permalink)  
Antiguo 18/09/2013, 16:20
 
Fecha de Ingreso: febrero-2006
Mensajes: 43
Antigüedad: 18 años, 2 meses
Puntos: 1
Git y moverse por los commit

Tengo un proyecto, con el que uso el control de versiones git, lo que no consigo hacer es moverme por los distintos commits. Por ejemplo, tengo 3 commits:

commit1
commit2
commit3

El último es el 3 y yo quiero volver a la versión del commit1 pero sin borrar los posteriores, quiero volver a los archivos del commit1 pero poder restaurar después el commit3. Si uso el comando git checkout :/"commit1" vuelvo a los archivos del primer commit pero me borra los recientes. ¿Cual es el comando para moverme por los commits?

Un saludo y gracias.
  #2 (permalink)  
Antiguo 19/09/2013, 03:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Git y moverse por los commit

La instrucción correcta es checkout, así:
Cita:
git checkout <SHA1>
Es decir, si tengo el hash de un commit af78e6a solo hay que especificarlo sin más:
Cita:
git checkout af78e6a
Lo que si no puedes evitar es que te borre archivos o así, debes entender que al cambiar a un punto atrás en el historial del proyecto es evidente que los archivos mas recientes no estarán presentes.

Vamos, que Git no los borra por que se le da la gana, solo trata de volver a un estado anterior de tu repositorio, y en dicho estado no existían aún dichos cambios más recientes.

Si lo que quieres hacer es, como dices, integrar los cambios del último commit pero volviendo al primero entonces debes hacer cherry-pick después de haber hecho el checkout, con reflog puedes seguir navegando por el historial para verificar y obtener los respectivos hashes.

Algo así:
Cita:
git checkout c3
git checkout -b c3_backup
git reset --hard c1
git cherry-pick c3
Que sería básicamente: crear sobre una copia del commit3, resetear el repositorio hasta el commit1, integrar los cambios de commit3 en la copia del commit1.

Ya después de eso, y si todo sale bien entonces ya puedes integrar el branch como gustes.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 19/09/2013, 07:22
 
Fecha de Ingreso: febrero-2006
Mensajes: 43
Antigüedad: 18 años, 2 meses
Puntos: 1
Respuesta: Git y moverse por los commit

Hola, muchas gracias por responder, pero creo que no me has entendido muy bien. No es que me borre los archivos, lo que me borra son los commits posteriores (evidentemente al volver a un commit anterior desaparecerán algunos archivos), por ejemplo.:
Tengo un proyecto con 3 commints:
c1
c2
c3

Siendo c3 el más reciente, pero yo lo que quiero es poder restaurar el c1 sin perder los commits posteriores, para que cuando quiera poder volver a uno más reciente, por ejemplo c3.

Como explico, ahora uso:
git checkout :/"c1" y me restaura el commit c1 sin problemas, pero al hacer esto pierdo los commits posteriores, al hacer git log ya no me aparecen c2 y c3.

Pues mi duda básicamente es esa, ¿cómo puedo volver a un commit c1, para por ejemplo consultar lo que tenía hecho y después volver a c3? Todo esto sin crear ramas, sólo haciendo commits.

Un saludo y gracias.
  #4 (permalink)  
Antiguo 19/09/2013, 07:33
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Git y moverse por los commit

Si entendí, efectivamente si vuelves a un commit anterior y haces git log, verás que los commits posteriores desaparecen, en eso estamos bien.

Pero eso es normal, para eso está el comando git reflog, para que inspecciones todos los commits sin importar dónde estés.

Además si deseas ver tus cambios previos ni siquiera hacer falta hacer checkout, con utilizar git show lo puedes conseguir, además si utilizas algún programa gráfico para revisar tu código (recomendado) también puedes navegar por todos los cambios, archivos, historial, etc. sin tener que hacer checkout.

PDTA: ya que estamos aprendiendo, ¿puedes explicar la sintaxis que usas en tu checkout?

Es decir, me gustaría ver un ejemplo real de cómo utilizas la instrucción checkout aquí:
Cita:
git checkout :/"c1"
La parte del :/ y las comillas no las entiendo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 19/09/2013 a las 07:39 Razón: PDTA
  #5 (permalink)  
Antiguo 19/09/2013, 08:15
 
Fecha de Ingreso: febrero-2006
Mensajes: 43
Antigüedad: 18 años, 2 meses
Puntos: 1
Respuesta: Git y moverse por los commit

Muchas gracias por responder, ¿Me podrías decir la sintaxis de git reflog?
pruebo con:
git reflog :/"commit2"
o
git reflog 96046152e2515d651d777bac66602e4a50654f49

no me da ningún error pero no me restaura el commit, ya que los archivos tienen el mismo contenido que en el último commit

Lo de git checkout :/"commit1", lo encontré con internet porque poniendo el nombre o el hash me daba un error, a continuación pongo lo que obtengo:

1) Hago git log:
Código PHP:
commit eb9b03c2e22305c965b610aa84a7d316e5cb208d
Author
oscar <oscar@oscar.(none)>
Date:   Thu Sep 19 16:05:51 2013 +0200

    commit3

commit 96046152e2515d651d777bac66602e4a50654f49
Author
oscar <oscar@oscar.(none)>
Date:   Thu Sep 19 00:13:37 2013 +0200

    commit2

commit 23abd7d49c00541fcac17acb1babd7a60a3e7c6e
Author
oscar <oscar@oscar.(none)>
Date:   Wed Sep 18 23:53:25 2013 +0200

    commit1 
Si hago un checkout con el nombre de la siguiente forma:
git checkout "commit2"
obtengo:
error: pathspec 'commit2' did not match any file(s) known to git.


PD: acabo de probar el checkout con el head y me funciona, no sé que demonios hice la primera vez que lo intenté jeje.

Última edición por oskrok; 19/09/2013 a las 08:31
  #6 (permalink)  
Antiguo 19/09/2013, 08:47
 
Fecha de Ingreso: febrero-2006
Mensajes: 43
Antigüedad: 18 años, 2 meses
Puntos: 1
Respuesta: Git y moverse por los commit

Según este tutorial:
http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/es/ch02.html
En el apartado "Deshacer/Rehacer Avanzado", se puede leer:
Algunas veces solo quieres ir hacia atrás y olvidarte de todos los cambios a partir de cierto punto, porque estaban todos mal. Entonces:

$ git log

te muestra una lista de commits recientes, y sus hashes SHA1. A continuación, escribe:

$ git reset --hard SHA1_HASH

para recuperar el estado de un commit dado, y borrar para siempre cualquier recuerdo de commits más nuevos.

Otras veces, quieres saltar a un estado anterior temporalmente. En ese caso escribe:

$ git checkout SHA1_HASH

Esto te lleva atrás en el tiempo, sin tocar los commits más nuevos.

Pero a mi el git checkout SHA1_HASH me elimina todos los commits posteriores
  #7 (permalink)  
Antiguo 19/09/2013, 10:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Git y moverse por los commit

Sigues confundiéndote, tus commits no desaparecen, sólo no son accesibles desde un punto de revisión anterior, sólo posterior.

Pero si haces git reflog (sin argumentos) verás cada uno de los commits y acciones hechas en el repositorio, de ahí es que debes tomar el SHA1_HASH cuando te mueves entre commits.

El escenario es muy simple, ya te lo he explicado en mis comentarios anteriores.

A propósito del formato "especial" que utilizas para hacer checkout te aconsejo dejar de hacerlo así, debes acostumbrarte a usar el SHA1_HASH siempre, por consistencia.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 19/09/2013, 10:54
 
Fecha de Ingreso: febrero-2006
Mensajes: 43
Antigüedad: 18 años, 2 meses
Puntos: 1
Respuesta: Git y moverse por los commit

Si, muchas gracias ahora lo he entendido todo.
Con git checkout SHA1_HASH, cambio de commit y si voy a un commit posterior lógicamente al hacer un git log no me aparecen los posteriores porque aún no existían.
Al hacer el reflog, salen todos lo movimientos, copio el hash del útimo commit y listo.

Muchas gracias por aclararme la duda!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:21.