A veces, git sugiere git rm --cached
eliminar el escenario de un archivo, a veces git reset HEAD file
. ¿Cuándo debo 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 -m a
[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
#
git rm
ambos pueden organizar una eliminación y también eliminar una adición )rm
deshaceradd
? ¿Cómo crees querm
debería comportarse?git init
no hayHEAD
que restablecer.rm
implica eliminación en un contexto unix. No es lo contrario de agregar al índice. Una función para eliminar archivos no debe sobrecargarse con funciones para cambiar el estado de preparación. Si hay detalles de implementación que hacen que sea conveniente combinarlos, eso simplemente señala la falta de una capa reflexiva de abstracción en git, lo que aclararía la usabilidad.Respuestas:
git rm --cached <filePath>
no desestabiliza un archivo, en realidad realiza la eliminación de los archivos del repositorio (suponiendo que ya se haya confirmado antes) pero deja el archivo en su árbol de trabajo (dejándolo con un archivo sin seguimiento).git reset -- <filePath>
se unstage cualquier organizaron cambios para el archivo (s) dado.Dicho esto, si usaste
git rm --cached
un nuevo archivo que está en escena, básicamente parecería que lo has desarmado ya que nunca antes se había confirmado.Actualice git 2.24
En esta nueva versión de git puede usar en
git restore --staged
lugar degit reset
. Ver git docs .fuente
git rm --cached
desestabiliza el archivo pero no lo elimina del directorio de trabajo.git rm --cached <filePath>
para eliminar algunos archivos del repositorio después de darse cuenta de que nunca debería haber estado en el repositorio: lo más probable es que ejecute este comando y luego agregue los archivos relevantesgitignore
. ¿Estoy en lo correcto?unstage
comandogit
.git rm --cached
se usa 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 una confirmación ahora también lo eliminará del repositorio. Básicamente, después de la confirmación, habría desversionado el archivo y mantenido una copia local.git reset HEAD file
(que de forma predeterminada está usando el--mixed
indicador) es diferente en el caso de que el archivo ya esté en el repositorio, reemplaza la versión de índice del archivo con la del repositorio (HEAD), eliminando efectivamente las modificaciones .En el caso de un archivo no versionado, va a quitar el escenario del archivo completo ya que el archivo no estaba allí en el HEAD. En este aspecto
git reset HEAD file
ygit rm --cached
son iguales, pero no son iguales (como se explica en el caso de los archivos que ya están en el repositorio)A la pregunta de
Why are there 2 ways to unstage a file in git?
: nunca hay realmente una sola forma de hacer algo en git. esa es la belleza de eso :)fuente
there is never really only one way to do anything in git. that is the beauty of it
- Hmm por que ? siempre es genial, cuando solo hay una manera obvia. esto ahorra mucho tiempo y memoria en el cerebro))Muy simple:
git rm --cached <file>
hace que git deje de rastrear el archivo por completo (dejándolo en el sistema de archivos, a diferencia de simplegit rm
*)git reset HEAD <file>
elimina las modificaciones realizadas en el archivo desde la última confirmación (pero no las revierte en el sistema de archivos, al contrario de lo que el nombre del comando podría sugerir **). El archivo permanece bajo control de revisión.Si el archivo no estaba en control de revisión antes (es decir, está desestabilizando un archivo que acababa de editar
git add
por primera vez), entonces los dos comandos tienen el mismo efecto, de ahí la apariencia de que son "dos formas de hacer algo ".* Tenga en cuenta la advertencia que @DrewT menciona en su respuesta, con respecto
git rm --cached
a un archivo que se había enviado previamente al repositorio. En el contexto de esta pregunta, de un archivo que se acaba de agregar y aún no se ha confirmado, no hay nada de qué preocuparse.** Tenía miedo por un tiempo vergonzosamente largo de usar el comando git reset debido a su nombre, y aún hoy a menudo busco la sintaxis para asegurarme de no equivocarme. ( actualización : finalmente me tomé el tiempo para resumir el uso de
git reset
en una página tldr , así que ahora tengo un mejor modelo mental de cómo funciona, y una referencia rápida para cuando olvide algunos detalles).fuente
git rm <file> --cached
rm --cached
y empuja, cualquiera que tire de la misma rama tendrá los archivos realmente eliminados de su árbol de trabajo.Este hilo es un poco viejo, pero todavía quiero agregar una pequeña demostración ya que todavía no es un problema intuitivo:
git reset HEAD
(sin-q
) da una advertencia sobre el archivo modificado y su código de salida es 1, que se considerará como un error en un script.Editar:
git checkout HEAD to-be-modified to-be-removed
también funciona para desestabilizar, pero elimina el cambio por completo del espacio de trabajoActualización git 2.23.0: de vez en cuando, los comandos cambian. Ahora
git status
dice:... que funciona para los tres tipos de cambio
fuente
si accidentalmente organizó archivos que no le gustaría confirmar y desea asegurarse de mantener los cambios, también puede usar:
Esto realiza un restablecimiento a HEAD y vuelve a aplicar sus cambios, lo que le permite volver a organizar los archivos individuales para la confirmación. Esto también es útil si ha olvidado crear una rama de características para solicitudes de extracción (
git stash ; git checkout -b <feature> ; git stash pop
).fuente
git stash
tiene otros beneficios relacionados, porque crea entradas en el registro que luego estarán disponibles en el futuro. en caso de duda, continúe y haga ungit stash
(p. ej.git stash save -u "WIP notes to self"
(la '-u' es incluir cualquier archivo nuevo / no rastreado en el stash commit) ... luego intentegit reflog show stash
ver la lista de stash commits y sus sha's. Recomiendo un shell alias comoalias grs="git reflog show stash"
Estos 2 comandos tienen varias diferencias sutiles si el archivo en cuestión ya está en el repositorio y bajo control de versión (previamente comprometido, etc.):
git reset HEAD <file>
desestabiliza el archivo en la confirmación actual.git rm --cached <file>
también quitará el escenario del archivo para futuras confirmaciones. No está en escena hasta que se agrega nuevamentegit add <file>
.Y hay una diferencia más importante:
git rm --cached <file>
y empujar su rama al control remoto, cualquier persona que extraiga su rama del control remoto eliminará REALMENTE el archivo de su carpeta, aunque en su conjunto de trabajo local el archivo simplemente no se rastrea (es decir, no se elimina físicamente de la carpeta).Esta última diferencia es importante para proyectos que incluyen un archivo de configuración en el que cada desarrollador del equipo tiene una configuración diferente (es decir, una configuración base de URL, IP o puerto diferente), por lo que si está utilizando a
git rm --cached <file>
alguien que extraiga su rama, tendrá que volver a cree la configuración, o puede enviarles la suya y pueden volver a editarla a su configuración de IP (etc.), porque la eliminación solo afecta a las personas que extraen su rama del control remoto.fuente
Supongamos que utiliza
stage
un directorio completogit add <folder>
, pero desea excluir un archivo de la lista por etapas (es decir, la lista que se genera cuando se ejecutagit status
) y mantener las modificaciones dentro del archivo excluido (estaba trabajando en algo y no está listo para la confirmación, pero no quieres perder tu trabajo ...). Simplemente podrías usar:git reset <file>
Cuando corras
git status
, verás que cualesquiera que sean los archivos quereset
eresunstaged
y el resto de los archivos queadded
se encuentran todavía en lastaged
lista.fuente
1)
(use "git rm --cached ..." para quitar el escenario)
git es un sistema de punteros
aún no tiene una confirmación para cambiar su puntero a
la única forma de 'sacar archivos del cubo al que se apunta' es eliminar los archivos que le dijiste a git que esté atento a los cambios
2)
git commit -ma
3)
(use "git reset HEAD ..." para quitar el escenario)
fuente
git init
por primera vez.Me sorprende que nadie haya mencionado el git reflog ( http://git-scm.com/docs/git-reflog ):
El reflog es un historial de git que no solo rastrea los cambios en el repositorio, sino que también rastrea las acciones del usuario (por ejemplo, pull, checkout a una rama diferente, etc.) y permite deshacer esas acciones. Entonces, en lugar de quitar el escenario del archivo que se preparó por error, donde puede volver al punto en el que no organizó los archivos.
Esto es similar
git reset HEAD <file>
pero en ciertos casos puede ser más granular.Lo siento, no estoy respondiendo realmente a tu pregunta, pero solo estoy señalando otra forma de eliminar el contenido de los archivos que uso con bastante frecuencia (por mi parte, me gustan las respuestas de Ryan Stewart y waldyrious). Espero que sea útil.
fuente
Solo usa:
git reset HEAD <filename>
Esto desestabiliza el archivo y mantiene los cambios que le hizo, por lo que puede, a su vez, cambiar las ramas si lo desea y
git add
esos archivos a otra rama. Todos los cambios se mantienen.fuente
Me parece que
git rm --cached <file>
elimina el archivo del índice sin eliminarlo del directorio donde un planogit rm <file>
haría ambas cosas, al igual que un sistema operativorm <file>
eliminaría el archivo del directorio sin eliminar su versión.fuente
Solo para las versiones 2.23 y superiores,
En lugar de estas sugerencias, puede usarlas
git restore --staged <file>
paraunstage
los archivos.fuente
--stage
como con--staged
.