ver tipos tag qué oneline modificados log existen etiquetas crear archivos git revert

tipos - Revertir un solo archivo a una versión anterior en git



git ver archivos modificados (6)

Esta pregunta ya tiene una respuesta aquí:

¿Hay una manera de ir a través de diferentes confirmaciones en un archivo. Digamos que modifiqué un archivo 5 veces y quiero volver al cambio 2, después de haberlo enviado y enviado a un repositorio.

En mi entendimiento, la única forma es mantener muchas sucursales, ¿lo tengo, verdad? Si tengo razón, tendré cientos de sucursales en unos pocos días, así que probablemente no lo entiendo realmente.

¿Alguien podría aclarar eso por favor?


Comencemos con una descripción cualitativa de lo que queremos hacer (gran parte de esto se dice en la respuesta de Ben Straub). Hicimos un número de confirmaciones, cinco de las cuales cambiaron un archivo determinado y queremos revertir el archivo a una de las versiones anteriores. En primer lugar, git no conserva los números de versión para archivos individuales. Simplemente rastrea el contenido: una confirmación es esencialmente una instantánea del árbol de trabajo, junto con algunos metadatos (por ejemplo, un mensaje de confirmación). Por lo tanto, debemos saber qué compromiso tiene la versión del archivo que queremos. Una vez que sepamos eso, tendremos que hacer un nuevo compromiso para revertir el archivo a ese estado. (No podemos simplemente jugar con la historia, porque ya hemos empujado este contenido, y la edición de los problemas de la historia con todos los demás).

Así que vamos a empezar por encontrar el compromiso correcto. Puede ver las confirmaciones que han realizado modificaciones a los archivos dados con mucha facilidad:

git log path/to/file

Si sus mensajes de confirmación no son lo suficientemente buenos, y necesita ver qué se hizo con el archivo en cada confirmación, use la opción -p/--patch :

git log -p path/to/file

O, si prefieres la vista gráfica de gitk.

gitk path/to/file

También puedes hacer esto una vez que hayas iniciado el gitk a través del menú de vista; Una de las opciones para una vista es una lista de rutas para incluir.

De cualquier manera, podrás encontrar el SHA1 (hash) de la confirmación con la versión del archivo que deseas. Ahora, todo lo que tienes que hacer es esto:

# get the version of the file from the given commit git checkout <commit> path/to/file # and commit this modification git commit

(El comando de verificación primero lee el archivo en el índice, luego lo copia en el árbol de trabajo, por lo que no es necesario usar git add para agregarlo al índice como preparación para la confirmación).

Si su archivo puede no tener un historial simple (p. Ej., Renombrar y copiar), vea el excelente comentario de VonC. Se puede dirigir a git para que busque con más cuidado tales cosas, a expensas de la velocidad. Si estás seguro de que la historia es simple, no debes preocuparte.


Digamos que sus 5 confirmaciones son A , B , C , D , E - A es la primera y E la última. Desea revertir file.txt a la forma en que estaba después de confirmar A. No necesita aprender o recordar las diferentes versiones u opciones de los comandos git-reset y git-checkout. Correr:

git show A:file.txt >file.txt # If you want to commit the older version: git add file.txt git commit

El comando git-show muestra el contenido de, o información sobre, cualquier objeto en un repositorio Git. Cuando se le presente una referencia de confirmación como A (o master ^ o HEAD ~ 5 o ...), seguida de dos puntos, seguida de un nombre de archivo, mostrará el contenido de ese archivo tal como estaba después de esa confirmación. Entonces es solo una cuestión de redirigir la salida al archivo.



Git es muy flexible. No deberías necesitar cientos de sucursales para hacer lo que estás pidiendo. Si desea revertir el estado hasta el segundo cambio (y de hecho es un cambio que ya se confirmó y se presionó), use git revert . Algo como:

git revert a4r9593432

donde a4r9593432 son los caracteres iniciales del hash de la confirmación que desea retirar.

Si la confirmación contiene cambios en muchos archivos, pero solo desea revertir solo uno de los archivos, puede usar git reset (la segunda o tercera forma):

git reset a4r9593432 -- path/to/file.txt # the reverted state is added to the staging area, ready for commit git diff --cached path/to/file.txt # view the changes git commit git checkout HEAD path/to/file.txt # make the working tree match HEAD

Pero esto es bastante complejo, y el reinicio de git es peligroso. Utilice git checkout <hash> <file path> lugar, como sugiere Jefromi.

Si solo quieres ver cómo se veía el archivo en commit x, puedes usar git show :

git show a4r9593432:path/to/file.txt

Para todos los comandos, hay muchas maneras de referirse a un commit que no sea a través del hash de commit (vea Cómo asignar comillas en el Manual del usuario de Git).


Git no piensa en términos de versiones de archivo. Una versión en git es una instantánea de todo el árbol.

Dado esto, lo que realmente desea es un árbol que tenga el contenido más reciente de la mayoría de los archivos, pero con el contenido de un archivo igual al de hace 5 confirmaciones. Esto tomará la forma de una nueva confirmación sobre las antiguas, y la última versión del árbol tendrá lo que usted desea.

No sé si hay una sola línea que revertirá un solo archivo al contenido de 5 confirmaciones atrás, pero la solución de baja fidelidad debería funcionar: checkout master~5 , copiar el archivo en otra parte, checkout master , copiar el archivo de vuelta, luego cometer.


Puede tomar un diff que deshaga los cambios que desee y confirme eso.

Por ejemplo, si desea deshacer los cambios en el rango de from..to , haga lo siguiente

git diff to..from > foo.diff # get a reverse diff patch < foo.diff git commit -a -m "Undid changes from..to".