Pregunta Varias formas de eliminar los cambios locales de Git


Acabo de clonar un repositorio git y revisé una rama. Trabajé en ello, y luego decidí eliminar todos mis cambios locales, ya que quería la copia original.

En resumen, tuve que hacer los siguientes dos comandos para eliminar mis cambios locales

git checkout .

git clean -f

Mi pregunta es,

(1) ¿Es este el enfoque correcto para deshacerse de los cambios locales o, por favor, hágamelo saber el enfoque correcto?

(2) cuando usamos git reset --hard ya que soy capaz de restablecer incluso sin este comando

Gracias

* Solución: Major Edit (s): 03/26: *  Se reemplazaron muchos términos imprecisos por terminología específica de git  [rastreado / desbloqueado / por etapas / sin escena]

Podría haber solo tres categorías de archivos cuando hacemos cambios locales:

Tipo 1. Archivos seguidos por etapas

Tipo 2. Archivos rastreados sin estado

Tipo 3. Archivos sin seguimiento no rastreados a.k.a Archivos sin seguimiento

  • En etapas: los que se trasladan al área de preparación / Añadido al índice
  • Seguimiento: archivos modificados
  • UnTracked - nuevos archivos. Siempre sin escena. Si está organizado, eso significa que son rastreados.

Lo que cada comando hace:

  1. git checkout . - Elimina SOLAMENTE los archivos rastreados sin grabar [Tipo 2]

  2. git clean -f - Elimina SOLAMENTE los archivos no rastreados sin escanear [Tipo 3]

  3. git reset --hard - Elimina SÓLO los archivos de seguimiento con seguimiento en etapas y sin control [Tipo 1, Tipo 2]

  4. git stash -u - Elimina todos los cambios [Tipo 1, Tipo 2, Tipo 3]

Conclusión:

Está claro que podemos usar cualquiera

(1) combination of `git clean -f` and `git reset --hard` 

O

(2) `git stash -u`

para lograr el resultado deseado

Nota: Atasco, ya que la palabra significa 'Almacenar (algo) de forma segura y secreta en un lugar específico'. Esto siempre se puede recuperar usando git stash pop. Entonces elegir entre las dos opciones anteriores es la llamada del desarrollador.

Gracias Christoph y Frederik Schøning.

Edición: 03/27

Pensé que valía la pena poner el 'tener cuidado' nota a git clean -f

git clean -f

No hay vuelta atrás. Utilizar -n o --dry-run para previsualizar el daño que harás

Si también quieres eliminar directorios, ejecuta git clean -f -d

Si solo quieres eliminar los archivos ignorados, ejecuta git clean -f -X

Si desea eliminar archivos ignorados y no ignorados, ejecute git clean -f -x

referencia: más en git clean : ¿Cómo eliminar archivos locales (sin seguimiento) del árbol de trabajo actual de Git?

Editar: 20/05/15

Descartar todas las confirmaciones locales en esta rama [Eliminando confirmaciones locales]

Para descartar todas las confirmaciones locales en esta rama, para hacer que la rama local sea idéntica a la "corriente ascendente" de esta rama, simplemente ejecuta git reset --hard @{u}

Referencia: http://sethrobertson.github.io/GitFixUm/fixup.html

o hacer git reset --hard origin/master [si la sucursal local es master]

Nota: 12/06/2015 Esto es no un duplicado de la otra pregunta SO que está marcada como duplicada. Esta pregunta aborda cómo eliminar los cambios locales de GIT [eliminar un archivo agregado, eliminar los cambios agregados al archivo existente, etc. y los diversos enfoques; Donde en el otro SO solo se explica cómo eliminar el compromiso local. Si agregó un archivo, y desea eliminarlo solo, entonces el otro subproceso SO no analiza al respecto. Por lo tanto, esto no es un duplicado del otro]

Editar: 23/06/15

¿Cómo revertir una confirmación ya enviada a un repositorio remoto?

$ git revert ab12cd15

Editar: 01/09/2015

Eliminar una confirmación previa de la sucursal local y la sucursal remota

Caso: Usted acaba de realizar un cambio en su sucursal local e inmediatamente lo envió a la sucursal remota, De repente se dio cuenta, ¡Oh, no! No necesito este cambio. Ahora haz que?

git reset --hard HEAD~1     [para eliminar esa confirmación de la sucursal local]

git push origin HEAD --force [ambos comandos deben ser ejecutados. Para eliminar desde una rama remota]

¿Cuál es la rama? Es la rama actualmente desprotegida.

Editar 09/08/2015 - Eliminar git local unir:

Estoy en master rama y fusionada master rama con una nueva rama de trabajo phase2

$ git status
# On branch master

$ git merge phase2

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.

P: ¿Cómo deshacerse de esta fusión? Intentó git reset --hard   y git clean -d -f Ambos no funcionaron.

Lo único que trabajó son cualquiera de los siguientes:

$ git reset --hard origin/master

o

$ git reset --hard HEAD~8

o

$ git reset --hard 9a88396f51e2a068bb7  [código de confirmación de sha - este es el que estaba presente antes de que todas las confusiones de fusión ocurrieran]


568
2018-03-24 20:54


origen


Respuestas:


Todo depende exactamente de lo que intentes deshacer / revertir. Comience leyendo la publicación en el enlace de Ube. Pero para intentar una respuesta:

Hard reset

git reset --hard [HEAD]

eliminar por completo todos los cambios por etapas y sin instancia a los archivos rastreados.

A menudo me encuentro utilizando el restablecimiento completo, cuando digo "simplemente deshacer todo como si hubiera hecho una nueva clonación completa desde el control remoto". En su caso, donde solo quiere que su repositorio sea prístino, esto funcionaría.

Limpiar

git clean [-f]

Elimina los archivos que no son rastreados.

Para eliminar archivos temporales, pero mantener cambios escalonados y no supervisados ​​en archivos ya rastreados. La mayoría de las veces, probablemente terminaré haciendo una regla de ignorar en lugar de limpiar repetidamente, por ej. para las carpetas bin / obj en un proyecto de C #, que normalmente desearía excluir de su repositorio para ahorrar espacio, o algo así.

La opción -f (force) también eliminará los archivos, que no se rastrean y también están siendo ignorados por git aunque ignore-rule. En el caso anterior, con una regla de ignorar nunca para rastrear las carpetas bin / obj, aunque git las ignora, usar la opción force las eliminará de su sistema de archivos. Veo esporádicamente un uso para esto, p. al crear scripts, y quiere limpiar su código antes de implementar, comprimir o lo que sea.

Git clean no tocará los archivos, que ya están siendo rastreados.

Checkout "punto"

git checkout .

Nunca había visto esta notación antes de leer tu publicación. Me está costando encontrar documentación para esto (tal vez alguien puede ayudar), pero al jugar un poco, parece que significa:

"deshacer todos los cambios en mi árbol de trabajo".

Es decir. deshacer cambios sin registrar en los archivos rastreados. Al parecer, no toca cambios por etapas y deja archivos sin seguimiento solo.

Stashing

Algunas respuestas mencionan al escondite. Tal como lo implica la fraseología, probablemente usaría almacenamiento cuando se encuentre en medio de algo (no está listo para una confirmación), y tendrá que cambiar ramas temporalmente o de alguna manera trabajar en otro estado de su código, para luego regresar a su "desorden" escritorio". No veo que esto se aplique a tu pregunta, pero definitivamente es útil.

Para resumir

En general, si está seguro de que se ha comprometido y tal vez lo haya llevado a cambios importantes a distancia, si solo está jugando o algo similar, usando git reset --hard HEAD seguido por git clean -f definitivamente limpiará su código en el estado, estaría dentro, habría sido clonado y verificado desde una sucursal. Es muy importante enfatizar que el reinicio también eliminará los cambios por etapas pero no confirmados. Limpiará todo lo que no se haya comprometido (excepto archivos sin seguimiento, en cuyo caso, use limpiar)

Todos los otros comandos están ahí para facilitar escenarios más complejos, donde se necesita una granularidad de "deshacer cosas" :)

Creo que su pregunta número 1 está cubierta, pero, por último, para concluir en el número 2: la razón por la que nunca encontró la necesidad de usar git reset --hard fue que nunca has organizado nada. Si hubieras organizado un cambio, ni git checkout . ni git clean -f habría revertido eso.

Espero que esto cubra.


469
2018-03-24 21:57



Como con todo en git, hay múltiples formas de hacerlo. Los dos comandos que usaste son una forma de hacerlo. Otra cosa que podrías haber hecho es simplemente esconderlos git stash -u. los -u se asegura de que los archivos recién agregados (sin seguimiento) también estén incluidos.

Lo útil de git stash -u es eso

  1. es probablemente el comando más simple (¿único?) para lograr tu objetivo
  2. si cambias de opinión luego de eso obtienes todas tu trabajo de vuelta con git stash pop (es como eliminar un correo electrónico en Gmail, donde puedes deshacerlo si cambias de opinión luego)

A partir de tu otra pregunta git reset --hard no eliminará los archivos no rastreados por lo que aún necesitaría la git clean -f. Pero una git stash -u podría ser el más conveniente.


20
2018-03-24 21:10



Motivo de agregar una respuesta en este momento: 

Hasta ahora, estaba agregando la conclusión y las "respuestas" a mi pregunta inicial, haciendo que la pregunta sea muy larga, por lo tanto, pasar a una respuesta por separado.

También he agregado más comandos git frecuentemente utilizados eso me ayuda en git, para ayudar a alguien más también.

primero un paso antes de hacer cualquier commit es configurar su nombre de usuario y correo electrónico que aparece junto con su confirmación.

# Establece el nombre que desea adjuntar a sus transacciones de confirmación

$ git config --global user.name "[name]"

# Establece el correo electrónico que desea vincular a sus transacciones de confirmación

$ git config --global user.email "[email address]"

#List la configuración global

$ git config --list

#comprobar estado

git status

#List todas las sucursales locales y remotas

git branch -a

#crear una nueva sucursal local y comenzar a trabajar en esta rama

git checkout -b "branchname" 

o, se puede hacer como un proceso de dos pasos

crear una rama: git branch branchname trabajar en esta rama: git checkout branchname

#commitir cambios locales [Proceso de dos pasos: agregue el archivo al índice, lo que significa agregar al área de ensayo. A continuación, confirme los archivos que están presentes en esta área de ensayo]

git add <path to file>

git commit -m "commit message"

#checkout alguna otra rama local

git checkout "local branch name"

#remove todos los cambios en la sucursal local [Supongamos que ha realizado algunos cambios en la sucursal local, como agregar un archivo nuevo o modificar el archivo existente, o realizar una confirmación local, pero ya no es necesario] git clean -d -fy git reset --hard  [limpiar todos los cambios locales realizados en la sucursal local, excepto si el compromiso local]

git stash -u  también elimina todos los cambios

Nota: Está claro que podemos usar cualquiera (1) combinación de git clean –d –fy git reset --hard  O (2) git stash -u para lograr el resultado deseado

Nota 1: Stashing, ya que la palabra significa 'Store (something) de forma segura y secreta en un lugar específico.' Esto siempre se puede recuperar usando git stash pop. Entonces elegir entre las dos opciones anteriores es la llamada del desarrollador.

Nota 2: git reset --hard eliminará los cambios del directorio de trabajo. Asegúrese de esconder cualquier cambio local que desee conservar antes de ejecutar este comando.

# Cambiar a la rama principal y asegúrese de estar actualizado.

git checkout master

git fetch    [esto puede ser necesario (dependiendo de su configuración de git) para recibir actualizaciones sobre el origen / maestro]

git pull

# Fusionar la rama de la característica en la rama principal.

git merge feature_branch

# Restablecer la rama maestra al estado del origen.

git reset origin/master

#De hecho, borró un archivo de local, ¿cómo recuperarlo? Haz un git status para obtener la ruta de archivo completa del recurso eliminado

git checkout branchname <file path name>

¡Eso es!

#Merge rama principal con someotherbranch

git checkout master
git merge someotherbranchname

#rename local branch

git branch -m old-branch-name new-branch-name

#delete rama local 

git branch -D branch-name

#delete remote branch 

git push origin --delete branchname

o

git push origin :branch-name

#revolver una confirmación ya enviada a un repositorio remoto

git revert hgytyz4567

#branch de una confirmación previa usando GIT

git branch branchname <sha1-of-commit>

#Cambio confirmar mensaje de la confirmación más reciente que ya ha sido empujado a control remoto

git commit --amend -m "new commit message"
git push --force origin <branch-name>

# Descartar todas las confirmaciones locales en esta rama  [Eliminando confirmaciones locales]

Para descartar todas las confirmaciones locales en esta rama, para hacer que la rama local sea idéntica a la "corriente ascendente" de esta rama, simplemente ejecute

git reset --hard @{u}

Referencia: http://sethrobertson.github.io/GitFixUm/fixup.html o hacer git reset --hard origin/master [si la sucursal local es el maestro]

# ¿Revertir una confirmación ya enviada a un repositorio remoto?

$ git revert ab12cd15

#Eliminar una confirmación previa de la sucursal local y la sucursal remota

Caso de uso: Acabas de hacer un cambio en tu sucursal local e inmediatamente te empujaste a la sucursal remota. De repente, me di cuenta: ¡Oh, no! No necesito este cambio. Ahora haz que?

git reset --hard HEAD~1 [para eliminar esa confirmación de la sucursal local. 1 denota el COMPROMISO que hiciste]

git push origin HEAD --force [ambos comandos deben ser ejecutados. Para eliminar desde una rama remota]. La rama actualmente desprotegida será referida como la sucursal donde realizará esta operación.

#Eliminar algunas confirmaciones recientes del repositorio local y remoto y conservar el compromiso que desee. (una especie de invierte revertir desde local y remoto)

Supongamos que tiene 3 commits que ha enviado a una sucursal remota llamada 'develop'

commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.

Para volver a la confirmación anterior (para cambiar el estado de la sucursal)

git log --oneline --decorate --graph // para ver todos tus commitids

git clean -d -f // limpiar cualquier cambio local

git reset --hard commitid-1  // localmente volviendo a este commitid

git push -u origin +develop // presione este estado a control remoto. + forzar empuje

# Eliminar la combinación de git local: Caso: Estoy en la rama principal y fusioné la rama principal con una rama de nuevo trabajo phase2

$ git status

En la rama maestro

$ git merge phase2 $ git status

En la rama maestro

Su sucursal está por delante de 'origin / master' 8 comete

P: ¿Cómo deshacerse de esta fusión local de git? Intentó git reset --hardy git clean -d -f Ambos no funcionaron. Lo único que trabajó son cualquiera de los siguientes:

$ git reset --hard origin / master

o

$ git reset --hard HEAD ~ 8

o

$ git reset --hard 9a88396f51e2a068bb7 [código de confirmación de sha - este es el que estaba presente antes de que todas las confusiones de fusión ocurrieran]

#create gitignore file

touch .gitignore // crea el archivo en usuarios de mac o Unix

muestra contenido de .gitignore:

.project
*.py
.settings

Enlace de referencia a la hoja de trucos de GIT: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf


17
2017-09-18 21:18



1. Cuando no desea mantener sus cambios locales en absoluto.

git reset --hard

Este comando eliminará por completo todos los cambios locales de su repositorio local. Esta es la mejor manera de evitar conflictos durante el comando de extracción, solo si no desea mantener sus cambios locales.

2. Cuando quiere mantener sus cambios locales

Si desea extraer los nuevos cambios desde el control remoto y desea ignorar el cambios locales durante este tirón entonces,

git stash

Ocultará todos los cambios locales, ahora puede extraer los cambios remotos,

git pull

Ahora, puede recuperar sus cambios locales al,

git stash pop

7
2017-11-04 10:46



Utilizar:

git checkout -- <file>

Para descartar los cambios en el directorio de trabajo.


4
2018-06-26 13:57



Creo que git tiene una cosa que no está claramente documentada. Creo que en realidad fue descuidado.

git checkout .

Hombre, salvaste mi día. Siempre tengo cosas que quiero probar usando el código modificado. Pero las cosas a veces terminan estropeando el código modificado, agregan nuevos archivos sin seguimiento, etc. Entonces, lo que quiero hacer es poner en escena lo que quiero, hacer las cosas desordenadas, luego limpiar rápidamente y comprometerme si estoy contento.

Hay git clean -fd funciona bien para archivos sin seguimiento.

Entonces git reset simplemente elimina etapas, pero git checkout es demasiado engorroso Especificar el archivo uno por uno o usar directorios no siempre es ideal. A veces, los archivos modificados de los que quiero deshacerme están dentro de los directorios que quiero conservar. Deseé este comando que simplemente elimina los cambios no registrados y aquí está. Gracias.

Pero creo que deberían simplemente tener git checkout sin ninguna opción, elimine todos los cambios no registrados y no toque el escenario. Es un tanto modular e intuitivo. Más como qué git reset hace. git clean también debería hacer lo mismo.


3
2018-03-08 21:14



La mejor manera es verificar los cambios.

Cambiando el archivo pom.xml en un proyecto llamado project-name puedes hacerlo:

git status

# modified:   project-name/pom.xml

git checkout project-name/pom.xml
git checkout master

# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'

2
2018-01-15 17:01



por descartar todo Me gusta esconder y guardar ese alijo, es la forma más rápida de descartar todo, especialmente si trabajas entre varios repositorios.

Esto esconderá todos los cambios en {0} clave y al instante lo deja caer desde {0}

git stash && git stash drop


2
2018-06-27 16:26



En primer lugar, compruebe si su cambio importante está guardado o no por:

estado $ git

que tratar

$ git reset --hard

restablecerá su rama a la predeterminada

pero si solo necesitas deshacer:

$ edit (1)   $ git add frotz.c   filfre.c $ mailx (2)   $ git reset
  (3) $ git pull git: //info.example.com/ nitfol


Leer más >> https://git-scm.com/docs/git-reset


1
2017-09-21 11:02