¿Verificando un compromiso antiguo y manteniendo la cabeza en la twig principal?

Actualmente, para cambiar a otra confirmación de git (en la misma twig … en realidad, en la twig principal), estoy ejecutando el command

git checkout ea3d5ed039edd6d4a07cc41bd09eb58edd1f2b3a 

Ahora, cada vez que hago esto, git me dice que ahora tengo una cabeza desprendida. ¿Cómo voy a una confirmación más antigua y sigo manteniendo la cabeza en la misma twig?

La mayoría de las veces cuando hago esto pago en una twig temporal:

 git checkout -b temp-branch-name ea3d5ed039edd6d4a07cc41bd09eb58edd1f2b3a 

Luego, cuando termine, simplemente elimino la twig

Depende de lo que quieras hacer cuando realices la compra. Si todo lo que hace es verificarlo para que pueda build o probar esa revisión, entonces no hay nada de malo en trabajar con una cabeza separada. Solo recuerde consultar una twig real antes de realizar confirmaciones ( git checkout master , por ejemplo), para que no cree confirmaciones que no estén incluidas en ninguna twig.

Sin embargo, si desea realizar más commits a partir de ese punto, debe crear una twig. Si realiza commits que no están referencedos por una twig, pueden perderse fácilmente, y eventualmente serán eliminados por el recolector de basura de git, ya que nada se refiere a ellos. Puede crear una nueva sucursal ejecutando:

 git checkout -b newbranch ea3d5ed 

Para ayudar a visualizar, aquí hay algunos diagtwigs que demuestran cómo trabajar en una cabeza separada difiere de trabajar en una twig.

Comencemos con 3 commits en master , A, B y C. master es la twig actual, por lo que HEAD apunta a master , lo que apunta a confirmar C.

 A B C
 * - * - * <- master <- HEAD

Ahora si confirmamos, git creará una confirmación que tiene C como padre (porque esa es la confirmación actual, apuntada desde HEAD través del master ), y actualizará el master para apuntar a esa nueva confirmación. Todos nuestros commits ahora están en master , y HEAD apunta al nuevo commit a través de master .

 A B C D
 * - * - * - * <- master <- HEAD

Ahora veamos B, dándonos un HEAD separado.

 A B C D
 * - * - * - * <- maestro
    ^
     \ - CABEZA

Todo funciona bien aquí; podemos ver todos los files, build nuestro progtwig, probarlo, etc. Incluso podemos crear nuevos commits; pero si lo hacemos, no hay una twig en la que estemos, por lo que no podemos señalar ninguna twig en ese nuevo compromiso. Lo único que lo señala es HEAD :

 A B C D
 * - * - * - * <- maestro
     \
      * <- CABEZA
      mi

Si luego decidimos revisar master nuevamente, no habrá nada que se refiera a E.

 A B C D
 * - * - * - * <- master <- HEAD
     \
      *
      mi

Como no hay nada que se refiera a él, puede ser difícil de encontrar y considera que los commits no tienen references para ser abandonados (suceden con bastante frecuencia si rebase o aprieta parches, o realiza otra manipulación divertida de la historia; por lo general, representan parches abandonados). que ya no te importa). Después de un cierto período de time, git lo considerará basura, para descartar la próxima vez que se ejecute la recolección de basura.

Por lo tanto, en lugar de revisar una revisión simple y get un encabezado separado, si crees que vas a hacer más commits, debes usar git checkout -b branch B para crear una twig y verificarla. Ahora sus confirmaciones no se perderán, ya que se includeán en una sucursal, a las que puede referirse fácilmente y fusionarse más adelante.

 A B C D
 * - * - * - * <- maestro
    ^
     \ - branch <- HEAD

Si olvida hacer esto y crea commits fuera de una sucursal, no debe preocuparse. Puede crear una twig que se refiera a la revisión de encabezado con git checkout -b branch . Si ya ha cambiado a la twig master y se da count de que olvidó una confirmación git reflog , puede encontrarla usando git reflog , que le mostrará un historial de los git reflog HEAD en los últimos días. Todo lo que todavía está en el reflog no será basura, y generalmente las references se mantienen en el reflog durante al less 30 días.

Si simplemente desea volver a un compromiso anterior para jugar sin hacer ningún cambio, puede hacerlo

 git co <previous-commit-id> 

Estarás en una twig llamada "(sin twig)" después de este command.

Confirma esto por

 git br 

Después de jugar con este código previamente comprometido, puede cambiar a la twig en la que estaba

 git co <the-branch-you-were-on> 

El "(sin twig)" se eliminará automáticamente. De esta manera no es necesario crear una twig temporal.

GIT's HEAD es simplemente un puntero que dice lo que está en el directory de trabajo. Si desea verificar una confirmación que no es la cabeza de una sucursal, simplemente tiene que networkingirigir su HEAD para señalar esa confirmación. No hay forma de evitarlo. Puede crear una bifurcación temporal en esa confirmación, pero HEAD se dirigirá lejos del maestro, no obstante.

Esa es la breve explicación. La verbosidad de abajo ayudará a comprender cómo HEAD y master son diferentes:

Normalmente, las cosas se ven así:

 C ← refs/heads/master ← HEAD ↓ B ↓ A 

Lo que quiere decir: "El padre de C es B, y el padre de B es A. El maestro de twig está apuntando a C, y actualmente he comprobado los contenidos de maestro. Además, cuando confirme, el maestro se actualizará ".

Algunas suposiciones están implícitas en esto, que son necesarias para una comprensión profunda del gráfico de compromiso. A saber, las confirmaciones se refieren solo a sus padres, y el contenido de una twig son aquellas confirmaciones (y solo aquellas confirmaciones) a las que se puede acceder siguiendo los enlaces principales. Los contenidos (no modificados) del tree de trabajo y el índice deben corresponder a la confirmación nombrada por HEAD, ya sea indirectamente ("simbólica") o directamente ("separada").

Por lo tanto, si desea verificar una confirmación anterior, la CABEZA debe actualizarse para señalar la confirmación deseada. git-checkout hace justamente eso:

 C ← refs/heads/master ↓ B ← HEAD ↓ A 

Ahora, has dejado tu twig detrás de ti, ya que estás viendo algo viejo. Eso está perfectamente bien, ya que el consejo de "cabeza separada" te lo dice con calma (el énfasis es mío):

Puede mirar alnetworkingedor, realizar cambios experimentales y confirmarlos, y puede descartar cualquier compromiso que realice en este estado sin afectar a ninguna de las twigs realizando otro pago.

Por otro lado, al reiniciar su sucursal también se obtiene HEAD donde debe estar, ¡tendría un efecto muy diferente!

 C ↓ B ← refs/heads/master ← HEAD ↓ A 

La confirmación C se convertirá en basura, ya que ha declarado que ya no desea que forme parte de la twig maestra.

En resumen, todo lo que tienes que hacer es entender lo que significa git por "HEAD": es donde estás , no donde está una twig determinada. Y si donde estás no es lo mismo que donde está una twig, no hay más remedio que usar un HEAD separado.

(Tal vez también mire en GitHub, gitk o gitweb para navegar por el historial de compromisos, si descarrilar su HEAD continúa irritándolo).

La pregunta es un poco vaga, pero si quiere simplemente cambiar los files en su tree de trabajo, simplemente puede hacer esto:

git checkout [commit|branch] -- .

Luego puede organizar los cambios y crear un nuevo compromiso si lo desea. Esto es bastante útil a veces.

Creo que entiendo tus preguntas. Esto es lo que encontré para resolverlo. y no hay una solución de GUI, solo se puede usar el command para resolverlo, y es realmente simple.

paso 1: crea una label del compromiso anterior al que quieras volver.

como la label v2.0

paso 2: git checkout v2.0

aquí está, ahora tu HEAD está apuntando al compromiso 'v2.0', pero el maestro todavía está apuntando al último commit.

C:\Program Files\Git\doc\git\html\git-checkout.html este documento puede ayudarlo

o escribe la ayuda de git <checkout>