modificados - ver cambios en un archivo git
¿Cómo descarto los cambios no escalonados en Git? (30)
¿Cómo descarto los cambios en mi copia de trabajo que no están en el índice?
A medida que escribe git status ( se muestra "git checkout - ..." para descartar los cambios en el directorio de trabajo) .
eg git checkout -- .
Como ninguna respuesta sugiere la combinación de opciones exacta que utilizo, aquí está:
git clean -dfx
git checkout .
Este es el texto de ayuda en línea para las opciones de git clean
utilizadas:
-d
Elimine directorios sin seguimiento además de los archivos sin seguimiento. Si un directorio sin seguimiento es administrado por un repositorio Git diferente, no se elimina de forma predeterminada. Utilice la opción -f
dos veces si realmente desea eliminar dicho directorio.
-f
Si la variable de configuración de Git clean.requireForce
no se establece en false
, Git clean se negará a eliminar archivos o directorios a menos que se indique -f
, -n
o -i
. Git rechazará eliminar directorios dentro del subdirectorio o archivo .git
, a menos que se proporcione una segunda -f
.
-x
No use las reglas de ignorar de .gitignore
(por directorio) y $GIT_DIR/info/exclude
, pero siga usando las reglas de ignorar dadas con las opciones -e
. Esto permite eliminar todos los archivos sin seguimiento, incluidos los productos de compilación. Se puede usar (posiblemente junto con git reset
) para crear un directorio de trabajo prístino para probar una construcción limpia.
Además, git checkout .
Debe hacerse en la raíz del repositorio.
Cuando quieras transferir un alijo a otra persona:
# add files
git add .
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff
[editar] como se comentó, es posible nombrar escondites. Bueno, usa esto si quieres compartir tu alijo;)
En lugar de descartar los cambios, restablezco mi control remoto al origen. Nota: este método es restaurar completamente su carpeta a la del repositorio.
Así que hago esto para asegurarme de que no estén sentados allí cuando reinicie la configuración (más tarde, excluye gitignores en el Origen / nombre de la rama)
NOTA: Si desea mantener los archivos que aún no se han rastreado, pero no en GITIGNORE, es posible que desee omitir este paso, ya que borrará estos archivos sin seguimiento que no se encuentran en su repositorio remoto (gracias @XtrmJosh).
git add --all
Entonces yo
git fetch --all
Entonces reinicio a origen
git reset --hard origin/branchname
Eso lo volverá a poner al cuadrado. Al igual que al volver a clonar la rama, MIENTRAS mantengo todos mis archivos de gitignored localmente y en su lugar.
Actualizado por comentario del usuario a continuación: Variación para restablecer la rama actual en la que se encuentre el usuario.
git reset --hard @{u}
En mi opinión,
git clean -df
debe hacer el truco Según la documentación de Git en git clean
git-clean - Elimina los archivos sin seguimiento del árbol de trabajo
Descripción
Limpia el árbol de trabajo mediante la eliminación recursiva de archivos que no están bajo el control de versiones, comenzando desde el directorio actual.
Normalmente, solo se eliminan los archivos desconocidos para Git, pero si se especifica la opción -x, también se eliminan los archivos ignorados. Esto puede, por ejemplo, ser útil para eliminar todos los productos de compilación.
Si se proporcionan argumentos opcionales ..., solo se verán afectadas esas rutas.
Opciones
-d Elimina los directorios sin seguimiento además de los archivos sin seguimiento. Si un directorio sin seguimiento es administrado por un repositorio Git diferente, no se elimina de forma predeterminada. Utilice la opción -f dos veces si realmente desea eliminar dicho directorio.
-f --force Si la variable de configuración de Git clean.requireForce no se establece en falso, git clean se negará a ejecutarse a menos que se indique -f, -n o -i.
Esto funciona incluso en directorios que son; fuera de los permisos normales de git.
sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx
Me ha pasado recientemente
Esto verifica el índice actual del directorio actual, eliminando todos los cambios en los archivos desde el directorio actual hacia abajo.
git checkout .
o esto, que extrae todos los archivos del índice, sobrescribiendo los archivos del árbol de trabajo.
git checkout-index -a -f
La forma más fácil de hacer esto es usando este comando:
Este comando se usa para descartar cambios en el directorio de trabajo -
git checkout -- .
https://git-scm.com/docs/git-checkout
En el comando git, la ocultación de archivos sin seguimiento se logra mediante el uso de:
git stash -u
Lo que sigue es realmente solo una solución si está trabajando con una bifurcación de un repositorio donde se sincroniza regularmente (por ejemplo, solicitud de extracción) con otro repositorio. Respuesta corta: elimine fork y refork, pero lea las advertencias en github .
Tuve un problema similar, quizás no idéntico, y lamento decir que mi solución no es ideal, pero en última instancia es efectiva.
A menudo tendría mensajes de estado de git como este (que involucran al menos 2/4 archivos):
$ git status
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
# modified: doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
# modified: doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats
Un ojo atento observará que estos archivos tienen dopplegangers que son una sola letra en caso de apagado. De alguna manera, y no tengo idea de lo que me llevó por este camino para comenzar (ya que no estaba trabajando con estos archivos desde el repositorio ascendente), había cambiado estos archivos. Pruebe las muchas soluciones enumeradas en esta página (y otras páginas) que no parecieron ayudar.
Pude solucionar el problema eliminando mi repositorio bifurcado y todos los repositorios locales, y reforzando. Esto solo no era suficiente; upstream tuvo que cambiar el nombre de los archivos en cuestión a nuevos nombres de archivo. Siempre y cuando no tenga ningún trabajo no comprometido, no haya wikis y no haya problemas que divergan del repositorio anterior, debería estar bien. Upstream puede no estar muy feliz contigo, por decir lo menos. En cuanto a mi problema, es sin duda un error del usuario, ya que no soy muy competente con git, pero el hecho de que esté lejos de ser fácil de solucionar apunta a un problema con git también.
Mi favorito es
git checkout -p
Eso le permite revertir selectivamente trozos.
Ver también:
git add -p
Ninguna de las soluciones funciona si acaba de cambiar los permisos de un archivo (esto es en DOS / Windoze)
Mon 23/11/2015-15:16:34.80 C:/.../work/checkout/slf4j+> git status On branch SLF4J_1.5.3 Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: .gitignore modified: LICENSE.txt modified: TODO.txt modified: codeStyle.xml modified: pom.xml modified: version.pl no changes added to commit (use "git add" and/or "git commit -a") Mon 23/11/2015-15:16:37.87 C:/.../work/checkout/slf4j+> git diff diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/LICENSE.txt b/LICENSE.txt old mode 100644 new mode 100755 diff --git a/TODO.txt b/TODO.txt old mode 100644 new mode 100755 diff --git a/codeStyle.xml b/codeStyle.xml old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml old mode 100644 new mode 100755 diff --git a/version.pl b/version.pl old mode 100644 new mode 100755 Mon 23/11/2015-15:16:45.22 C:/.../work/checkout/slf4j+> git reset --hard HEAD HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore Mon 23/11/2015-15:16:47.42 C:/.../work/checkout/slf4j+> git clean -f Mon 23/11/2015-15:16:53.49 C:/.../work/checkout/slf4j+> git stash save -u Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore Mon 23/11/2015-15:17:00.40 C:/.../work/checkout/slf4j+> git stash drop Dropped refs/stash@{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd) Mon 23/11/2015-15:17:06.75 C:/.../work/checkout/slf4j+> git stash drop Dropped refs/stash@{0} (e6c49c470f433ce344e305c5b778e810625d0529) Mon 23/11/2015-15:17:08.90 C:/.../work/checkout/slf4j+> git stash drop No stash found. Mon 23/11/2015-15:17:15.21 C:/.../work/checkout/slf4j+> git checkout -- . Mon 23/11/2015-15:22:00.68 C:/.../work/checkout/slf4j+> git checkout -f -- . Mon 23/11/2015-15:22:04.53 C:/.../work/checkout/slf4j+> git status On branch SLF4J_1.5.3 Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: .gitignore modified: LICENSE.txt modified: TODO.txt modified: codeStyle.xml modified: pom.xml modified: version.pl no changes added to commit (use "git add" and/or "git commit -a") Mon 23/11/2015-15:22:13.06 C:/.../work/checkout/slf4j+> git diff diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/LICENSE.txt b/LICENSE.txt old mode 100644 new mode 100755 diff --git a/TODO.txt b/TODO.txt old mode 100644 new mode 100755 diff --git a/codeStyle.xml b/codeStyle.xml old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml old mode 100644 new mode 100755 diff --git a/version.pl b/version.pl old mode 100644 new mode 100755
La única forma de solucionar este problema es restablecer manualmente los permisos en los archivos modificados:
Mon 23/11/2015-15:25:43.79 C:/.../work/checkout/slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A Mon 23/11/2015-15:25:55.37 C:/.../work/checkout/slf4j+> git status On branch SLF4J_1.5.3 nothing to commit, working directory clean Mon 23/11/2015-15:25:59.28 C:/.../work/checkout/slf4j+> Mon 23/11/2015-15:26:31.12 C:/.../work/checkout/slf4j+> git diff
No importa en qué estado se encuentre su repositorio, siempre puede restablecer cualquier confirmación previa:
git reset --hard <commit hash>
Esto descartará todos los cambios que se hicieron después de ese compromiso.
Otra forma de deshacerse de los archivos nuevos que es más específico que git clean -df (le permitirá deshacerse de algunos archivos, no necesariamente todos), es agregar los nuevos archivos al índice primero, luego esconderlos y luego soltarlos. alijo.
Esta técnica es útil cuando, por alguna razón, no puedes eliminar fácilmente todos los archivos sin seguimiento por algún mecanismo ordinario (como rm).
Otra forma más rápida es:
git stash save --keep-index --include-untracked
No necesita incluir --include-untracked
si no quiere ser exhaustivo al respecto.
Después de eso, puedes eliminar ese alijo con un comando git stash drop
si lo deseas.
Para todos los archivos sin etapas usar:
git checkout -- .
Para un uso específico del archivo:
git checkout path/to/file/to/revert
Asegúrate de incluir el período al final.
Parece que la solución completa es:
git clean -df
git checkout -- .
git-scm.com/docs/git-clean elimina todos los archivos sin seguimiento ( advertencia : aunque no eliminará los archivos ignorados mencionados directamente en .gitignore, puede eliminar los archivos ignorados que residen en las carpetas ) y git checkout
borra todos los cambios no programados.
Podría crear su propio alias que describa cómo hacerlo de manera descriptiva.
Uso el siguiente alias para descartar los cambios.
Descartar cambios en una (lista de) archivo (s) en el árbol de trabajo
discard = checkout --
Luego puedes usarlo como al lado para descartar todos los cambios:
discard .
O simplemente un archivo:
discard filename
De lo contrario, si desea descartar todos los cambios y también los archivos sin seguimiento, utilizo una combinación de verificación y limpieza:
Limpie y descarte los cambios y los archivos sin seguimiento en el árbol de trabajo
cleanout = !git clean -df && git checkout -- .
Así que el uso es simple como el siguiente:
cleanout
Ahora está disponible en el próximo repositorio de Github que contiene muchos alias:
Probé todas las soluciones anteriores, pero aún así no pude deshacerme de los archivos nuevos y sin etapas.
Utilice git clean -f
para eliminar esos archivos nuevos, aunque con precaución. Tenga en cuenta la opción de fuerza.
Puedes usar git stash: si algo sale mal, puedes retroceder desde el alijo. Similar a alguna otra respuesta aquí, pero esta también elimina todos los archivos no organizados y también todas las eliminaciones no organizadas:
git add .
git stash
Si comprueba que todo está bien, tire el alijo:
git stash drop
La respuesta de Bilal Maqsood con git clean
también funcionó para mí, pero con el alijo tengo más control: si hago algo accidentalmente, todavía puedo recuperar mis cambios.
ACTUALIZAR
Creo que hay 1 cambio más (no sé por qué esto me funcionó antes):
git add . -A
git add . -A
lugar de git add .
sin el -A
los archivos eliminados no serán almacenados
Realmente encontré este artículo útil para explicar cuándo usar qué comando: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
Hay un par de casos diferentes:
Si no has preparado el archivo, entonces utilizas
git checkout
. Checkout "actualiza los archivos en el árbol de trabajo para que coincida con la versión en el índice". Si los archivos no se han almacenado (también se agregó al índice) ... este comando esencialmente revertirá los archivos a lo que fue su última confirmación.git checkout -- foo.txt
Si ha preparado el archivo, use git reset. Restablecer cambia el índice para que coincida con un compromiso.
git reset -- foo.txt
Sospecho que usar git stash
es una opción popular ya que es un poco menos peligroso. Siempre puede volver a él si accidentalmente sopla demasiado lejos al usar git reset. El reinicio es recursivo por defecto.
Echa un vistazo al artículo de arriba para más consejos.
Si está en caso de submódulo y no funciona ninguna otra solución intente:
Para verificar cuál es el problema (tal vez un caso "sucio") use:
git diff
Para eliminar el alijo
git submodule update
Si no está interesado en mantener los cambios sin etapas (especialmente si los cambios en etapas son archivos nuevos), encontré esto a mano:
git diff | git apply --reverse
Si simplemente desea eliminar los cambios a los archivos existentes , use checkout
( https://git-scm.com/docs/git-checkout ).
git checkout -- .
- No se especifica ninguna rama, por lo que comprueba la rama actual.
- El guión doble (
--
) le dice a Git que lo que sigue se debe tomar como su segundo argumento (ruta), que se saltó la especificación de una rama. - El punto (
.
) Indica todos los caminos.
Si desea eliminar los archivos agregados desde su última confirmación, use clean
( git-scm.com/docs/git-clean ):
git clean -i
- La opción
-i
inicia unaclean
interactiva, para evitar eliminaciones erróneas. - Un puñado de otras opciones están disponibles para una ejecución más rápida; Consulte la documentación.
Si desea mover los cambios a un espacio de espera para un acceso posterior , use el stash
( documentado aquí ):
git stash
- Todos los cambios se moverán al Stash de Git, para un posible acceso posterior.
- Un puñado de opciones están disponibles para un ocultamiento más matizado; Consulte la documentación.
Si todos los archivos almacenados se confirmaron, la rama se puede restablecer, por ejemplo, desde su GUI con aproximadamente tres clics del ratón: Rama , Restablecer , ¡ Sí !
Entonces, lo que a menudo hago en la práctica para revertir cambios locales no deseados es cometer todo lo bueno y luego restablecer la rama.
Si lo bueno se confirma en un solo compromiso, entonces puede usar "enmendar el último compromiso" para volver a tenerlo en escena o sin etapas si finalmente desea cometerlo de manera diferente.
Puede que esta no sea la solución técnica que busca para su problema, pero me parece una solución muy práctica. Le permite descartar los cambios no programados de forma selectiva, restablecer los cambios que no le gustan y mantener los que hace.
Entonces, en resumen, simplemente hago confirmaciones , reinicio de bifurcaciones y enmiendas de la última confirmación
Solo usa:
git stash -u
Hecho. Fácil.
Si realmente te importa tu pila de alijo, entonces puedes seguir con el git stash drop
. Pero en ese momento es mejor usar (de Mariusz Nowak):
git checkout -- .
git clean -df
Sin embargo, me gusta git stash -u
el mejor porque "descarta" todos los cambios rastreados y no rastreados en un solo comando . Sin embargo, git checkout -- .
solo descarta los cambios rastreados, y git clean -df
solo descarta los cambios git clean -df
... y escribir ambos comandos es demasiado trabajo :)
Tuve una situación extraña en la que un archivo no está en fase, esto me ayuda a resolverlo.
git rm .gitattributes
git añadir -A
git reset - hard
simplemente di
git stash
Se eliminarán todos los cambios locales. También puedes usar más tarde diciendo
git stash apply
o git stash pop
git checkout -f
man git-checkout
:
-f, --force
Al cambiar de rama, proceda incluso si el índice o el árbol de trabajo difieren de HEAD. Esto se utiliza para tirar los cambios locales.
Al retirar las rutas del índice, no falle en las entradas no combinadas; en cambio, las entradas no combinadas se ignoran.
cd path_to_project_folder # take you to your project folder/working directory
git checkout . # removes all unstaged changes in working directory
git clean -df
Limpia el árbol de trabajo mediante la eliminación recursiva de archivos que no están bajo el control de versiones, comenzando desde el directorio actual.
-d
: eliminar directorios sin seguimiento además de los archivos sin seguimiento
-f
: Fuerza (podría no ser necesario dependiendo de la configuración de clean.requireForce
)
Ejecuta git help clean
para ver el manual.