Estoy usando Git y he comprometido algunos archivos usando
git commit -a
Más tarde, descubrí que se había agregado un archivo por error al commit.
¿Cómo puedo eliminar un archivo de la última confirmación?
git
git-commit
Paleta
fuente
fuente
git reset filepath
Respuestas:
Creo que otras respuestas aquí son incorrectas, porque esta es una cuestión de mover los archivos confirmados por error de nuevo al área de preparación de la confirmación anterior, sin cancelar los cambios realizados en ellos. Esto se puede hacer como sugirió Paritosh Singh:
o
Luego restablezca los archivos no deseados para dejarlos fuera de la confirmación:
Ahora confirme nuevamente, incluso puede reutilizar el mismo mensaje de confirmación:
fuente
git push
corregir su repositorio, se quejaráUpdates were rejected because the tip of your current branch is behind its remote counterpart.
. Si está seguro de que desea empujarlos (p. Ej., Es su tenedor), puede usar la-f
opción para forzar el empuje, pgit push origin master -f
. Ej . (No le hagas esto a un repositorio aguas arriba del que otros están buscando)git reset --soft HEAD^
es mi operación de deshacer más comúngit reset
pero quería una manera de afectar el compromiso existente "en su lugar". Acabo de enterarmegit commit -C
. Entonces, para mí, lo que quiero es su receta exacta con un paso más, el "nuevo compromiso de nuevo" enunciado comogit commit -C [hash of original HEAD commit from first step]
.ATENCION ! Si solo desea eliminar un archivo de su confirmación anterior y mantenerlo en el disco , lea la respuesta de juzzlin justo arriba.
Si esta es su última confirmación y desea eliminar completamente el archivo de su repositorio local y remoto , puede:
git rm <file>
git commit --amend
La bandera de modificación le dice a git que se comprometa nuevamente, pero "fusionar" (no en el sentido de fusionar dos ramas) esta confirmación con la última confirmación.
Como se indicó en los comentarios, ¡usar
git rm
aquí es como usar elrm
comando mismo!fuente
git rm --cached
para mantener los archivos en el discorm
en elgit
comando está haciendo lorm
mismo hace!git commit --amend
todavía está allí y se puede encontrar, por ejemplo, congit reflog
. Por lo tanto, no es tan malo como sugieren los otros comentarios.Las respuestas existentes están hablando de eliminar los archivos no deseados de la última confirmación.
Si desea eliminar archivos no deseados de una vieja comprometerse (incluso de difusión) y no desea crear una nueva cometer, que es innecesaria, debido a la acción:
1)
Encuentre el commit al que desea que se ajuste el archivo.
puede hacerlo varias veces si desea eliminar muchos archivos.
2)
3)
Encuentre el commit_id del commit en el que se agregaron los archivos por error , digamos "35c23c2" aquí
Este comando abre el editor de acuerdo con su configuración. El predeterminado es vim.
Mueva la última confirmación, que debería ser "eliminar archivos no deseados", a la siguiente línea de la confirmación incorrecta ("35c23c2" en nuestro caso) y configure el comando como
fixup
:Deberías ser bueno después de guardar el archivo.
Para terminar :
Si desafortunadamente tiene conflictos, debe resolverlos manualmente.
fuente
git rm --cached <file(s)>
.--fixup=35c23c2
algit commit
comando. Esto configurará la confirmación automáticamente como una reparación de la confirmación requerida y, por lo tanto, no necesitará especificarla en el rebase. Además, si agrega--autosquash
algit rebase
comando, git moverá automáticamente su confirmación a la ubicación correcta, por lo que no necesita hacer nada en el rebase interactivo: solo guarde el resultado (lo que significa que ni siquiera necesita-i
marcar, aunque me gusta usarlo de todos modos para asegurarme de que todo se vea como esperaba).Como indica la respuesta aceptada, puede hacerlo restableciendo todo el commit. Pero este es un enfoque bastante pesado.
Una forma más limpia de hacer esto sería mantener la confirmación y simplemente eliminar los archivos modificados.
El
git reset
tomará el archivo como lo fue en la confirmación anterior, y la etapa en el índice. El archivo en el directorio de trabajo está intacto.El
git commit
entonces comprometerse y aplastar el índice en la corriente cometió.Básicamente, esto toma la versión del archivo que estaba en la confirmación anterior y la agrega a la confirmación actual. Esto no produce ningún cambio neto, por lo que el archivo se elimina efectivamente de la confirmación.
fuente
Si no ha presionado los cambios en el servidor, puede usar
Restablecerá todos los cambios y volverá a una confirmación
Si ha presionado sus cambios, siga los pasos que respondió @CharlesB
fuente
¡Eliminar el archivo usando rm lo eliminará!
Siempre está agregando a un commit en git en lugar de eliminar, por lo que en este caso devuelva el archivo al estado en el que estaba antes del primer commit (esto puede ser una acción de eliminación 'rm' si el archivo es nuevo) y luego vuelva a confirmar y el archivo se irá.
Para devolver el archivo a algún estado anterior:
o para devolverlo al estado en el HEAD remoto:
luego corrija la confirmación y debería encontrar que el archivo ha desaparecido de la lista (¡y no se ha eliminado de su disco!)
fuente
fuente
Lo siguiente desestabilizará solo el archivo que deseaba, que es lo que solicitó el OP.
Verás algo como lo siguiente ...
En este punto, puede hacer lo que quiera con el archivo, como restablecer a una versión diferente.
Cuando estés listo para comprometerte:
o (si tiene otros cambios en curso que todavía no desea confirmar)
fuente
Te explicaré con el ejemplo.
Deje A, B, C ser 3 confirmaciones sucesivas. La confirmación B contiene un archivo que no debería haberse confirmado.
fuente
noop
aedit [A_commit_ID]
oe [A_commit_ID]
Simplemente puedes intentarlo.
y crea una nueva confirmación.
Sin embargo, hay un software impresionante "gitkraken". lo que facilita trabajar con git.
fuente
git commit --amend
que la eliminación del archivo se actualice en su última confirmación; y luego, puedes comprobar que efectivamente se ha eliminado congit log -1 --stat
te dejará el archivo local todavía. Si tampoco desea el archivo localmente, puede saltarse la opción --cached.
Si todo el trabajo está en su sucursal local, debe mantener el archivo en una confirmación posterior, y como tener un historial limpio, creo que una forma más simple de hacerlo podría ser:
y luego puede finalizar el rebase con facilidad sin tener que recordar comandos más complejos o confirmar mensajes o escribir tanto.
fuente
Usar git GUI puede simplificar la eliminación de un archivo de la confirmación anterior.
Suponiendo que esta no es una rama compartida y no le importa reescribir el historial , ejecute:
Puede desmarcar el archivo que se confirmó por error y luego hacer clic en "Confirmar".
El archivo se elimina de la confirmación, pero se mantendrá en el disco . Entonces, si desmarcó el archivo después de agregarlo por error, se mostrará en su lista de archivos no rastreados (y si desmarcó el archivo después de modificarlo erróneamente, se mostrará en sus cambios no organizados para la lista de confirmación).
fuente
sudo apt-get install git-gui
git rebase -i HEAD~4
y luego ejecuté su comando para abrir el editor. Otra nota: "Unstaging" se puede encontrar en el menú "Commit".git reset --soft HEAD^
(recordando el argumento --soft), seguido degit commit -c ORIG_HEAD
(en lugar de --amend, que arruina todo).Si desea preservar su confirmación (tal vez ya pasó algún tiempo escribiendo un mensaje de confirmación detallado y no desea perderlo), y solo desea eliminar el archivo de la confirmación, pero no del repositorio por completo:
fuente
Realice una secuencia de los siguientes comandos:
fuente
Solo quería complementar la respuesta principal ya que tenía que ejecutar un comando adicional:
¡Salud!
fuente
Algo que funcionó para mí, pero aún creo que debería haber una mejor solución:
Simplemente deje el cambio que desea descartar en el otro commit, vea otros
fuente
git reset --soft HEAD^
revierte su confirmación, y cuando escribegit status
, le dice qué hacer:fuente
En realidad, creo que una forma más rápida y fácil es usar el modo interactivo git rebase.
(o cabeza ~ 4, hasta dónde quieres llegar)
y luego, en lugar de 'elegir', use 'editar'. No me di cuenta de lo poderosa que es 'editar'.
https://www.youtube.com/watch?v=2dQosJaLN18
Espero que lo encuentren útil.
fuente
Tuve el mismo problema cuando tengo cambios en una sucursal local donde quería revertir solo un archivo. Lo que funcionó para mí fue ...
( Feature / target_branch a continuación es donde tengo todos mis cambios, incluidos los que quería deshacer para un archivo específico)
( origin / feature / target_branch es la rama remota a la que quiero enviar mis cambios)
( característica / puesta en escena es mi rama de puesta en escena temporal en la que presionaré desde todos mis cambios deseados, excluyendo el cambio en ese archivo)
Crear una sucursal local desde mi origen / función / target_branch - lo llamé función / organización
Fusioné mi función de sucursal local de trabajo / target_branch con la función / sucursal provisional
Se desprotegió la función / puesta en escena y luego se reinició git --soft ORIG_HEAD (Ahora todos los cambios de la función / puesta en escena se organizarán pero no se confirmarán).
Desinstaló el archivo que he verificado previamente con cambios innecesarios
Cambió la rama ascendente para la característica / puesta en escena a origen / característica / target_branch
Cometí el resto de los cambios organizados y empujé río arriba a mi origen / función / objetivo_branco remoto
fuente
Si ya no necesita ese archivo, puede hacer
fuente
Si está utilizando GitHub y aún no ha empujado la confirmación, GitHub Desktop resuelve este problema fácilmente:
fuente
Si desea eliminar archivos de confirmaciones anteriores, use filtros
Si ves este error:
No se puede crear una nueva copia de seguridad. Ya existe una copia de seguridad anterior en refs / original / Force sobrescribiendo la copia de seguridad con -f
Simplemente elimine las copias de seguridad de las referencias en su repositorio local
fuente
si aún no empujas tus cambios a git
Restablecerá todos los cambios y volverá a una confirmación
Si esta es la última confirmación que realizó y desea eliminar el archivo del repositorio local y remoto, intente esto:
o mejor :
restablecer primero
restablecer el archivo no deseado
comprometerse de nuevo
fuente
Esto funcionó para mí para eliminar el archivo del repositorio de bit bucket que empujé el archivo a la ramificación inicialmente.
fuente
Copié los archivos actuales en una carpeta diferente, luego me deshago de todos los cambios no acelerados:
Luego copia las cosas de nuevo. Comprometerse, empujar.
fuente
Simplemente puede usar este comando:
fuente
fuente
Ninguna de las respuestas en este momento es razonable. Parece que hay suficiente demanda para que se proponga una solución real: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
sería bueno. Entiendo que no queremos modificar el historial, pero si soy local y accidentalmente agregué un archivo local de "pirateo" y quiero eliminarlo del commit, esto sería muy útil.
fuente