¿Por qué hay dos formas de eliminar un archivo de git?

A veces, git ofrece git rm --cached deshabilitar el archivo, a veces git reset HEAD file . ¿Cuándo usar cuál?

EDITAR:

 D:\code\gt2>git init Initialized empty Git repository in D:/code/gt2/.git/ D:\code\gt2>touch a D:\code\gt2>git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # a nothing added to commit but untracked files present (use "git add" to track) D:\code\gt2>git add a D:\code\gt2>git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: a # D:\code\gt2>git commit -ma [master (root-commit) c271e05] a 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a D:\code\gt2>touch b D:\code\gt2>git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # b nothing added to commit but untracked files present (use "git add" to track) D:\code\gt2>git add b D:\code\gt2>git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: b # 
942
03 авг. fijado por Senthess 03 ago. 2011-08-03 00:50 '11 a las 0:50 2011-08-03 00:50
@ 11 respuestas

git rm --cached <filePath> no elimina el archivo, pero en realidad elimina el (los) archivo (s) del repositorio (si ya se ha confirmado antes), pero deja el archivo en el árbol de trabajo (dejándolo sin supervisión). archivo).

git reset -- <filePath> cancela cualquier cambio incremental a este archivo (s).

Sin embargo, si usó git rm --cached para un nuevo archivo que está en la preparación de git rm --cached , parecería que lo acaba de instalar, ya que nunca se reparó.

1581
03 авг. respuesta dada por Ryan Stewart 03 ago. 2011-08-03 01:03 '11 a la 1:03 2011-08-03 01:03

git rm --cached utiliza para eliminar un archivo del índice. En el caso de que el archivo ya esté en el repositorio, git rm --cached eliminará el archivo del índice, dejándolo en el directorio de trabajo, y la solución también lo eliminará del repositorio. En principio, después de arreglarlo, no transferiría el archivo y guardaría una copia local.

git reset HEAD file (que de manera predeterminada usa el indicador --mixed ) es diferente cuando, cuando el archivo ya está en el repositorio, reemplaza la versión de índice del archivo con una referencia al repositorio (HEAD), efectivamente sin usar modificaciones .

border=0

En el caso de un archivo no versionado, desconectará el archivo completo, ya que el archivo no estaba en HEAD. En este aspecto, el git reset HEAD file y git rm --cached mismos, pero no son los mismos (como se describe en el caso de archivos que ya están en el repositorio)

Why are there 2 ways to unstage a file in git? - nunca hay una sola manera de hacer algo en git. es su belleza :)

315
03 авг. La respuesta se da manojlds 03 ago. 2011-08-03 02:00 '11 a las 2:00 2011-08-03 02:00

Bastante simple:

  • git rm --cached <file> hace que git detenga completamente el archivo (dejándolo en el sistema de archivos, a diferencia del simple git rm *)
  • git reset HEAD <file> cancela los cambios realizados en el archivo desde la última confirmación (pero no los devuelve al sistema de archivos, en contraste con lo que sugiere el nombre del comando **). El archivo permanece bajo control de versiones.

Si el archivo no estaba previamente en el control de versión (es decir, no formatea el archivo que solo se le había git add por primera vez), entonces los dos comandos tienen el mismo efecto, por lo tanto, la apariencia de estas "dos formas de hacer algo ".

* Tenga en cuenta que su respuesta menciona la cláusula @DrewT en relación con el archivo git rm --cached que anteriormente estaba vinculado al repositorio. En el contexto de esta pregunta, el archivo se acaba de agregar y aún no se ha corregido, no hay nada de qué preocuparse.

** Por mucho tiempo tuve miedo de usar el comando git reset por su nombre, y hoy en día a menudo miro la sintaxis para asegurarme de que no arruiné ( actualizar ): finalmente encontré el tiempo para generalizar usando git reset en la página de TL; DR , así que ahora tengo un mejor modelo mental de cómo funciona, y una breve descripción cuando olvido algunos detalles.

100
18 окт. La respuesta se da waldyrious 18 oct. 2014-10-18 00:16 '14 a las 0:16 2014-10-18 00:16

Este hilo es un poco viejo, pero todavía quiero agregar una pequeña demostración, ya que esto no es un problema intuitivo:

 me$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: to-be-added # modified: to-be-modified # deleted: to-be-removed # me$ git reset -q HEAD to-be-added # ok me$ git reset -q HEAD to-be-modified # ok me$ git reset -q HEAD to-be-removed # ok # or alternatively: me$ git reset -q HEAD to-be-added to-be-removed to-be-modified # ok me$ git status # On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: to-be-modified # deleted: to-be-removed # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # to-be-added no changes added to commit (use "git add" and/or "git commit -a") 

git reset HEAD (sin -q ) emite una advertencia sobre el archivo modificado, y su código de salida es 1, que se considerará un error en el script.

Edición: git checkout HEAD to-be-modified to-be-removed también funciona en la fase de desempaque, pero elimina completamente el cambio del área de trabajo

40
16 апр. Respuesta dada por Daniel Alder el 16 de abril. 2013-04-16 22:00 '13 a las 10 pm 2013-04-16 22:00

Si accidentalmente coloca archivos que no desea confirmar y desea asegurarse de que guarda los cambios, también puede usar:

 git stash git stash pop 

realiza un reinicio en HEAD y vuelve a aplicar los cambios, lo que le permite reorganizar archivos individuales para confirmar. esto también es útil si olvidó crear una rama de función para solicitudes de extracción ( git stash ; git checkout -b <feature> ; git stash pop ).

28
10 февр. Respuesta dada por ives el 10 de febrero. 2015-02-10 20:06 '15 a las 20:06 2015-02-10 20:06

Estos dos comandos tienen varias diferencias sutiles si este archivo ya está en el repositorio y bajo el control de la versión (previamente grabada, etc.):

  • git reset HEAD <file> desactiva el archivo en la confirmación actual.
  • git rm --cached <file> también deshabilitará el archivo para futuras confirmaciones. No se instala hasta que se agregue de nuevo con git add <file> .

Y una diferencia más importante:

  • Después de ejecutar git rm --cached <file> y hacer clic en su sucursal en la computadora remota, cualquier persona que saque su sucursal de la remota recibirá el archivo que se eliminará REALMENTE de su carpeta, aunque en su configuración de trabajo local, el archivo simplemente deja de verse ( no se elimina físicamente de la carpeta).

Esta última diferencia es importante para los proyectos que incluyen un archivo de configuración en el que cada desarrollador del equipo tiene una configuración diferente (es decir, una url base, ip o puerto diferente), por lo que si usa git rm --cached <file> , Si tira de su sucursal, tendrá que volver a crear manualmente la configuración, o puede enviársela a usted, y ellos pueden volver a editarla a su configuración de IP (etc.), porque la eliminación solo afecta al hecho de que la gente saque su sucursal con a distancia

15
10 авг. respuesta dada por DrewT 10 ago. 2014-08-10 23:04 '14 a las 23:04 2014-08-10 23:04

Supongamos que stage directorio completo a través de git add <folder> , pero desea excluir el archivo de la lista por fases (es decir, la lista que se genera cuando ejecuta el git status ) y guardar los cambios en el archivo excluido (hizo algo y no estaba listo) comprometerse, pero no quiere perder su trabajo ...). Simplemente puede utilizar:

git reset <file>

Cuando ejecute el git status , verá que cualquier archivo que reset está en unstaged , y el resto de los archivos que added todavía están en la lista por staged .

8
28 авг. respuesta dada por jiminikiz 28 ago. 2015-08-28 19:08 '15 a las 19:08 2015-08-28 19:08

1.

 D:\code\gt2>git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: a 

(use "git rm --cached ..." para la inestabilidad)

  • git es un sistema de puntero

  • No tienes ningún compromiso para cambiar el puntero a

  • La única forma de "volcar archivos del contenedor al que apunta" es eliminar los archivos que dijo git para ver los cambios.

2

 D:\code\gt2>git commit -ma [master (root-commit) c271e05] a 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a 

git commit -ma

  • te has comprometido salvado

3

 D:\code\gt2>git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: b # 

(use "git reset HEAD ..." para desconectar)

  • Has comprometido en tu código ahora
  • Ahora puede restablecer el puntero a su compromiso de nuevo a la última vez que guardó
7
08 сент. Respuesta dada por Timothy LJ Stewart 08 sep. 2016-09-08 19:26 '16 a las 7:26 pm 2016-09-08 19:26

Me sorprende que nadie haya mencionado git reflog ( http://git-scm.com/docs/git-reflog ):

 # git reflog <find the place before your staged anything> # git reset HEAD@{1} 

reflog es un historial de git que no solo realiza un seguimiento de los cambios en los repositorios, sino que también realiza un seguimiento de las acciones de los usuarios (por ejemplo, extracción, extracción en diferentes ramas, etc.) y le permite cancelar estas acciones. Por lo tanto, en lugar de descartar un archivo que se colocó por error, puede volver al punto en el que no creó los archivos.

Esto es similar a git reset HEAD <file> , pero en algunos casos puede ser más granular.

Lo siento, no respondo a su pregunta, sino simplemente señalando otro método de archivos no estacionarios que uso con bastante frecuencia (a mí, por ejemplo, me gustan las respuestas de Ryan Stewart y es muy válido). Espero que esto ayude.

5
10 февр. La respuesta la da Alex el 10 de febrero. 2015-02-10 15:06 '15 a las 15:06 2015-02-10 15:06

Me parece que git rm --cached <file> elimina el archivo del índice sin eliminarlo del directorio donde se ejecutará el simple git rm <file> , al igual que OS rm <file> elimina el archivo del directorio sin eliminar su versión.

3
06 июня '13 в 15:06 2013-06-06 15:06 la respuesta se da ernie.cordell 06 de junio de 2013 a las 15:06 2013-06-06 15:06

Para ignorar todo el directorio, use rm recursivamente (-r)

 git rm -r --cached folderpath 
0
18 окт. respuesta dada DevWL 18 de octubre 2017-10-18 22:52 '17 a las 10:52 pm 2017-10-18 22:52

Otras preguntas sobre etiquetas o Haz una pregunta