remota - Varias formas de eliminar los cambios locales de Git.
git push tag (9)
Acabo de clonar un repositorio de git y verifiqué 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 bien, hágame saber el enfoque correcto?
(2) cuándo utilizamos git reset --hard
ya que puedo reiniciar incluso sin este comando
Gracias
* Solución: Edición (es) principal (es): 26/03: * Se reemplazaron muchos de los términos vagos con terminología específica de git [rastreado / no rastreado / estadificado / no estadificado]
Podría haber solo tres categorías de archivos cuando hacemos cambios locales:
Tipo 1. Archivos rastreados por etapas
Tipo 2. Archivos rastreados sin etapas
Tipo 3. Archivos no rastreados no rastreados, también archivos no rastreados
- Staged - Aquellos que se mueven al área de preparación / Agregados al índice
- Rastreado - archivos modificados
- Untracked - nuevos archivos. Siempre sin etapas. Si está en escena, eso significa que son rastreados.
Lo que cada comando hace:
git checkout .
- Elimina SOLAMENTE los archivos de Unstaged [Tipo 2]git clean -f
- Elimina archivos sin seguimiento no estadificados SOLAMENTE [Tipo 3]git reset --hard
- Elimina SOLAMENTE los 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: el alijo, 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
. Así que elegir entre las dos opciones anteriores es una llamada del desarrollador.
Gracias Christoph y Frederik Schøning.
Edición: 27/03
Pensé que valía la pena poner la nota de '' cuidado '' en 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 los archivos ignorados y no ignorados, ejecute git clean -f -x
referencia: más información sobre git clean
: ¿Cómo eliminar archivos locales (sin seguimiento) del árbol de trabajo de Git actual?
Edición: 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 a la "corriente arriba" de esta rama, simplemente ejecute git reset --hard @{u}
Referencia: http://sethrobertson.github.io/GitFixUm/fixup.html
o haga git reset --hard origin/master
[si la rama local es master
]
Nota: 12/06/2015 Esto no es un duplicado de la otra pregunta SO que está marcada como duplicada. Esta pregunta aborda cómo eliminar los cambios GIT locales [eliminar un archivo agregado, eliminar los cambios agregados al archivo existente, etc. y los diversos enfoques; Donde en el otro subproceso SO solo dirija cómo eliminar el compromiso local. Si agregó un archivo y desea eliminarlo solo, entonces el otro subproceso de SO no lo discute. Por lo tanto, esto no es un duplicado del otro]
Edición: 23/06/15
¿Cómo revertir un compromiso ya enviado a un repositorio remoto?
$ git revert ab12cd15
Edición: 01/09/2015
Eliminar una confirmación anterior de la rama local y la rama remota
Caso: Acaba de comprometer un cambio en su sucursal local e inmediatamente lo empujó a la sucursal remota. De repente se dio cuenta: ¡Oh no! No necesito este cambio. Ahora hacer que?
git reset --hard HEAD~1
[para eliminar esa confirmación de la rama local]
git push origin HEAD --force
[ambos comandos deben ejecutarse. Para borrar de la rama remota]
¿Cuál es la rama? Es la rama actualmente retirada.
Editar 09/08/2015 - Eliminar local git merge :
Estoy en la rama master
y la rama master
combinada con una nueva 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? git reset --hard
y git clean -d -f
Ambos no funcionaron.
Lo único que funcionó son los siguientes:
$ git reset --hard origin/master
o
$ git reset --hard HEAD~8
o
$ git reset --hard 9a88396f51e2a068bb7
[sha commit code - este es el que estaba presente antes de que ocurrieran todas tus confirmaciones de fusión]
1. Cuando no quieres mantener tus cambios locales en absoluto.
git reset --hard
Este comando eliminará completamente 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 quieras 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,
git stash
Se ocultarán todos los cambios locales, ahora puede extraer los cambios remotos,
git pull
Ahora, puede recuperar sus cambios locales por,
git stash pop
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 con git stash -u
. La -u
se asegura de que también se incluyan los archivos recién agregados (sin seguimiento).
Lo práctico de git stash -u
es que
- es probablemente el comando más simple (¿solo?) para lograr su objetivo
- si luego cambias de opinión, recuperas todo tu trabajo con
git stash pop
(es como eliminar un correo electrónico en gmail donde puedes deshacerlo si luego cambias de opinión)
A partir de su otra pregunta, git reset --hard
no eliminará los archivos sin seguimiento, por lo que aún necesitaría el git clean -f
. Pero un git stash -u
podría ser el más conveniente.
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 a veces las cosas terminan ensuciando el código modificado, añadiendo nuevos archivos sin seguimiento, etc. Así que 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 git clean -fd
.
Luego, git reset
simplemente elimina la puesta en escena, pero git checkout
es demasiado engorroso. Especificar el archivo uno por uno o usar directorios no siempre es lo ideal. A veces, los archivos modificados de los que quiero deshacerme están dentro de los directorios que quiero conservar. Deseé este único comando que solo elimina los cambios no programados y aquí está. Gracias.
Pero creo que deberían tener git checkout
sin ninguna opción, eliminar todos los cambios no programados y no tocar la puesta en escena. Es un poco modular e intuitivo. Más como lo que hace git reset
. git clean
también debería hacer lo mismo.
En primer lugar el cheque es su cambio importante guardado o no por:
estado de $ git
que intentar
$ git reset - hard
se restablecerá su rama a la predeterminada
pero si necesita simplemente 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
La mejor manera es revisar los cambios.
Cambiando el archivo pom.xml en un proyecto llamado nombre-proyecto 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''
Para descartar todo lo que me gusta esconder y colocar ese alijo, es la forma más rápida de descartar todo, especialmente si trabajas entre varios repositorios.
Esto ocultará todos los cambios en la tecla {0}
y lo eliminará instantáneamente de {0}
git stash && git stash drop
Todo depende exactamente de lo que intenta deshacer / revertir. Comience leyendo .com/questions/1146973/… . Pero para intentar una respuesta:
Reinicio duro
git reset --hard [HEAD]
Elimine por completo todos los cambios en etapas y sin etapas en los archivos rastreados.
Me encuentro a menudo usando un restablecimiento completo, cuando estoy como "simplemente deshaga todo, como si hubiera hecho un nuevo clonaje desde el control remoto". En su caso, donde solo quiere que su repo prístina, esto funcionaría.
Limpiar
git clean [-f]
Eliminar archivos que no son rastreados.
Para eliminar archivos temporales, pero mantenga los cambios en etapas y sin etapas en los archivos ya rastreados. La mayoría de las veces, probablemente termine haciendo una regla de ignorar en lugar de limpiar repetidamente, por ejemplo, para las carpetas bin / obj en un proyecto de C #, que normalmente querría excluir de su repositorio para ahorrar espacio, o algo así.
La opción -f (forzar) también eliminará los archivos que no se rastrean y que git los ignora, aunque ignora la regla. En el caso anterior, con una regla de ignorar para nunca rastrear las carpetas bin / obj, aunque git esté ignorando estas carpetas, el uso de la opción force las eliminará de su sistema de archivos. Esporádicamente he visto un uso para esto, por ejemplo, cuando implemento 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"
git checkout .
En realidad nunca había visto esta notación antes de leer tu publicación. Me cuesta mucho encontrar documentación para esto (quizás alguien pueda ayudar), pero al jugar un poco, parece que significa:
msgstr "deshacer todos los cambios en mi árbol de trabajo".
Es decir, deshacer los cambios en etapas en los archivos rastreados. Al parecer, no toca los cambios preconfigurados y deja los archivos sin seguimiento solo.
Alijo
Algunas respuestas mencionan el alijo. Como lo indica la redacción, es probable que utilice el ocultamiento cuando esté en medio de algo (no esté listo para un compromiso), y tenga que cambiar temporalmente las sucursales o trabajar de alguna manera en otro estado de su código, más tarde para volver a su "desordenada escritorio". No veo que esto se aplique a tu pregunta, pero definitivamente es útil.
Para resumir
En general, si confía en que se ha comprometido y tal vez se haya presionado para realizar cambios importantes remotos, si solo está jugando o algo similar, utilice git reset --hard HEAD
seguido de git clean -f
que limpiará definitivamente su código al estado, estaría dentro, si hubiera sido clonado y retirado de una sucursal. Es muy importante enfatizar que el restablecimiento también eliminará los cambios en etapas, pero no confirmados. Limpiará todo lo que no se haya confirmado (excepto los archivos no rastreados, en cuyo caso, use limpio ).
Todos los demás comandos están ahí para facilitar escenarios más complejos, donde se necesita una granularidad de "deshacer cosas" :)
Siento que tu pregunta # 1 está cubierta, pero, por último, para concluir sobre el # 2: la razón por la que nunca encontraste la necesidad de usar git reset --hard
fue que nunca habías puesto en escena nada. Si hubieras realizado un cambio, ni git checkout .
ni git clean -f
habría revertido eso.
Espero que esto cubra.
Utilizar:
git checkout -- <file>
Para descartar los cambios en el directorio de trabajo.
Razón para añadir una respuesta en este momento:
Hasta ahora estaba agregando la conclusión y las ''respuestas'' a mi pregunta inicial, haciendo que la pregunta fuera muy larga, por lo tanto, pasé a una respuesta separada.
También he agregado comandos git que se usan con más frecuencia que me ayudan en git, para ayudar a alguien más también.
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.
# Configura el nombre que desea adjuntar a sus transacciones de compromiso
$ git config --global user.name "[name]"
# Configura el correo electrónico que desea adjuntar a sus transacciones de compromiso
$ git config --global user.email "[email address]"
#Listar la configuración global
$ git config --list
#comprobar estado
git status
#Listar todas las sucursales locales y remotas
git branch -a
#crea una nueva sucursal local y comienza a trabajar en esta sucursal
git checkout -b "branchname"
O bien, se puede hacer como un proceso de dos pasos.
crear rama: git branch branchname
trabajo en esta rama: git checkout branchname
#comita cambios locales [proceso de dos pasos: - Agregue el archivo al índice, eso significa agregar al área de preparación. Luego confirma los archivos que están presentes en esta área de preparación]
git add <path to file>
git commit -m "commit message"
#controlar alguna otra sucursal local
git checkout "local branch name"
#eliminar todos los cambios en la rama local [Supongamos que hiciste algunos cambios en la rama local, como agregar un archivo nuevo o modificar un archivo existente, o hacer un compromiso local, pero ya no es necesario que] git clean -d -f
y git reset --hard
[ limpie 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 (1) una combinación de git clean –d –f
y git reset --hard
O (2) git stash -u
para lograr el resultado deseado.
Nota 1: el alijo, ya que la palabra significa "Almacenar (algo) de forma segura y secreta en un lugar específico". Esto siempre puede ser recuperado usando git stash pop. Así que elegir entre las dos opciones anteriores es una llamada del desarrollador.
Nota 2: git reset --hard
eliminará los cambios de directorio de trabajo. Asegúrese de guardar cualquier cambio local que desee mantener antes de ejecutar este comando.
# Cambie a la rama maestra 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 en origen / maestro]
git pull
# Fusionar la rama de la característica en la rama maestra.
git merge feature_branch
# Restablecer la rama maestra al estado de origen.
git reset origin/master
# ¿Se eliminó accidentalmente un archivo del local, cómo recuperarlo? Haga un git status
para obtener la ruta de archivo completa del recurso eliminado
git checkout branchname <file path name>
¡Eso es!
#Merge master branch con someotherbranch
git checkout master
git merge someotherbranchname
#rename sucursal local
git branch -m old-branch-name new-branch-name
#eliminar sucursal local
git branch -D branch-name
#delete rama remota
git push origin --delete branchname
o
git push origin :branch-name
#revertir una confirmación ya enviada a un repositorio remoto
git revert hgytyz4567
#branquio de una confirmación anterior usando GIT
git branch branchname <sha1-of-commit>
#Cambiar mensaje de confirmación de la confirmación más reciente que ya se ha enviado a remoto
git commit --amend -m "new commit message"
git push --force origin <branch-name>
# 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 a la "corriente arriba" de esta rama, simplemente ejecute
git reset --hard @{u}
Referencia: http://sethrobertson.github.io/GitFixUm/fixup.html o git reset --hard origin/master
[si la rama local es master]
# ¿Revertir un compromiso ya enviado a un repositorio remoto?
$ git revert ab12cd15
#Borrar una confirmación anterior de la rama local y la rama remota
Caso de uso: Acaba de comprometer un cambio en su sucursal local e inmediatamente lo empujó a la sucursal remota. De repente se dio cuenta: ¡Oh no! No necesito este cambio. Ahora hacer que?
git reset --hard HEAD~1
[para eliminar esa confirmación de la rama local. 1 denota el compromiso que hiciste]
git push origin HEAD --force
[ambos comandos deben ejecutarse. Para borrar de la rama remota]. La sucursal actualmente retirada será referida como la sucursal donde está realizando esta operación.
# Elimine algunos de los compromisos recientes del repositorio local y remoto y conserve el compromiso que desee. (una especie de revertir confirmaciones locales y remotas)
Supongamos que tiene 3 confirmaciones que ha enviado a la rama 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 revertir al antiguo commit (para cambiar el estado de la rama)
git log --oneline --decorate --graph
// para ver todos sus comentarios.
git clean -d -f
// limpia cualquier cambio local
git reset --hard commitid-1
// volviendo localmente a este commitid
git push -u origin +develop
// empujar este estado a remoto. + hacer fuerza de empuje
# Eliminar la combinación de git local: Caso: Estoy en la rama maestra y la rama maestra combinada con una nueva fase de la fase 2
$ git status
En rama maestro
$ git merge phase2
$ git status
En rama maestro
Tu rama está delante de ''origen / maestro'' por 8 confirmaciones.
P: ¿Cómo deshacerse de esta fusión local de git? git reset --hard
y git clean -d -f
Ambos no funcionaron. Lo único que funcionó son los siguientes:
$ git reset - hard origin / master
o
$ git reset - hard HEAD ~ 8
o
$ git reset --hard 9a88396f51e2a068bb7
[sha commit code - este es el que estaba presente antes de que ocurrieran todas tus confirmaciones de fusión]
#crear archivo gitignore
touch .gitignore
// cree el archivo en usuarios de mac o unix
muestra .gitignore contenidos:
.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