He realizado algunos cambios en un archivo que se ha confirmado varias veces como parte de un grupo de archivos, pero ahora quiero restablecer / revertir los cambios en él a una versión anterior.
He hecho un a git log
junto con un git diff
para encontrar la revisión que necesito, pero simplemente no tengo idea de cómo volver el archivo a su estado anterior en el pasado.
git
version-control
git-checkout
Odia_
fuente
fuente
--cached
al verificargit diff
. enlaceRespuestas:
Asumir el hash de la confirmación que desea es
c5f567
:La página del comando man git checkout brinda más información.
Si desea volver al commit antes
c5f567
, agregue~1
(donde 1 es el número de commits que desea volver, puede ser cualquier cosa):Como nota al margen, siempre me he sentido incómodo con este comando porque se usa tanto para cosas comunes (cambio entre ramas) como para cosas inusuales y destructivas (descartando cambios en el directorio de trabajo).
fuente
develop
), querrágit checkout develop -- file/to/restore
(tenga en cuenta el doble guión)Puede revisar rápidamente los cambios realizados en un archivo con el comando diff:
Luego, para revertir un archivo específico a ese commit, use el comando reset:
Es posible que deba usar la
--hard
opción si tiene modificaciones locales.Un buen flujo de trabajo para administrar puntos de referencia es usar etiquetas para marcar puntos en su línea de tiempo. No puedo entender su última oración, pero lo que puede desear es divergir una rama de un punto anterior en el tiempo. Para hacer esto, use el útil comando de pago:
A continuación, puede volver a expresar eso en su línea principal cuando esté listo para fusionar esos cambios:
fuente
git checkout <commit hash> <filename>
funcionó mejor para mí quegit reset
git checkout <commit hash> <filename>
trabajó para mi. Esta no debería ser la respuesta aceptada, en mi humilde opinión.git reset
No.git reset
para restablecer un solo archivo, obtendrá un errorfatal: Cannot do hard reset with paths
git reset --hard <commit hash> <filename>
. Esto generará un error confatal: Cannot do hard reset with paths.
lo que Motti Strom dijo: usegit checkout <commit hash> <filename>
Puede usar cualquier referencia a un git commit, incluido el SHA-1 si es más conveniente. El punto es que el comando se ve así:
git checkout [commit-ref] -- [filename]
fuente
--
, y la respuesta que no?rm -- -f
(eliminar un archivo llamado-f
) parece ser el ejemplo canónico. Más detalles aquírm
comando usa getopt (3) para analizar sus argumentos.getopt
es el comando para analizar argumentos de comando. gnu.org/software/libc/manual/html_node/Getopt.htmlEso se restablecerá
foo
a HEAD. Tú también puedes:para una revisión de vuelta, etc.
fuente
git checkout -- foo
para evitar errores sifoo
hay algo especial (como un directorio o un archivo llamado-f
). Con git, si no está seguro, siempre prefije todos los archivos y directorios con el argumento especial--
.--
no es un comando git y no es especial para git. Es un bash incorporado para indicar el final de las opciones de comando. Puede usarlo con muchos otros comandos bash también.--
es una palabra especial incorporada en bash. Pero es una convención común compatible con muchos analizadores de línea de comandos y utilizada por muchas CLI, incluido git.Y para volver a la última versión confirmada, que se necesita con mayor frecuencia, puede usar este comando más simple.
fuente
Tuve el mismo problema justo ahora y encontré esta respuesta más fácil de entender (
commit-ref
es el valor SHA del cambio en el registro al que desea volver):Esto colocará esa versión anterior en su directorio de trabajo y desde allí puede confirmarla si lo desea.
fuente
Si sabe cuántas confirmaciones necesita volver, puede usar:
Esto supone que está en la
master
rama, y la versión que desea es 5 confirmaciones.fuente
Creo que lo he encontrado ... de http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html
A veces solo quieres regresar y olvidarte de cada cambio pasado un cierto punto porque todos están equivocados.
Empezar con:
$ git log
que le muestra una lista de confirmaciones recientes y sus hash SHA1.
A continuación, escriba:
$ git reset --hard SHA1_HASH
para restaurar el estado a una confirmación dada y borrar todas las confirmaciones más nuevas del registro de forma permanente.
fuente
git push --force
Esto funcionó para mí:
Luego comete el cambio:
fuente
Tienes que tener cuidado cuando dices "retroceder". Si solía tener una versión de un archivo en commit $ A, y luego realizó dos cambios en dos commits separados $ B y $ C (entonces lo que está viendo es la tercera iteración del archivo), y si dice " Quiero volver al primero ", ¿lo dices en serio?
Si desea deshacerse de los cambios tanto en la segunda como en la tercera iteración, es muy simple:
y luego cometes el resultado. El comando pregunta "Quiero revisar el archivo del estado registrado por el commit $ A".
Por otro lado, lo que quiso decir es deshacerse del cambio que introdujo la segunda iteración (es decir, commit $ B), mientras mantiene lo que commit $ C hizo en el archivo, querrá revertir $ B
Tenga en cuenta que quien haya creado commit $ B puede no haber sido muy disciplinado y haber cometido un cambio totalmente no relacionado en el mismo commit, y esta reversión puede tocar archivos que no sean archivos que ve cambios ofensivos, por lo que es posible que desee verificar el resultado cuidadosamente después de hacerlo entonces.
fuente
Divertidamente,
git checkout foo
no funcionará si la copia de trabajo está en un directorio llamadofoo
; Sin embargo, ambosgit checkout HEAD foo
ygit checkout ./foo
:fuente
git checkout -- foo
Así es como
rebase
funciona:Asume que tienes
Los primeros dos comandos ... commit git checkout git rebase master
... verifique la rama de cambios que desea aplicar a la
master
rama. Elrebase
comando toma los commits de<my branch>
(que no se encuentran enmaster
) y los vuelve a aplicar al encabezado demaster
. En otras palabras, el padre de la primera confirmación<my branch>
ya no es una confirmación previa en lamaster
historia, sino el jefe actual demaster
. Los dos comandos son los mismos que:Puede ser más fácil recordar este comando ya que tanto las ramas "base" como "modificar" son explícitas.
. El resultado final de la historia es:
Los dos últimos comandos ...
... haga una combinación de avance rápido para aplicar todos los
<my branch>
cambiosmaster
. Sin este paso, no se agrega la confirmación de rebasemaster
. El resultado final es:master
y<my branch>
ambos de referenciaB'
. Además, desde este punto es seguro eliminar la<my branch>
referencia.fuente
A partir de git v2.23.0 hay un nuevo método de restauración de git que se supone que asume parte de lo que
git checkout
fue responsable (incluso la respuesta aceptada menciona quegit checkout
es bastante confuso). Vea los aspectos más destacados de los cambios en el blog de Github .El comportamiento predeterminado de este comando es restaurar el estado de un árbol de trabajo con el contenido proveniente del
source
parámetro (que en su caso será un hash de confirmación).Entonces, según la respuesta de Greg Hewgill (suponiendo que el hash de confirmación es
c5f567
), el comando se vería así:O si desea restaurar el contenido de una confirmación antes de c5f567:
fuente
Primer reinicio del cabezal para el archivo de destino
Segunda comprobación de ese archivo
fuente
donde
<N>
es el número de revisiones del archivo para revertir el archivo<filename>
.Por ejemplo, para pagar la revisión previa inmediata de un solo archivo
x/y/z.c
, ejecute¿Cómo funciona git prevision?
Agregue lo siguiente a su
gitconfig
Esencialmente, todo lo que uno haría manualmente en esta situación,
envuelto en un hermoso y eficiente git-alias - git-prevision
fuente
Tengo que conectar EasyGit aquí, que es un contenedor para hacer que git sea más accesible para los principiantes sin confundir a los usuarios experimentados. Una de las cosas que hace es darle más significado
git revert
. En este caso, simplemente diría:eg revert foo/bar foo/baz
fuente
eg revert --in REVISON -- FILENAME
. El--in
es importante. Para los usuarios de Windows: Abra git bash. Ejecutarecho %PATH
. La primera ruta debe estar en su directorio de usuarios que termine enbin
. Crea ese camino. Almacenar, por ejemplo, allí. Nómbraloeg
. Noeg.txt
.En el caso de que desee revertir un archivo a una confirmación previa (y el archivo que desea revertir ya confirmado) puede usar
o
Luego, simplemente escenifique y confirme la "nueva" versión.
Armado con el conocimiento de que un commit puede tener dos padres en el caso de una fusión, debe saber que HEAD ^ 1 es el primer padre y HEAD ~ 1 es el segundo padre.
Cualquiera de las dos funcionará si solo hay un padre en el árbol.
fuente
Muchas sugerencias aquí, la mayoría en la línea de
git checkout $revision -- $file
. Un par de alternativas oscuras:Y también, uso mucho esto solo para ver una versión particular temporalmente:
o
(OBS:
$file
debe tener el prefijo./
si es una ruta relativa paragit show $revision:$file
trabajar)Y lo más extraño:
fuente
Tenga en cuenta, sin embargo, que
git checkout ./foo
ygit checkout HEAD ./foo
no son exactamente lo mismo; caso en punto:(La segunda
add
etapa el archivo en el índice, pero no se confirma).Git checkout ./foo
significa revertir ruta./foo
desde el índice ; agregar leHEAD
indica a Git que revierta esa ruta en el índice a suHEAD
revisión antes de hacerlo.fuente
Para mí, ninguna de las respuestas parecía realmente clara y, por lo tanto, me gustaría agregar la mía, que parece muy fácil.
Tengo un commit
abc1
y luego he realizado varias (o una modificación) en un archivofile.txt
.Ahora digamos que eché a perder algo en el archivo
file.txt
y quiero volver a una confirmación anteriorabc1
.1
git checkout file.txt
.: esto eliminará los cambios locales, si no los necesita2
git checkout abc1 file.txt
.: esto traerá su archivo a su versión deseada3
git commit -m "Restored file.txt to version abc1"
.: esto confirmará tu reversión.git push
: esto empujará todo en el repositorio remotoEntre los pasos 2 y 3, por supuesto, puede hacer
git status
para comprender lo que está sucediendo. Por lo general, debería ver lofile.txt
ya agregado y es por eso que no hay necesidad de agit add
.fuente
2.Git revierte el archivo a una rama específica
fuente
Para ir a una versión de confirmación anterior del archivo, obtenga el número de confirmación, diga eb917a1 y luego
Si solo necesita volver a la última versión comprometida
Esto simplemente lo llevará al último estado confirmado del archivo
fuente
git checkout ref | commitHash - filePath
p.ej
fuente
Muchas de las respuestas aquí dicen usar
git reset ... <file>
o,git checkout ... <file>
pero al hacerlo, perderá todas las modificaciones en<file>
commit después del commit que desea revertir.Si desea revertir los cambios de un commit en un solo archivo, tal como
git revert
lo haría pero solo para un archivo (o digamos un subconjunto de los archivos de commit), sugiero usar ambosgit diff
ygit apply
así (con<sha>
= el hash del comprometerse desea revertir):Básicamente, primero generará un parche correspondiente a los cambios que desea revertir, y luego aplicará el parche en reversa para eliminar esos cambios.
Por supuesto, no funcionará si las líneas revertidas han sido modificadas por alguna confirmación entre
<sha1>
yHEAD
(conflicto).fuente
git show -p <sha> path/to/file.ext|git apply -R
<sha>^!
lugar de<sha>^ <sha>
Use
git log
para obtener la clave hash para una versión específica y luego usegit checkout <hashkey>
Nota: No olvides escribir el hash antes del último. El último hash señala tu posición actual (HEAD) y no cambia nada.
fuente
Obviamente, alguien necesita escribir un libro inteligible sobre git o debe explicarse mejor en la documentación. Ante este mismo problema supuse que
deshacería la última confirmación que parece hacer.
Ian
fuente
Puedes hacerlo en 4 pasos:
Lo que necesita escribir en su terminal :
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&&git commit -m 'reverting file'
git checkout .
buena suerte
fuente
git-revert
solo opera en todo el repositorio, por lo que para compensar tenemos que deshacer todo lo demás.git revert --no-commit <commit_hash>
2.git reset HEAD
Esto ahorra una confirmación adicional flotando y realiza todos los cambios solo en su directorio de trabajo.git revert _oldcommit_ --no-commit
git reset -- _unchanged1_ _unchanged2_ ...
git commit -m "branch without changes to specific files"
la nueva sugerencia de rama reflejó todos los cambios, excepto los archivos revertidos.Este es un paso muy simple. Revise el archivo para la identificación de confirmación que queremos, aquí una identificación de confirmación antes, y luego solo git commit correct y listo.
Esto es muy útil. Si queremos llevar cualquier archivo a cualquier ID de confirmación anterior en la parte superior de la confirmación, podemos hacerlo fácilmente.
fuente
Revertirá un commit dado. Parece que crees que
git revert
solo afecta la confirmación más reciente.Eso no resuelve su problema, si desea revertir un cambio en un archivo específico y esa confirmación cambió más que ese archivo.
fuente
si confirma un archivo incorrecto en sus últimas confirmaciones, siga las instrucciones:
fuente