Acabo de clonar un repositorio de git y revisé una rama. Trabajé en él 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 bien hágamelo saber el enfoque correcto?
(2) ¿cuándo utilizamos git reset --hard
ya que puedo restablecer incluso sin este comando?
Gracias
* Solución: Edición principal (es): 26/03: * Reemplazó muchos de los términos vagos con terminología específica de git [rastreado / no rastreado / escenificado / no escalonado]
Podría haber solo tres categorías de archivos cuando hacemos cambios locales:
Tipo 1. Archivos rastreados por etapas
Tipo 2. Archivos rastreados sin clasificar
Tipo 3. Archivos sin seguimiento sin clasificar, también conocidos como archivos sin seguimiento
- Escenario: aquellos que se mueven al área de ensayo / Agregados al índice
- Rastreado - archivos modificados
- Sin seguimiento: nuevos archivos. Siempre sin escena. Si se escenifica, eso significa que son rastreados.
Lo que cada comando hace:
git checkout .
- Elimina SOLAMENTE archivos rastreados sin clasificar [Tipo 2]git clean -f
- Elimina SOLAMENTE archivos sin seguimiento sin clasificar [Tipo 3]git reset --hard
- Elimina SOLAMENTE archivos rastreados y no rastreados [Tipo 1, Tipo 2]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: Escondite, 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
. Por lo tanto, elegir entre las dos opciones anteriores es una decisión del desarrollador.
Gracias Christoph y Frederik Schøning.
Editar: 27/03
Pensé que valía la pena poner la nota de " cuidado "git clean -f
git clean -f
No hay vuelta atrás. Usa -n
o --dry-run
para previsualizar el daño que harás.
Si también desea eliminar directorios, ejecute git clean -f -d
Si solo desea eliminar los archivos ignorados, ejecute git clean -f -X
Si desea eliminar archivos ignorados y no ignorados, ejecute git clean -f -x
referencia: más sobre git clean
: ¿Cómo eliminar archivos locales (sin seguimiento) del árbol de trabajo Git actual?
Editar: 20/05/15
Descartando 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 al "flujo 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 master
]
Nota: 12/06/2015 Esto no es un duplicado de la otra pregunta SO marcada como duplicada. Esta pregunta aborda cómo eliminar los cambios GIT locales [eliminar un archivo agregado, eliminar cambios agregados al archivo existente, etc. y los diversos enfoques; Donde en el otro subproceso SO solo se aborda cómo eliminar la confirmación local. Si agregó un archivo, y desea eliminarlo solo, entonces el otro hilo SO no discute al respecto. Por lo tanto, este no es un duplicado del otro]
Editar: 23/06/15
¿Cómo revertir un commit ya enviado a un repositorio remoto?
$ git revert ab12cd15
Edición: 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 empujó a la sucursal remota, De repente se dio cuenta, ¡Oh no! No necesito este cambio. Ahora haz qué?
git reset --hard HEAD~1
[por eliminar esa confirmación de la sucursal local]
git push origin HEAD --force
[ambos comandos deben ser ejecutados. Para eliminar de la rama remota]
¿Cuál es la rama? Es la rama actualmente desprotegida.
Editar 08/09/2015 - Eliminar local git merge :
Estoy en una master
rama y una rama fusionada master
con una nueva rama de trabajophase2
$ 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 funcionó fue 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 sha: este es el que estaba presente antes de que ocurrieran todas las confirmaciones de fusión]
git stash -a
[o --all] también esconderá los archivos ignorados y no rastreados. git clean -x
limpiará los archivos ignorados también. git clean -X
limpiará solo los archivos ignorados.