Si tengo un montón de cambios no comprometidos y quiero dejarlos de lado mientras trabajo en otra cosa, y luego (después de varios días) vuelvo a eso y sigue trabajando. ¿Cuál sería el flujo de trabajo más fácil para lograr esto? (Hasta ahora solo tengo experiencia con la funcionalidad básica de Mercurial). Mi método habitual era crear una nueva rama usando clon, pero podría haber mejores formas.¿Cómo puedo dejar de lado un montón de cambios no comprometidos mientras trabajo en otra cosa?
Respuesta
usted tiene un puñado de opciones:
Shelve los artículos. Esto guarda los cambios y los elimina del directorio de trabajo para que la rama pueda continuar. No crea un conjunto de cambios.
hg shelve --all --name "UnfinishedChanges" hg unshelve --name "UnfinishedChanges"
actualización/Editar: Las nuevas versiones de mercurio pueden necesitar utilizar
hg shelve -n "UnfinishedChanges" hg unshelve "UnfinishedChanges"
Puede seguir utilizando
--name
como una alternativa a-n
, pero Mercurial no parece que les gusta--name
más. Además, el--all
ya no es necesario y mercurial enloquecerá.Patch queue los elementos que usan
mq
. Esto no es muy diferente a dejar de lado en algunos aspectos, pero se comporta de manera diferente. El resultado final es el mismo, los cambios se eliminan y opcionalmente se pueden volver a aplicar más adelante. Cuando se presionan, los parches son conjuntos de cambios lógicos, cuando aparecen, se guardan en otro lugar y no forman parte del historial del conjunto de cambios.hg qnew "UnfinishedWork" hg qrefresh hg qpop hg qpush "UnfinishedWork"
cometerlos localmente, actualizar al cambio-set anterior y seguir trabajando y hacer uso de las ramas anónimos (o múltiples cabezas). Si luego quieres los cambios, puedes combinar jefes. Si no desea los cambios, puede strip el conjunto de cambios.
hg commit -m"Commiting unfinished work in-line." hg update -r<previous revision> hg strip -r<revision of temporary commit>
Commitas a una sucursal con nombre. El flujo de trabajo se convierte en el mismo que en la opción 3: fusionar o pelar cuando esté listo.
hg branch "NewBranch" hg commit -m"Commiting unfinished work to temporary named branch." hg update <previous branch name>
Personalmente utilizo la opción 3 o 4 como que no me importa despojar cambio en sets o el check-in de código parcial (siempre y cuando eso no finalmente conseguir presionado). Esto se puede usar junto con las nuevas cosas Phase para ocultar sus conjuntos de cambios locales de otros usuarios si es necesario.
También uso el comando rebase
para mover conjuntos de cambios para evitar fusiones donde una fusión no agrega nada al historial del código. Fusiones Tiendo a ahorrar para la actividad entre ramas importantes (como ramas de publicación) o actividad de una rama de características de mayor duración. También está el comando histedit
que uso para comprimir conjuntos de cambios donde el "chattiness" de ellos reduce el valor.
Las colas de parche también son un mecanismo común para hacer esto, pero tienen una semántica de pila. Usted empuja y hace estallar parches, pero un parche que está "debajo" de otro parche en la pila requiere que también se empuje el que se encuentra encima.
Advertencia, al igual que con todas estas opciones, si los archivos tienen más cambios desde los cambios temporales que usted ha archivado/cola/ramificado, habrá fusionar resolución requerida cuando un-estantería/empujar/fusión.
Puede clonar su repositorio varias veces. Tiendo a tener un clon de raíz, luego múltiples hijos a partir de ahí. Ejemplo:
- MyProject.Root
- MyProject.BugFix1
- MyProject.BugFix2
- MyProject.FeatureChange1
- MyProject.FeatureChange2
Los 4 childs están todos clonó a partir de la raíz y empujar/tirar hacia/desde la raíz. La raíz luego push/pulls del repositorio maestro en la red/internet en algún lugar. La raíz actúa como tu tipo de área de preparación personal.
Por lo tanto, en su caso, simplemente clonaría un nuevo repositorio y comenzaría a trabajar. Deje su trabajo 'archivado' solo en el otro repositorio. Es así de simple.
El único inconveniente es el uso de espacio en disco, pero si eso fuera una preocupación, no usaría DVCS de todos modos;) Ah, y de alguna manera contamina su lista de "proyectos recientes" de Visual Studio, pero ¿qué pasa? .
[Editar siguientes comentarios]: -
Para concluir entonces ... lo que está haciendo es completamente bien y normal. Yo diría que es la mejor manera de trabajar cuando los siguientes son verdaderos: 1) es de corta duración 2) no es necesario que colabores con otros desarrolladores 3) los cambios no tienen que salir de tu PC hasta que se comprometan/tiempo de empuje.
¿Alguna razón para no usar sucursales? Esto es para lo que son y son considerablemente más rápidos que repo-cloning. –
En mi pregunta, afirmé lo siguiente: Mi método habitual era crear una nueva rama usando clon, pero podría haber formas mejores. – Erik
@AdamHouldsworth, técnicamente estas son sucursales ... solo de corta vida. Hacer una sucursal con nombre para un trabajo de corta duración es completamente estúpido. Abusa del propósito de ramas designadas que son para historias de trabajo de larga vida. – nbevans
Personalmente, no me gusta ninguna de las respuestas publicadas hasta ahora:
- no me gusta clon de ramificación porque me gustaría que cada proyecto tiene solamente una directorio. Trabajar en diferentes directorios al mismo tiempo arruina completamente el historial de los archivos recientes de mis editores. Siempre termino cambiando el archivo incorrecto. Entonces ya no hago eso.
- Uso
shelve
para soluciones rápidas (solo para mover mis cambios sin compromiso a otra rama, si me doy cuenta de que estoy equivocado). Estás hablando de días, de ninguna manera dejaría algo durante días. - creo
mq
es demasiado complicado para un sittuation tales ordinaria
Creo que la mejor forma de hacerlo es simplemente confirmar los cambios, lo que vuelve al conjunto de cambios antes de iniciar estos cambios y trabajar desde allí. Hay algunos problemas menores, déjenme ilustrar:
Digamos que usted tiene el conjunto de cambios A. Luego de comenzar los cambios. En este punto, desea dejarlo de lado por un tiempo. En primer lugar, comprometer su trabajo:
hg ci -m "Working on new stuff"
Si lo desea, puede agregar un marcador para que sea más fácil para volver más tarde. Siempre creo marcadores en mis ramas anónimas.
hg bookmark new-stuff
Vuelve al conjunto de cambios antes de que estas modificaciones
hg update A
Desde aquí, trabajar y generar el conjunto de cambios C. Ahora usted tiene 2 cabezas (B y C), se le avisará cuando intentas empujar Usted puede empujar una sola rama, especificando la cabeza de esa rama:
hg push -r C
O puede cambiar la fase de la rama new-stuff
a secreto. Los conjuntos de cambios secretos no serán empujados.
hg phase -r new-stuff --secret --force
¡Gracias por la respuesta detallada! Me gusta mucho leer los flujos de trabajo de las personas para esos problemas (¿normales?). – Erik
Creo que 'mq' es un poco demasiado complicado para _sólo_ esta situación, pero tiene un rango suficientemente amplio de usos, incluido este, que vale la pena invertir el tiempo para hablar con fluidez. –
Para mantener los cambios uncommited locales, forma más fácil para mí es sólo para guardarlos como un archivo de revisión.
hg diff > /tmp/`hg id -i`.patch
y cuando se necesita para volver al estado anterior:
hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch
Quitaría '/ tmp' y' hg id -i' y también funcionará en Windoze. –
Y 'hg up' no es necesario allí. –
@techtonik ¿Qué sucedería si aplico el parche en otra revisión? Especialmente si los archivos parcheados son modificados. – mapcuk
- 1. cómo mover cambios comprometidos pero no apilados a otra rama?
- 2. Fusionando cambios no comprometidos en alguna otra rama usando SVN
- 3. Dejar de lado Cambios en el servidor de Team Foundation
- 4. ¿Por qué asegurar el trabajo solo en otra cosa?
- 5. SVN: fusiona los cambios locales en otra copia de trabajo
- 6. ¿Cómo puedo dejar de registrar accidentalmente un archivo en TFS
- 7. innecesaria 'otra cosa' declaración
- 8. No puedo dejar de imprimir
- 9. Refactoring un árbol Si otra cosa
- 10. Scala cómo escribir si otra cosa
- 11. GWT o DOJO o alguna otra cosa?
- 12. ordena otra cosa y declaraciones elif no trabajar en Python
- 13. UIApplicationExitsOnSuspende cualquier otra cosa que me falta?
- 14. ¿Cómo puedo cargar cambios confirmados en mi repositorio de GitHub?
- 15. ¿Cómo puedo ver múltiples diferencias git una al lado de la otra en vim
- 16. ¿Por qué ejecutar `git pull` eliminar mis cambios comprometidos?
- 17. SortedList indexado por otra cosa que no sea la clave
- 18. Mano corta Si declaración sin otra cosa
- 19. binarios comprometidos con SVN
- 20. Magma, GOODS, GLORP, o alguna otra cosa?
- 21. Sass mixin con si otra cosa
- 22. Php Framework o motor de plantilla u otra cosa?
- 23. ¿Cómo puedo "dejar de usar" un espacio de nombres?
- 24. ¿Puedo trasladar mi directorio de trabajo Mercurial a otra ubicación?
- 25. ¿Cómo puedo consultar elementos de trabajo y sus conjuntos de cambios vinculados en TFS?
- 26. Encriptación de contraseña con Spring/Hibernate - Jasypt u otra cosa?
- 27. Adición de cambio no comprometidos en un nuevo parche con colas de Mercurial
- 28. ¿cómo puedo proteger una memoria de montón en Linux?
- 29. Condor, Sun Grid Engine, o alguna otra cosa?
- 30. Cambiar a otra rama sin cambiar los archivos de espacio de trabajo
Gracias por la gran respuesta y ejemplos útiles. ¿Sabes por casualidad que el uso de marcadores hg también es una opción? – Erik
@Erik Posiblemente, pero no tengo experiencia en usarlo. Los marcadores de –
se pueden usar para ayudar con la opción 3: puede usar uno para etiquetar la revisión que creó para esconder su cambio. No pueden hacer la tarea solos. –