Pregunta

Siempre he pensado de git reset y git checkout como el mismo, en el sentido de que ambos traen la parte posterior proyecto a un determinado comprometerse. Sin embargo, creo que no puede ser exactamente el mismo, ya que sería redundante. ¿Cuál es la diferencia real entre los dos? Estoy un poco confundido, como el SVN solamente tiene svn co revertir la confirmación.

AÑADIDO

VonC y Charles explican las diferencias entre git reset y git checkout muy bien. Mi comprensión actual es que revierte git reset todos los cambios de nuevo a una específica comprometerse, mientras que git checkout más o menos se prepara para una rama. He encontrado los siguientes dos diagramas bastante útil en llegar a este entendimiento:

http://a.imageshack.us/img651/1559/86421927.png http://a.imageshack.us/img801/1986/resetr.png

AÑADIDO 3

Desde http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase .html , checkout y reset pueden emular el rebase.

 introducir descripción de la imagen aquí

git checkout bar 
git reset --hard newbar 
git branch -d newbar 

 introducir descripción de la imagen aquí

¿Fue útil?

Solución

Por comparación, ya que SVN no tiene ningún índice, solamente un árbol de trabajo, svn checkout copiará una revisión dada en un directorio independiente.
Cuanto más cerca equivalente para git checkout haría:

  • svn update (si usted está en la misma rama, es decir, la misma URL SVN)
  • svn switch (si realice el pago, por ejemplo, la misma rama, pero desde otro SVN repo URL)

Todas esas tres modificaciones árbol de trabajo (svn checkout, update, switch) tienen sólo un comando en git:. git checkout
Pero desde Git tiene también la noción de índice (que "área de ensayo" entre el repositorio y el árbol de trabajo), también tiene git reset.


Thinkeye menciona en los comentarios el artículo " Restablecer Desmitificar ".

  

Por ejemplo, si tenemos dos ramas, 'master' y 'develop' apuntando a diferentes confirmaciones, y estamos actualmente en 'develop' (por lo que los puntos de la cabeza a ella) y corremos git reset master, 'develop' ya no tendrá ahora a punto de cometer el mismo que 'master' hace.

     

Por otro lado, si en lugar de correr git checkout master, 'develop' no se moverá, HEAD sí lo hará. HEAD ahora apuntará a 'master'.

     

Por lo tanto, en ambos casos estamos HEAD a punto móvil para cometer A, sino cómo lo hacemos es muy diferente. reset va a mover los puntos HEAD rama, de caja se mueve a sí mismo HEAD punto a otro rama.

http://git-scm.com/images/reset/reset-checkout.png

En esos puntos, sin embargo:

Larsh añade en los comentarios :?

  

El primer párrafo de esta respuesta, sin embargo, es engañosa: "git checkout ... actualizará la cabeza solamente si obtiene una rama (si no, se termina con una cabeza separada)"
  No es cierto: git checkout actualizará la cabeza, incluso si obtiene una confirmación de que no es una rama (y sí, se termina con una cabeza separada, pero aún así nos actualizada).

git checkout a839e8f updates HEAD to point to commit a839e8f.

De Novo concurre en los comentarios :?

  

@LarsH es correcta.
  La segunda bala tiene una idea equivocada acerca de lo central está en actualizará la cabeza solamente si obtiene una rama.
  CABEZA va donde quiera que esté, como una sombra.
  El registro de salida algunos ref no rama (por ejemplo, una etiqueta), o una cometer directamente, se moverá HEAD. cabeza separada no significa que haya desprendido de la cabeza, esto significa que la cabeza se separa de una rama de referencia, que se puede ver en, por ejemplo, git log --pretty=format:"%d" -1.

     
      
  • Estados cabeza unida comenzarán con (HEAD ->,
  •   
  • unifamiliar seguirá mostrando (HEAD, pero no tendrá una flecha a una rama ref.
  •   

Otros consejos

En su forma más simple, reset restablece el índice sin tocar el árbol de trabajo, mientras que checkout cambia el árbol de trabajo sin tocar el índice.

Restablece el índice de coincidencia HEAD, árbol de trabajo queda solo:

git reset

Conceptualmente, este da de baja el índice en el árbol de trabajo. Para conseguir que realmente hacen todo lo que tendría que utilizar -f para forzarlo a sobrescribir cualquier cambio local. Esta es una característica de seguridad para asegurarse de que la forma "ningún argumento" no es destructiva:

git checkout

Una vez que comience a agregar parámetros bien es cierto que existe un cierto solapamiento.

checkout se utiliza generalmente con una, etiqueta de la rama o cometió. En este caso se restablecerá HEAD y el índice a lo dado comprometerse, así como la realización de la caja del índice en el directorio de trabajo.

Además, si se suministra a --hard reset se puede pedir reset para sobrescribir el árbol de trabajo, así como restablecer el índice.

Si la corriente tiene una rama desprotegido que hay una diferente crucial entre reset y checkout al proporcionar una rama alternativa o de comprometerse. reset cambiará la rama actual a punto en el seleccionado cometer mientras que checkout dejará la rama actual solos, pero la caja de la rama suministrado o comprometer su lugar.

Otras formas de reset y commit implican el suministro de caminos.

Si proporciona caminos para reset no se puede suministrar --hard y reset sólo cambiará la versión índice de los caminos que se incluyen para la versión suministrada en el commit (o HEAD si no se especifica un commit).

Si proporciona caminos para checkout, como reset se actualizará la versión índice de los caminos que se incluyen para que coincida con la suministrada comprometerse (o HEAD) pero siempre será la comprobación de la versión índice de los caminos suministrado en el directorio de trabajo.

Un caso de uso sencillo cuando se restituyan cambio:
1. Uso de reposición si quieres deshacer puesta en escena de un archivo modificado.
2. Uso salida si desea ignorar cambios a unstaged archivo / s.

Atlassian nos dan una excelente explicación acerca de git reset , git Pedido y así, git revert . En este artículo, se explica los diferentes usos de estos comandos en un diferentes niveles - archivo, puesta en escena instantánea y comprometerse

.

https://www.atlassian.com/git/ tutoriales / restablecer-check out-and-revirtiendo

La diferencia clave en pocas palabras es que reset mueve la corriente de referencia rama , mientras que checkout no lo hace (se mueve HEAD).

Como el libro Pro Git explica bajo Restablecer Desmitificar ,

  

Lo primero que va a hacer es reset mover lo CABEZA puntos a . Esto no es   el mismo que cambiar propio cabezal (que es lo que hace checkout); reset    mueve la rama que está apuntando a CABEZA. Esto significa que si cabezal está ajustada   a la rama master (es decir, que está actualmente en la rama master),   corriendo git reset 9e5e6a4 se iniciará al hacer punto a master   9e5e6a4. [Énfasis añadido]

Vea también la respuesta de VonC para una texto muy útil y el diagrama extracto del mismo artículo, que no voy a duplicar aquí.

Por supuesto, hay muchos más detalles sobre qué efectos checkout y reset pueden tener en el índice y el árbol de trabajo, dependiendo de lo que se utilizan parámetros. No puede haber un montón de similitudes y diferencias entre los dos comandos. Pero como yo lo veo, la diferencia más crucial es si se mueven de la punta de la rama actual.

Los dos comandos (RESET y registro de salida) son completamente diferentes.

checkout X NO ES reset --hard X

Si X es un nombre de la sucursal, checkout X cambiará la rama actual mientras reset --hard X no lo hará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top