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 reset filepath
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 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:
git reset --soft HEAD^
o
git reset --soft HEAD~1
Luego restablezca los archivos no deseados para dejarlos fuera de la confirmación:
git reset HEAD path/to/unwanted_file
Ahora confirme nuevamente, incluso puede reutilizar el mismo mensaje de confirmación:
git commit -c ORIG_HEAD
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, p git 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ún
git reset
pero quería una manera de afectar el compromiso existente "en su lugar". Acabo de enterarme git commit -C
. Entonces, para mí, lo que quiero es su receta exacta con un paso más, el "nuevo compromiso de nuevo" enunciado como git 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 el rm
comando mismo!
git rm --cached
para mantener los archivos en el disco
rm
en el git
comando está haciendo lo rm
mismo hace!
git commit --amend
todavía está allí y se puede encontrar, por ejemplo, con git 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.
git checkout <commit_id> <path_to_file>
puede hacerlo varias veces si desea eliminar muchos archivos.
2)
git commit -am "remove unwanted files"
3)
Encuentre el commit_id del commit en el que se agregaron los archivos por error , digamos "35c23c2" aquí
git rebase 35c23c2~1 -i // notice: "~1" is necessary
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
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Deberías ser bueno después de guardar el archivo.
Para terminar :
git push -f
Si desafortunadamente tiene conflictos, debe resolverlos manualmente.
git rm --cached <file(s)>
.
--fixup=35c23c2
al git 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
al git 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.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
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.
Si no ha presionado los cambios en el servidor, puede usar
git reset --soft HEAD~1
Restablecerá todos los cambios y volverá a una confirmación
Si ha presionado sus cambios, siga los pasos que respondió @CharlesB
¡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:
git checkout <commit_id> <path_to_file>
o para devolverlo al estado en el HEAD remoto:
git checkout origin/master <path_to_file>
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!)
git checkout HEAD~ path/to/file
git commit --amend
Lo siguiente desestabilizará solo el archivo que deseaba, que es lo que solicitó el OP.
git reset HEAD^ /path/to/file
Verás algo como lo siguiente ...
Cambios a realizar: (use "git reset HEAD ..." para quitar el escenario)
modificado: / ruta / a / archivo
Cambios no organizados para commit: (use "git add ..." para actualizar lo que se confirmará) (use "git checkout - ..." para descartar cambios en el directorio de trabajo)
modificado: / ruta / a / archivo
En este punto, puede hacer lo que quiera con el archivo, como restablecer a una versión diferente.
Cuando estés listo para comprometerte:
git commit --amend -a
o (si tiene otros cambios en curso que todavía no desea confirmar)
git commit add /path/to/file
git commit --amend
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.
git log # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>
noop
a edit [A_commit_ID]
oe [A_commit_ID]
Simplemente puedes intentarlo.
git reset --soft HEAD~1
y crea una nueva confirmación.
Sin embargo, hay un software impresionante "gitkraken". lo que facilita trabajar con git.
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
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
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:
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^
y luego puede finalizar el rebase con facilidad sin tener que recordar comandos más complejos o confirmar mensajes o escribir tanto.
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:
git gui citool --amend
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).
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 de git 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:
git checkout origin/<remote-branch> <filename>
git commit --amend
Realice una secuencia de los siguientes comandos:
//to remove the last commit, but preserve changes
git reset --soft HEAD~1
//to remove unneded file from the staging area
git reset HEAD `<your file>`
//finally make a new commit
git commit -m 'Your message'
Solo quería complementar la respuesta principal ya que tenía que ejecutar un comando adicional:
git reset --soft HEAD^
git checkout origin/master <filepath>
¡Salud!
Algo que funcionó para mí, pero aún creo que debería haber una mejor solución:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
Simplemente deje el cambio que desea descartar en el otro commit, vea otros
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
En realidad, creo que una forma más rápida y fácil es usar el modo interactivo git rebase.
git rebase -i head~1
(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.
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
Si está utilizando GitHub y aún no ha empujado la confirmación, GitHub Desktop resuelve este problema fácilmente:
Si desea eliminar archivos de confirmaciones anteriores, use filtros
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
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
$ rm -rf .git/refs/original/refs
si aún no empujas tus cambios a git
git reset --soft HEAD~1
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:
git rm <file>
git commit --amend
o mejor :
restablecer primero
git reset --soft HEAD~1
restablecer el archivo no deseado
git reset HEAD path/to/unwanted_file
comprometerse de nuevo
git commit -c ORIG_HEAD
Here is the step to remove files from Git Commit.
>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
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
git --uncommit <nombre de archivo>
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.