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.Respuestas:
Todo depende de exactamente lo que está intentando deshacer / revertir. Comience leyendo la publicación en el enlace de Ube . Pero para intentar una respuesta:
Restablecimiento completo
elimine por completo todos los cambios organizados y no almacenados en los archivos rastreados.
A menudo me encuentro usando el restablecimiento completo, cuando estoy como "simplemente deshago todo como si hubiera hecho una re-clonación completa desde el control remoto". En su caso, donde solo quiere su repositorio prístino, esto funcionaría.
Limpiar
Eliminar archivos que no se rastrean.
Para eliminar archivos temporales, pero mantenga los cambios organizados y sin clasificar en archivos ya rastreados. La mayoría de las veces, probablemente terminaría haciendo una regla de ignorar en lugar de limpiar repetidamente, por ejemplo, para las carpetas bin / obj en un proyecto de C #, que generalmente querría excluir de su repositorio para ahorrar espacio, o algo así.
La opción -f (force) también eliminará archivos, que no se rastrean y que git también ignora aunque ignore-rule. En el caso anterior, con una regla de ignorar para nunca rastrear las carpetas bin / obj, a pesar de que git ignora estas carpetas, el uso de la opción force las eliminará de su sistema de archivos. He visto un uso esporádico para esto, por ejemplo, al implementar scripts, y desea limpiar su código antes de implementar, comprimir o lo que sea.
Git clean no tocará los archivos que ya están siendo rastreados.
Pago "punto"
En realidad nunca había visto esta notación antes de leer tu publicación. Me resulta difícil encontrar documentación para esto (tal vez alguien pueda ayudarme), pero al jugar un poco, parece que significa:
"deshacer todos los cambios en mi árbol de trabajo".
Es decir, deshacer los cambios no organizados en los archivos rastreados. Aparentemente no toca los cambios por etapas y deja solo los archivos sin seguimiento.
Escondite
Algunas respuestas mencionan escondite. Como lo indica la redacción, probablemente usaría el escondite cuando esté en medio de algo (no está listo para una confirmación), y tendrá que cambiar temporalmente las ramas o de alguna manera trabajar en otro estado de su código, más tarde para volver a su "desorden" escritorio". No veo que esto se aplique a su pregunta, pero definitivamente es útil.
Para resumir
En general, si está seguro de haberse comprometido y tal vez haya presionado a cambios importantes remotos, si solo está jugando o algo similar, el uso
git reset --hard HEAD
seguido degit clean -f
limpiará definitivamente su código al estado, estaría en, si hubiera sido clonado y desprotegido de una sucursal. Es realmente importante enfatizar que el restablecimiento también eliminará los cambios por etapas, pero no confirmados. Borrará todo lo que no se haya confirmado (excepto los archivos no rastreados, en cuyo caso, use clean ).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. ° 1 está cubierta, pero finalmente, para concluir en el n. ° 2: la razón por la que nunca encontró la necesidad de usar
git reset --hard
fue porque nunca había organizado nada. Si hubieras realizado un cambio,git checkout .
nigit clean -f
lo hubieras revertido.Espero que esto cubra.
fuente
git reset --hard
. Lo probé, y sí ... esos archivos agregados al índice (puesta en escena) se eliminaron solo despuésgit reset --hard
, y supongo que por defectogit reset --hard
esgit reset --hard head
. Este enlace también fue útil gitready.com/beginner/2009/01/18/the-staging-area.htmlgit stash -u
tiene más sentido aquí.git stash -u
hace y cómo reventarlo, pero Frederik me hizo saber restablecer completamente y usar la combinación degit reset --hard
ygit clean -f
, y por qué no,stash
se prefiere en algunos escenarios. Ahora, por favor, ayúdame a elegir cuál debo marcar como Respuesta :), ambas son mis respuestas..
es una especificación de ruta que se refiere al directorio de trabajo actual, que podría ser la raíz del repositorio. Desde git-scm.com:git checkout [<tree-ish>] [--] <pathspec>…
actualiza las rutas nombradas en el árbol de trabajo desde el archivo de índice o desde un <tree-ish> nombrado.git reset --hard
ygit clean -dfx
similares son destructivos . De todos modos, corrija la letra minúsculahead
en la respuesta, debe estar en mayúsculaHEAD
o no estar presente en absoluto.Motivo para agregar una respuesta en este momento:
Hasta ahora estaba agregando la conclusión y las 'respuestas' a mi pregunta inicial en sí, haciendo que la pregunta fuera muy larga y, por lo tanto, pasé a una respuesta separada.
También he agregado los comandos git más utilizados que me ayudan en git, para ayudar a alguien más también.
Básicamente para limpiar todos los compromisos locales
$ git reset --hard
y$ git clean -d -f
El primer paso antes de realizar cualquier confirmación 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
# Configura el correo electrónico que desea adjuntar a sus transacciones de confirmación
# Listar la configuración global
# Listar la URL remota
#comprobar estado
# Enumere todas las sucursales locales y remotas
#crear una nueva sucursal local y comenzar a trabajar en esta sucursal
o, se puede hacer como un proceso de dos pasos
crear rama:
git branch branchname
trabajar en esta rama:git checkout branchname
#commitir cambios locales [proceso de dos pasos: - Agregue el archivo al índice, eso significa agregar al área de preparación. Luego confirme los archivos que están presentes en esta área de preparación]
#checkout alguna otra sucursal local
#remover todos los cambios en la sucursal local [Suponga que realizó algunos cambios en la sucursal local, como agregar un archivo nuevo o modificar un archivo existente, o realizar una confirmación local, pero ya no lo necesita]
git clean -d -f
ygit reset --hard
[limpiar todos los cambios locales realizados en la sucursal local, excepto si compromiso local]git stash -u
también elimina todos los cambiosNota: Está claro que podemos usar (1) combinación de
git clean –d –f
ygit reset --hard
OR (2)git stash -u
para lograr el resultado deseado.Nota 1: Almacenamiento, ya que la palabra significa 'Almacenar (algo) de forma segura y secreta en un lugar específico'. Esto siempre se puede recuperar utilizando git stash pop. Por lo tanto, elegir entre las dos opciones anteriores es una decisión del desarrollador.
Nota 2:
git reset --hard
eliminará los cambios en el directorio de trabajo. Asegúrese de guardar los cambios locales que desee conservar antes de ejecutar este comando.# Cambie a la rama maestra y asegúrese de estar actualizado.
git fetch
[esto puede ser necesario (dependiendo de su configuración de git) para recibir actualizaciones sobre origen / maestro]# Combinar la rama de la función en la rama maestra.
# Restablece la rama maestra al estado de origen.
# Eliminó accidentalmente un archivo local, ¿cómo recuperarlo? Haga una
git status
para obtener la ruta de archivo completa del recurso eliminado¡Eso es!
# Combinar rama maestra con otra rama
#rename sucursal local
# eliminar sucursal local
#delete sucursal remota
o
#revertir un commit ya enviado a un repositorio remoto
# ramificación de un commit anterior usando GIT
# Mensaje de confirmación de cambio de la confirmación más reciente que ya se ha enviado a control remoto
# 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
Referencia: http://sethrobertson.github.io/GitFixUm/fixup.html o do
git reset --hard origin/master
[si la sucursal local es maestra]# ¿Revertir un commit ya enviado a un repositorio remoto?
# Eliminar una confirmación anterior de la sucursal local y la sucursal remota
Caso de uso: 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 ese commit de la sucursal local. 1 denota el compromiso UNO que hiciste]git push origin HEAD --force
[ambos comandos deben ser ejecutados. Para eliminar de la rama remota]. La rama actualmente desprotegida se denominará la rama donde está realizando esta operación.# Elimine algunas de las confirmaciones recientes del repositorio local y remoto y conserve la confirmación que desee. (una especie de revertir confirmaciones de local y remota)
Supongamos que tiene 3 confirmaciones que ha enviado a la rama remota llamada '
develop
'Para volver a la confirmación anterior (para cambiar el estado de la rama)
git log --oneline --decorate --graph
// para ver todos tus commitidsgit clean -d -f
// limpia cualquier cambio localgit reset --hard commitid-1
// volviendo localmente a este commitidgit push -u origin +develop
// empuja este estado a remoto. + para forzar el empuje# Eliminar la fusión local de git: Caso: estoy en la rama maestra y la rama maestra fusionada con una rama de trabajo nueva fase2
En el maestro de sucursal
$ git merge phase2
$ git status
En el maestro de sucursal
Su rama está por delante de 'origen / maestro' por 8 confirmaciones.
P: ¿Cómo deshacerse de esta fusión local de git? Intenté
git reset --hard
ygit clean -d -f
Ambos no funcionaron. Lo único que funcionó fue cualquiera de los siguientes:$ git reset - origen duro / maestro
o
$ git reset --HAD 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]#create el archivo gitignore
touch .gitignore
// crea el archivo en usuarios de mac o unixmuestra de contenidos .gitignore:
Enlace de referencia a la hoja de trucos de GIT: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf
fuente
git push origin :branch-name
sin embargo, recomiendo usargit push origin --delete branchname
Como con todo en git, hay múltiples formas de hacerlo. Los dos comandos que usó son una forma de hacerlo. Otra cosa que podrías haber hecho es simplemente esconderlos
git stash -u
. Esto-u
asegura que también se incluyan los archivos recién agregados (sin seguimiento).Lo práctico
git stash -u
es quegit stash pop
(es como eliminar un correo electrónico en gmail donde puede deshacerlo si cambia de opinión después)A partir de su otra pregunta
git reset --hard
no eliminará los archivos sin seguimiento por lo que sería todavía necesita elgit clean -f
. Pero agit stash -u
podría ser lo más conveniente.fuente
git reset --hard
no eliminará sin seguimiento archivos de hecho, sino que se retire cambios sin seguimiento, es decir, cambios en los archivos que ya están en el índice. Estoy seguro de que eso es lo quegit stash -u
, vi esta respuesta de git bash. "Directorio de trabajo guardado y estado de índice WIP en {branchname}. Puede que este guardado sea lo que podríamos recuperar usandogit stash pop
.git stash -u
hace y cómo reventarlo, pero Frederik me hizo saber cómo reiniciar y usar la combinación degit reset --hard
ygit clean -f
, y por qué no,stash
se prefiere en algunos escenarios. Ahora, por favor, ayúdame a elegir cuál debo marcar como Respuesta :), ambas son mis respuestas.1. Cuando no desea mantener sus cambios locales en absoluto.
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 conservar los cambios locales.
2. Cuando quieres mantener tus cambios locales
Si desea extraer los nuevos cambios desde el control remoto y desea ignorar los cambios locales durante esta extracción, entonces,
Guardará todos los cambios locales, ahora puede extraer los cambios remotos,
Ahora, puede recuperar sus cambios locales,
fuente
git reset --hard
no elimina todos los cambios locales. Solo elimina las modificaciones. Si desea eliminar las adiciones, también debe hacerlogit clean -fd
Utilizar:
Para descartar los cambios en el directorio de trabajo.
fuente
Creo que git tiene una cosa que no está claramente documentada. Creo que en realidad fue descuidado.
git checkout .
Hombre, me salvaste el día. Siempre tengo cosas que quiero probar usando el código modificado. Pero las cosas a veces terminan arruinando el código modificado, agregando nuevos archivos no rastreados, etc. Entonces, lo que quiero hacer es organizar lo que quiero, hacer las cosas desordenadas, luego limpiar rápidamente y comprometerme si estoy feliz.
Hay
git clean -fd
funciona bien para los archivos sin seguimiento.Luego,
git reset
simplemente elimina la puesta en escena, perogit checkout
es demasiado engorrosa. 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. Deseaba este comando que solo elimina los cambios no organizados y aquí está. Gracias.Pero creo que deberían tener
git checkout
sin ninguna opción, eliminar todos los cambios no organizados y no tocar el escenario. Es un poco modular e intuitivo. Más como lo quegit reset
hace.git clean
También debería hacer lo mismo.fuente
La mejor manera es revisar los cambios.
Cambiando el archivo pom.xml en un proyecto llamado nombre-proyecto puede hacerlo:
fuente
Para descartar todo lo que me gusta esconder y soltar ese alijo, es la forma más rápida de descartar todo, especialmente si trabaja entre múltiples repositorios.
Esto ocultará todos los cambios en la
{0}
clave y la soltará instantáneamente{0}
git stash && git stash drop
fuente
En primer lugar, verifique si su cambio importante se guarda o no mediante:
que intentar
pero si solo necesitas deshacer:
Leer más >> https://git-scm.com/docs/git-reset
fuente