¿Cómo volver a la versión más reciente en Git?

303

Recientemente me mudé de SVN a Git y estoy un poco confundido acerca de algo. Necesitaba ejecutar la versión anterior de un script a través de un depurador, así que hice git checkout <previous version hash>e hice lo que tenía que hacer.

Ahora quiero volver a la versión más nueva, pero no sé el hash para ello. Cuando escribo git log, no lo veo.

¿Cómo puedo hacer esto? Además, ¿hay una manera más fácil de cambiar las versiones que escribiendo hashes, algo así como "retroceder dos versiones" o "ir a la cronológicamente más reciente"?

Nathan Long
fuente

Respuestas:

371

git checkout masterdebería hacer el truco. Para retroceder dos versiones, podría decir algo como git checkout HEAD~2, pero mejor crear una rama temporal basada en ese tiempo, entoncesgit checkout -b temp_branch HEAD~2

Ana Betts
fuente
77
¡Frio! git checkout masteres exactamente como cambio de una rama. Entonces, ¿eso significa que cuando reviso una versión anterior, esencialmente estoy creando una rama?
Nathan Long el
44
@Nathan: En git, una rama es en su mayoría un puntero móvil a una determinada revisión. Conceptualmente, estás creando una rama, pero no en el sentido en que git piensa en ramas.
DLH
2
Entonces, en el caso más simple, donde tengo un montón de cambios lineales, cuando reviso una revisión anterior, muevo el puntero HEAD allí, ¿qué significa que git logse mostrará en relación con ese punto? ¿Y cuando pago el master, muevo el puntero a la última versión de la rama master?
Nathan Long el
77
@Nathan: Exactamente. HEAD es algo llamado referencia simbólica: en general, es un puntero a otra referencia (la rama actualmente desprotegida). git checkoutes una forma de mover la CABEZA. Cuando separó HEAD, lo hizo apuntar directamente a ese commit dado; cuando revisa master nuevamente, señala de nuevo a master. (Y muchos comandos como git logrealmente toman un rango de revisión, que por defecto es HEAD.)
Cascabel
3
Sí, HEAD es el "pronombre" usado para referirse a "La versión del código que está en el directorio de trabajo". También es el pronombre para "El padre de lo que sea que cometas después"
Ana Betts
54

Cuando finaliza la compra en una confirmación específica, git crea una rama separada. Entonces, si llamas:

$ git branch 

Verás algo como:

* (detached from 3i4j25)
  master
  other_branch

Para volver al jefe de la sucursal maestra, solo necesita volver a pagar a su sucursal maestra:

$ git checkout master

Este comando eliminará automáticamente la rama separada.

Si git checkoutno funciona, es probable que haya modificado archivos en conflicto entre ramas. Para evitar que pierdas el código, git requiere que manejes estos archivos. Tienes tres opciones:

  1. Guarde sus modificaciones (puede reventarlas más tarde):

    $ git stash
    
  2. Descarte los cambios que restablecen la rama separada:

    $ git reset --hard
    
  3. Cree una nueva rama con las modificaciones anteriores y comprométalas:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

Después de esto , puede volver a su rama maestra (versión más reciente):

$ git checkout master
Thomio
fuente
36

Esto me sirvió (todavía estaba en la rama maestra):

git reset --hard origin/master
averasko
fuente
34
reset --hard es una exageración y demuestra que no está al tanto de las modificaciones que realizó. Esto puede hacer que pierda código.
Thomio
1
En mi caso, quería deshacerme de los cambios accidentalmente cometidos y no apresurados. Sé que puede haber otros métodos para lograrlo. Estoy de acuerdo si no desea perder sus cambios comprometidos no apresurados, esto es pérdida de datos.
Csaba Toth
8

Para volver a la última versión:

git checkout <branch-name> 

Por ejemplo, git checkout masterogit checkout dev

Reggie Pinkham
fuente
7

Puede consultar el uso de nombres de sucursales, por un lado.

Sé que hay varias formas de mover la CABEZA, pero dejaré que un experto en git las enumere.

Solo quería sugerir gitk --all: lo encontré enormemente útil cuando comencé con git.

Arrendajo
fuente
7

Estoy empezando a profundizar en Git, así que no sé si he entendido bien, pero creo que la respuesta correcta a la pregunta de la OP es que puede funcionar git log --allcon una especificación de formato de la siguiente manera: git log --all --pretty=format:'%h: %s %d'. Esto marca la versión actual retirada (HEAD)y puedes simplemente tomar la siguiente de la lista.

Por cierto, agregue un alias como este .gitconfigcon un formato un poco mejor y puede ejecutar git hist --all:

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

Con respecto a las versiones relativas, encontré esta publicación , pero solo habla de versiones anteriores, probablemente no haya nada para referirse a las versiones más nuevas.

haridsv
fuente
6

Algunas de las respuestas aquí suponen que está en la rama maestra antes de decidir pagar una confirmación anterior. Este no es siempre el caso.

git checkout -

Te volverá a señalar la rama en la que estabas anteriormente (independientemente de si era maestra o no).

Itai Noam
fuente
No es necesaria una rama, apuntará CABEZA a donde apuntaba antes; si lo hiciste git checkout hash2después git checkout hash1, git checkout -te llevará de vuelta a hash1.
Mikhail Vasin
3

Cuando vuelves a una versión anterior,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

Puede ver su registro de características (hash) con este comando incluso en esta situación;

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master se puede reemplazar con otro nombre de sucursal.

Luego, pruébelo, podrá volver a la función.

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34
kujiy
fuente
1

Con Git 2.23+ (agosto de 2019), la mejor práctica sería usar en git switchlugar de lo confusogit checkout comando .

Para crear una nueva sucursal basada en una versión anterior:

git switch -c temp_branch HEAD~2

Para volver a la rama maestra actual:

git switch master
VonC
fuente
0

Una solución más elegante y simple es usar

git stash

Volverá a la versión local más reenviada de la rama y también guardará sus cambios en el alijo, así que si desea deshacer esta acción, haga lo siguiente:

git stash apply
Ilya Gazman
fuente
Sé que es muy antiguo, pero tengo que hacer un comentario al respecto (ya que creo que esta solución no debería usarse). No usaría esta solución porque no resuelve este problema sino un problema diferente. con esta solución oculta cada vez que desea pagar en una confirmación anterior, en realidad "guarda" datos que son muy innecesarios para este caso. La forma correcta y más elegante es (como se dijo antes) simplemente pagar <branch>.
Maayao