Ir a revisión particular

582

Cloné un repositorio git de cierto proyecto. ¿Puedo convertir los archivos al estado inicial y cuando reviso los archivos voy a la revisión 2, 3, 4 ... más reciente? Me gustaría tener una visión general de cómo estaba evolucionando el proyecto.

xralf
fuente

Respuestas:

876

Úselo git checkout <sha1>para ver un commit particular.

Marcelo Cantos
fuente
2
Usted puede hacer esto git log -n1. Pero a menos que git checkoutfalle, es una pérdida de esfuerzo.
Marcelo Cantos
2
Funciona. Tuve que usar sha1 completo (no parcial). ¿Y si quiero poner el proyecto a segunda revisión? git logmuestra solo el primer commit ahora, ¿puedo averiguar el sha1 del próximo commit?
xralf
66
Solo debería tener que usar suficiente sha1 para garantizar la unicidad. Quizás tuviste una desafortunada coincidencia. Git no tiene concepto del "próximo" compromiso; La historia es un DAG con todas las flechas apuntando hacia atrás. Debe ejecutar git log --oneliney pegar la salida en un archivo de texto para referencia (se garantiza que las sumas abreviadas de sha1 que proporciona sean únicas). Otra opción, si su historial es lineal, es calcular cuántos commits hay desde el primer commit hasta el masteruso git checkout master~543(si hay 543 commits), luego git checkout master~542, etc.
Marcelo Cantos
20
y cómo volver a pagar al commit actual desde "git checkout <sha1>"?
ア レ ッ ク ス
66
@AlexanderSupertramp Verifique la rama.
Marcelo Cantos
50

Para ir a una versión / commit particular, ejecute los siguientes comandos. CÓDIGO HASH que puede obtener degit log --oneline -n 10

git reset --hard HASH-CODE

Nota : después de restablecer una versión / confirmación en particular, puede ejecutar git pull --rebase, si desea recuperar todas las confirmaciones que se descartan.

J4cK
fuente
1
Tenga en cuenta que a resetno solo desprotege un punto en particular en el gráfico, sino que también moverá su rama actualmente desprotegida
Liam
También con reset, todos sus cambios pendientes se descartan.
WilliamKF
2
--hard flag eliminará cualquier confirmación después de dicho hash ... probablemente quiera agregar ese pequeño bit de tid aquí. Estoy seguro de que la gente ha perdido la historia y se pregunta por qué.
Urasquirrel
git pull --rebasefunciona solo si tiene un control remoto para su repositorio y está actualizado.
Keith Thompson
19

Puede obtener una vista gráfica del historial del proyecto con herramientas como gitk. Solo corre:

gitk --all

Si desea pagar una sucursal específica:

git checkout <branch name>

Para una confirmación específica, use el hash SHA1 en lugar del nombre de la rama. (Vea Treeishes en el Git Community Book , que es una buena lectura, para ver otras opciones para navegar por su árbol).

git log también tiene un conjunto completo de opciones para mostrar el historial detallado o resumen.

No conozco una manera fácil de avanzar en un historial de compromiso. Los proyectos con una historia lineal probablemente no sean tan comunes. La idea de una "revisión" como la que tendría con SVN o CVS no se correlaciona muy bien en Git.

Estera
fuente
2
Tenga en cuenta: git no le mentirá dándole un solo historial lineal del proyecto. Eso es a menos que el proyecto realmente haya evolucionado de esa manera.
Andres Jaan Tack
Avanzar carece lógicamente de sentido (incluso en un historial lineal), ya que una confirmación no hace referencia al "futuro". En el mejor de los casos, puede identificar todos los commits que tienen el commit en cuestión como padre. Eso sí, moverse hacia atrás tampoco es un ejercicio trivial, debido a las fusiones.
Marcelo Cantos
5

Usando una clave SHA1 de confirmación, puede hacer lo siguiente:

  • Primero, encuentre la confirmación que desea para un archivo específico:

    git log -n <# commits> <file-name>

    Esto, basado en su <# commits>, generará una lista de confirmaciones para un archivo específico.

    CONSEJO: si no está seguro de qué comprometerse que busca, una forma buena de saberlo es mediante el comando siguiente: git diff <commit-SHA1>..HEAD <file-name>. Este comando mostrará la diferencia entre la versión actual de una confirmación y una versión anterior de una confirmación para un archivo específico.

    NOTA: la clave SHA1 de un commit está formateada en la git log -nlista como:

cometer <SHA1 id>

  • Segundo, verifique la versión deseada:

    Si ha encontrado el commit / versión que desea, simplemente use el comando: git checkout <desired-SHA1> <file-name>

    Esto colocará la versión del archivo que especificó en el área de preparación. Para sacarlo del área de preparación simplemente use el comando:reset HEAD <file-name>

Para volver a donde apunta el repositorio remoto, simplemente use el comando: git checkout HEAD <file-name>

Mago
fuente
2

Estaba en una situación en la que tenemos una rama maestra, y luego otra rama llamada 17.0 y dentro de esta 17.0 había un hash de confirmación sin decir "XYZ" . Y el cliente recibe una compilación hasta esa revisión XYZ. Ahora nos encontramos con un error y eso debe resolverse para ese cliente. Por lo tanto, necesitamos crear una rama separada para ese cliente hasta ese hash "xyz". Así que así es como lo hice.

Primero creé una carpeta con ese nombre de cliente en mi máquina local. Digamos que el nombre del cliente es "AAA" una vez que se crea esa carpeta, siga el comando dentro de esta carpeta:

  1. git init
  2. git clone Después de este comando, estará en la rama maestra. Así que cambie a la rama deseada
  3. git checkout 17.0 Esto lo llevará a la rama donde está presente su confirmación
  4. git checkout Esto llevará su repositorio hasta que se confirme el hash. Vea el nombre de su rama se cambió a ese hash de confirmación no. Ahora dale un nombre de rama a este hash
  5. git branch ABC Esto creará una nueva rama en su máquina local.
  6. git checkout ABC
  7. git push origin ABC Esto empujará esta rama al repositorio remoto y creará una rama en el servidor git. Estás listo.
ashish
fuente
1

Una forma sería crear todos los commits realizados a parches. compruebe la confirmación inicial y luego aplique los parches en orden después de leer.

uso git format-patch <initial revision>y luego git checkout <initial revision>. Debería obtener una pila de archivos en su director comenzando con cuatro dígitos, que son los parches.

cuando haya terminado de leer su revisión, simplemente haga lo git apply <filename>que debería parecer git apply 0001-*y cuente.

Pero realmente me pregunto por qué no querrías leer los parches en su lugar. Por favor, publique esto en sus comentarios porque tengo curiosidad.

el manual de git también me da esto:

git show next~10:Documentation/README

Muestra el contenido del archivo Documentation / README tal como estaban al día en la 10ma última confirmación de la rama siguiente.

También puede echar un vistazo a lo git blame filenameque le da una lista donde cada línea está asociada con un hash commit + autor.

Alex
fuente
1

Para llegar a un código comprometido específico, necesita el código hash de ese compromiso. Puede obtener ese código hash de dos maneras:

  1. Obténgalo de su cuenta github / gitlab / bitbucket. (Está en su url de confirmación, es decir: github.com/user/my_project/commit/ commit_hash_code ), o puede
  2. git logy verifique sus confirmaciones recientes en esa rama. Le mostrará el código hash de su confirmación y el mensaje que dejó mientras confirmaba su código. Solo copia y luego hazgit checkout commit_hash_code

Después de pasar a ese código, si desea trabajar en él y realizar cambios, debe realizar otra bifurcación git checkout -b <new-branch-name>, de lo contrario, los cambios no se retendrán.

Ianiv Hojman
fuente
0

Para verificar una confirmación (¡nb estás mirando el pasado!).

  • git checkout "commmitHash"

Para reiniciar brutalmente desde un commit y eliminar esas ramas posteriores que probablemente arruinó.

  • git reset --hard "commmitHash"
Jeremy
fuente