tipos - Eliminar archivos de Git commit
tipos de etiquetas en git (21)
¡ ATENCIÓN ! 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:
- eliminar el archivo
git rm <file>
- confirmar con modificar
git commit --amend
:git commit --amend
La marca de modificación le dice a git que vuelva a cometer, pero "fusionar" (no en el sentido de fusionar dos ramas) este cometer con el último cometer.
Como se indica en los comentarios, usar git rm
aquí es como usar el comando rm
sí mismo.
Estoy usando Git y he cometido pocos archivos usando
git commit -a
Más tarde, descubrí que un archivo se había agregado por error a la confirmación.
¿Cómo puedo eliminar un archivo de la última confirmación?
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, revise otros
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
Como 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 el compromiso y simplemente eliminar los archivos modificados.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
El git reset
tomará el archivo como estaba en la confirmación anterior, y lo colocará en el índice. El archivo en el directorio de trabajo está intacto.
La git commit
se comprometerá y aplastará el índice en la confirmación actual.
Básicamente, 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 de la confirmación.
Creo que otras respuestas aquí son incorrectas, porque se trata de mover los archivos cometidos por error al área de preparación del compromiso anterior, sin cancelar los cambios realizados en ellos. Esto se puede hacer como Paritosh Singh sugirió:
git reset --soft HEAD^
o
git reset --soft HEAD~1
Luego reinicie los archivos no deseados para dejarlos fuera de la confirmación:
git reset HEAD path/to/unwanted_file
Ahora confirme de nuevo, incluso puede reutilizar el mismo mensaje de confirmación:
git commit -c ORIG_HEAD
Eliminar el archivo usando rm lo eliminará!
Siempre se agrega a un commit en git en lugar de eliminar, por lo que en este caso, devuelva el archivo al estado en que se encontraba antes del primer commit (esto puede ser una acción de eliminación ''rm'' si el archivo es nuevo) y luego volver a confirmar y el archivo 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 modifique la confirmación y debería encontrar que el archivo ha desaparecido de la lista (¡y no se ha eliminado de su disco!)
En realidad, creo que una forma más rápida y sencilla es usar el modo interactivo git rebase.
git rebase -i head~1
(o cabeza ~ 4, cuanto quieres ir)
y luego, en lugar de ''elegir'', use ''editar''. No me di cuenta de lo poderoso que es ''editar''.
https://www.youtube.com/watch?v=2dQosJaLN18
Espero que te sea de utilidad.
Esto me ha funcionado para eliminar el archivo del repositorio de bits en el que empujé el archivo para bifurcar inicialmente.
git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push
Haz 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''
Las respuestas existentes hablan sobre la eliminación de los archivos no deseados de la última confirmación.
Si desea eliminar los archivos no deseados de una confirmación antigua (incluso empujada) y no desea crear una confirmación nueva, que es innecesaria, debido a la acción:
1.
Encuentre la confirmación con la que desea que se ajuste el archivo.
git checkout <commit_id> <path_to_file>
puede hacer esto 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 establezca el comando como fixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Deberías estar bien después de guardar el archivo.
Para terminar :
git push -f
Si desafortunadamente tienes conflictos, tienes que resolverlos manualmente.
Lo siguiente desestabilizará solo el archivo que deseaba, que es lo que pidió el OP.
git reset HEAD^ /path/to/file
Verás algo como lo siguiente ...
Cambios que se deben confirmar: (use "git reset HEAD ..." para anular el escenario)
modificado: / ruta / a / archivo
Cambios no preparados para confirmación: (use "git add ..." para actualizar lo que se confirmará) (use "git checkout - ..." para descartar los cambios en el directorio de trabajo)
modificado: / ruta / a / archivo
- "Cambios para confirmar" es la versión anterior del archivo anterior a la confirmación. Esto parecerá una eliminación si el archivo nunca existió. Si confirma este cambio, habrá una revisión que revierte el cambio al archivo en su sucursal.
- "Cambios no preparados para confirmación" es el cambio que confirmó y el estado actual del archivo.
En este punto, puede hacer lo que quiera con el archivo, como restablecer a una versión diferente.
Cuando esté listo para comprometerse:
git commit --amend -a
o (si tiene otros cambios en curso que aún no desea realizar)
git commit add /path/to/file
git commit --amend
Si desea conservar su confirmación (tal vez ya haya pasado un tiempo escribiendo un mensaje de confirmación detallado y no quiera 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
Si está utilizando GitHub y aún no ha enviado la confirmación, GitHub Desktop resuelve este problema fácilmente:
- Elegir repositorio -> Deshacer la confirmación más reciente
- Deselecciona el archivo que agregaste por error. Su mensaje de confirmación anterior ya estará en el cuadro de diálogo.
- Presiona el botón Commit!
Si no ha insertado los cambios en el servidor, puede utilizar
git reset --soft HEAD~1
Se restablecerán todos los cambios y se revertirá a un compromiso.
Si ha presionado sus cambios, siga los pasos como lo responde @CharlesB
Si ya no necesitas ese archivo, podrías hacerlo.
git rm file
git commit --amend
git push origin branch
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>
¡Aclamaciones!
Te explicaré con el ejemplo.
Sean A, B, C 3 comillas 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 <branchName>
Tenía el mismo problema en el que tengo cambios en una sucursal local donde quería revertir un solo archivo. Lo que funcionó para mí fue ...
( característica / target_branch a continuación es donde tengo todos mis cambios, incluidos aquellos que quería deshacer para un archivo específico)
( origin / feature / target_branch es la rama remota a la que quiero enviar mis cambios)
(la característica / la puesta en escena es mi rama temporal de la puesta en escena donde presionaré de todos mis cambios deseados, excluyendo el cambio a ese único archivo)
Crear una sucursal local desde mi origen / característica / target_branch - llamada característica / puesta en escena
Combiné mi función de rama local / target_branch en funcionamiento a la rama de función / puesta en escena
Se revisó 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 pondrán en escena pero sin confirmar).
Desglosado el archivo que he registrado previamente con cambios innecesarios
Se cambió la rama ascendente para la característica / organización por etapas a origin / feature / target_branch
Comprometí el resto de los cambios por etapas y los envié en sentido ascendente a mi origen / característica / destino_branch remoto
Usar git GUI puede simplificar la eliminación de un archivo de la confirmación anterior.
Suponiendo que esto no es una rama compartida y no te importa reescribir el historial , ejecuta:
git gui citool --amend
Puede deseleccionar 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 . Por lo tanto, si desmarca el archivo después de agregarlo por error, se mostrará en su lista de archivos sin seguimiento (y si desmarca el archivo después de modificarlo por error, se mostrará en los cambios no preparados para la lista de confirmación).
git reset --soft HEAD^
devuelve su confirmación, y cuando escribe el git status
, le indica qué hacer:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
git checkout HEAD~ path/to/file
git commit --amend
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 omitir la opción --cached.
Si todo el trabajo está en su sucursal local, necesita mantener el archivo en una confirmación posterior y, como tener un historial limpio, creo que una forma más sencilla 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 terminar el rebase con facilidad sin tener que recordar comandos más complejos o enviar un mensaje o escribir tanto.