Git: eliminar el archivo comprometido después de la inserción

113

¿Existe la posibilidad de revertir un archivo comprometido en Git? Envié una confirmación en GitHub y luego me di cuenta de que hay un archivo que no quería que se enviara (no he terminado los cambios).

kmaci
fuente
1
¿Quieres eliminar el archivo por completo de GitHub después de una inserción? De lo contrario, simplemente: git rm <file>, git push.
rdrmntn

Respuestas:

153

actualización: método más seguro agregado

metodo preferido:

  1. verifique el estado anterior (sin cambios) de su archivo; nota el guión doble

    git checkout HEAD^ -- /path/to/file
    
  2. cometerlo:

    git commit -am "revert changes on this file, not finished with it yet"
    
  3. empujarlo, no se necesita fuerza:

    git push
    
  4. vuelve a tu trabajo inconcluso, hazlo de nuevo (flecha 3 veces hacia arriba)

    git checkout HEAD^ -- /path/to/file
    

efectivamente 'sin compromiso':

Para modificar la última confirmación del repositorio HEAD, ofuscando su trabajo accidentalmente empujado, mientras potencialmente se enfrenta a un conflicto con su colega que ya puede haberlo retirado, y que crecerá el cabello gris y perderá mucho tiempo tratando de reconciliar su jefe de sucursal local con el central:

Para eliminar el cambio de archivo de la última confirmación:

  1. para revertir el archivo al estado anterior a la última confirmación, haga lo siguiente:

    git checkout HEAD^ /path/to/file
    
  2. para actualizar la última confirmación con el archivo revertido, haga:

    git commit --amend
    
  3. para enviar la confirmación actualizada al repositorio, haga lo siguiente:

    git push -f
    

Realmente, considere usar el método preferido mencionado anteriormente.

xor
fuente
1
A menos que sea el único desarrollador en un proyecto, realmente no debería usar git push -f. Crea muchos más problemas de los que vale. Simplemente elimine el archivo y luego realice una nueva confirmación.
Richardm
1
@ user553086 no podría estar más de acuerdo. ¿Mejor ahora?
xor
¿Es esto factible con confirmaciones más atrás en la historia? Por ejemplo, ¿podría hacer esto con git checkout HEAD~2 /path/to/file? Editar: Parece que lo que quería en mi caso era simplementegit rm /path/to/file
starscream_disco_party
1
¡Me acabas de salvar 4 horas, hermano!
Tosin Onikute
58

Si desea eliminar el archivo del repositorio remoto, primero elimínelo de su proyecto con la opción --cache y luego empújelo:

git rm --cache /path/to/file
git commit -am "Remove file"
git push

(Esto funciona incluso si el archivo se agregó al repositorio remoto hace algunas confirmaciones) Recuerde agregar a .gitignore las extensiones de archivo que no desea enviar.

micoru
fuente
2
Esto elimina los archivos de esta confirmación en adelante, pero los archivos aún son visibles dentro de las confirmaciones anteriores.
Ken
30

Puede revertir solo un archivo a una revisión específica.

Primero puede verificar en qué confirmaciones se modificó el archivo.

git log path/to/file.txt

Luego puede retirar el archivo con el número de revisión.

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /path/to/file.txt

Después de eso, puedes comprometerte y presionarlo nuevamente.

René Höhle
fuente
7

Restablezca el archivo en un estado correcto, confirme y vuelva a presionar.

Si está seguro de que nadie más ha obtenido sus cambios todavía, puede usarlos --amendal confirmar, para modificar su compromiso anterior (es decir, reescribir el historial) y luego presionar. Sin -fembargo, creo que tendrás que usar la opción al empujar, para forzar el empuje.

JB Nizet
fuente
4
  1. Obtén el código hash de la última confirmación.

    • git log
  2. Revertir el compromiso
    • git revert <hash_code_from_git_log>
  3. Empuje los cambios
    • git push

echa un vistazo en el GHR. puede obtener lo que necesita, espero que esto sea útil

krish babu
fuente