Eliminar files de Git commit

Estoy usando Git y he cometido pocos files usando

git commit -a 

Más tarde, descubrí que se había agregado erróneamente un file a la confirmación.

¿Cómo puedo eliminar un file de la última confirmación?

Creo que otras respuestas aquí son incorrectas, porque se trata de mover los files erróneamente confirmados al área de preparación de la confirmación anterior, sin cancelar los cambios que se les hicieron. Esto se puede hacer como sugirió Paritosh Singh:

 git reset --soft HEAD^ 

o

 git reset --soft HEAD~1 

Luego restablezca los files no deseados para dejarlos fuera de la confirmación:

 git reset HEAD path/to/unwanted_file 

Ahora vuelve a cometer, incluso puedes volver a usar el mismo post de confirmación:

 git commit -c ORIG_HEAD 

¡ ATENCIÓN ! Si solo desea eliminar un file de su confirmación anterior y mantenerlo en el disco , lea la respuesta de juzzlin que se encuentra arriba.

Si esta es su última confirmación y desea eliminar por completo el file de su repository local y remoto , puede:

  1. eliminar el file git rm <file>
  2. cometer con enmendar la bandera: git commit --amend

La bandera de modificación le dice a git que vuelva a cometer, pero "fusionar" (no en el sentido de fusionar dos twigs) esta confirmación con el último compromiso.

Y para decirlo como tú, ¡la rm en el command git está haciendo lo mismo que yo!

Las respuestas existentes hablan de eliminar los files no deseados de la última confirmación.

Si desea eliminar files no deseados de una confirmación anterior (incluso presionada) y no desea crear una nueva confirmación, que es innecesaria, debido a la acción:

1.

Encuentre el compromiso al que desea que se ajuste el file.

 git checkout <commit_id> <path_to_file> 

puedes hacerlo varias veces si quieres eliminar muchos files.

2.

 git commit -am "remove unwanted files" 

3.

Encuentre el commit_id de la confirmación en la que se agregaron los files erróneamente , digamos "35c23c2" aquí

 git rebase 35c23c2~1 -i // notice: "~1" is necessary 

Este command abre el editor de acuerdo a su configuration. El pnetworkingeterminado es vim.

Mueva la última confirmación, que debería ser "eliminar files no deseados", a la siguiente línea de la confirmación incorrecta ("35c23c2" en nuestro caso), y configure el command como fixup :

 pick 35c23c2 the first commit fixup 0d78b28 remove unwanted files 

Deberías estar bien después de save el file.

Para terminar :

 git push -f 

Si desafortunadamente tiene conflictos, debe resolverlos manualmente.

¡Eliminar el file usando rm lo eliminará!

Siempre está agregando un commit en git en lugar de eliminar, por lo que en esta instancia devuelva el file al estado en el que estaba antes de la primera confirmación (esto puede ser una acción de eliminación de 'rm' si el file es nuevo) y luego re-commit y el file irá.

Para devolver el file a un estado anterior:

  git checkout <commit_id> <path_to_file> 

o para devolverlo al estado en el CABEZO remoto:

  git checkout origin/master <path_to_file> 

luego modifica la confirmación y deberías encontrar que el file ha desaparecido de la list (¡y no ha sido eliminado de tu disco!)

Si no ha presionado los cambios en el server, puede usar

 git reset --soft HEAD~1 

Restablecerá todos los cambios y volverá a un compromiso atrás

Si ha modificado sus cambios, siga los pasos tal como los respondió @CharlesB

 git checkout HEAD~ path/to/file git commit --amend 

Como lo indica la respuesta aceptada, puede hacer esto restableciendo la confirmación completa. 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 files modificados de ella.

 git reset HEAD^ -- path/to/file git commit --amend --no-edit 

El git reset tomará el file tal como estaba en la confirmación anterior y lo colocará en el índice. El file en el directory de trabajo está intacto.
El git commit luego comprometerá y aplastará el índice en la confirmación actual.

Esto esencialmente toma la versión del file que estaba en la confirmación anterior y lo agrega a la confirmación actual. Esto no genera ningún cambio neto, por lo que el file se elimina de manera efectiva del compromiso.

Lo siguiente desestabilizará solo el file que pretendía, que es lo que solicitó el OP.

 git reset HEAD^ /path/to/file 

Verás algo como lo siguiente …

Cambios a cometer: (use "git reset HEAD …" para abandonar la escena)

modificado: / ruta / a / file

Cambios no realizados para commit: (use "git add …" para actualizar lo que se va a comprometer) (use "git checkout – …" para descartar cambios en el directory de trabajo)

modificado: / ruta / a / file

  • "Cambios que se comprometerán" es la versión anterior del file antes de la confirmación. Esto se verá como una eliminación si el file nunca existió. Si confirma este cambio, habrá una revisión que revierte el cambio al file en su sucursal.
  • "Cambios no configurados para la confirmación" es el cambio que ha cometido y el estado actual del file

En este punto, puede hacer lo que quiera con el file, como restablecer a una versión diferente.

Cuando esté listo para comprometerse:

 git commit --amend -a 

o (si tiene otros cambios que no quiere comprometer, aún)

 git commit add /path/to/file git commit --amend 

Si desea conservar su confirmación (quizás ya haya dedicado un time a escribir un post de confirmación detallado y no quiera perderlo), y solo desea eliminar el file de la confirmación, pero no del repository por completo:

 git checkout origin/<remote-branch> <filename> git commit --amend 

El uso de la GUI de git puede simplificar la eliminación de un file de la confirmación previa.

Suponiendo que no se trata de una twig compartida y no le importe reescribir el historial , ejecute:

 git gui citool --amend 

Puede quitar la marca del file que se cometió por error y luego hacer clic en "Confirmar".

enter image description here

El file se elimina de la confirmación, pero se mantendrá en el disco . Por lo tanto, si desmarca el file después de agregarlo por error, se mostrará en la list de files sin seguimiento (y si lo desactivó luego de modificarlo por error, se mostrará en los cambios no realizados para la list de confirmaciones).

 git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file> git commit -m "removed unwanted file from git" 

te dejará el file local todavía. Si tampoco desea el file localmente, puede omitir la opción –cached.

Si todo el trabajo está en su sucursal local, necesita mantener el file en una confirmación posterior, y como tener un historial limpio, creo que una forma más sencilla de hacer esto 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 terminar la rebase con facilidad sin tener que recordar commands más complejos o enviar posts o escribir tanto.

Haz una secuencia de los siguientes commands:

 //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 command adicional:

 git reset --soft HEAD^ git checkout origin/master <filepath> 

¡Aclamaciones!

Te explicaré con el ejemplo Let A, B, C 3 commits sucesivos. Commit B contiene un file que no debería haberse comprometido.

  • $ git log # take A commmit_id
  • $ git rebase -i "A_ID"
  • cambiar el compromiso a 'e' en rebase vim
  • $ git rm unwanted_file
  • $ git rebase continue
  • $ git push –force

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 compromiso, verifique otros

 $ git commit --amend // or stash and rebase to <commit_id> to amend changes 

En realidad, creo que una manera más rápida y fácil es usar el modo interactivo git rebase.

 git rebase -i head~1 

(o cabeza ~ 4, lo lejos que quieras ir)

y luego, en lugar de 'elegir', use 'editar'. No me di count de lo poderoso que es 'editar'.

https://www.youtube.com/watch?v=2dQosJaLN18

Espero que lo encuentres útil.

Tuve el mismo problema en el que tengo cambios en una sucursal local donde quería revertir solo un file. 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 file específico)

( origin / feature / target_branch es la twig remota en la que deseo insert mis cambios)

( function / puesta en escena es mi twig provisional de etapas donde voy a presionar desde todos mis cambios deseados, excluyendo el cambio a ese único file)

  1. Crear una sucursal local desde mi origen / feature / target_branch – llamada feature / stage

  2. Fusioné mi function de twig local activa / twig_destino con la twig de característica / sorting

  3. Función / configuration de check- out luego git reset –soft ORIG_HEAD (ahora todos los cambios de la function / puesta en escena 'se realizarán pero no serán confirmados).

  4. Sin untar el file que he revisado previamente con cambios innecesarios

  5. Se modificó la twig ascendente para la function / sorting en origen / característica / twig_destino

  6. Cometí el rest de los cambios efectuados y empujé hacia arriba a mi origen / feature / target_branch remoto

Si aún no ha enviado la confirmación, GitHub Desktop resuelve este problema fácilmente:

  1. Elija Repositorio -> Deshacer Comstackción más reciente
  2. Deselect el file que ha agregado erróneamente. Su post de compromiso anterior ya estará en el cuadro de dialog.
  3. Presione el button de confirmar

Si ya no necesitas ese file, podrías hacer

 git rm file git commit --amend git push origin branch