2011-01-14 12 views
30

Escenario: repo local, antes de salir de la oficinaMercurial dice "abortar: cambios no confirmados pendientes", no quiero cometer

$ hg status 

M important/update1 
M another/important/update2 
M work/in/progress 

Quiero comprometerme y empuje importante /Update1 y important/update2, porque quiero traer estos archivos a mi repositorio local cuando llegue a casa. No estoy listo para cometer trabajo/en/progreso. De hecho, ni siquiera analiza correctamente. Ese archivo se abre en mi IDE y solo quiero dejarlo tal como está.

Ahora hago: (a toda prisa, el tranvía sale en tres minutos)

$ hg commit important/update1 another/important/update2 
$ hg push 

pushing to https://**censored** 
searching for changes 
abort: push creates new remote heads on branch 'default'! 
(did you forget to merge? use push -f to force) 

Ok. Colega ha empujado algo ... (El tranvía se va en dos minutos ...)

$ hg pull (really important update!) 
$ hg update 

abort: outstanding uncommitted changes 

Crap. Necesito la actualización de mis colegas, pero no voy a cometer trabajo/en/progreso, y mucho menos empujarlo! Y me perdí mi tranvía ...

¿Cómo lidiar con esto?

+0

$ hg estado -n | tar -cf - -T -> ~/Dropbox/wip.tar # Creo que iré con este one-liner hasta que necesite algo más elaborado –

+0

Make empty commit :) y luego 'hg pull -u' – fider

Respuesta

6

Utilice attic extension para guardar temporalmente/guardar el trabajo en progreso.

+0

Gracias ¡Definitivamente voy a verificarlo! Votado –

+0

@elandeholm - Gracias. la extensión del ático es realmente útil, pero ayuda a su problema solo en el 3er paso con menos de 2 minutos antes de que el tranvía se vaya. También consideraría otras soluciones como tener su propio repositorio de clones remoto (sin conflictos garantizados) (también llamado un repositorio de sucursales en Kiln "speak") u otro mecanismo para compartir trabajo entre 2 ubicaciones, p. DropBox. Un último recurso sería utilizar una rama con nombre real que enviaría al repositorio remoto, pero * realmente no me gusta esa alternativa porque las ramas con nombre permanecen como parte del historial permanentemente. –

5

normalmente utilizo el TortoiseHg shelve extension, que también se puede activar a utilizar en su CmdLine

[extensions] 
tortoisehg.util.hgshelve = 

Ahora puede usar los comandos:

$ hg shelve 

Si sabe que la actualización ganó' Para interferir con nuestro trabajo, también puede forzar la extracción/actualización (hg pull -f).

1

Si está presionando solo para exponer el código a la red para que pueda extraer y seguir trabajando desde su casa, no sé si su colega debería presionar al mismo repositorio. Podría considerar el uso de un repositorio de desarrolladores: un repositorio para su uso personal (ya sea por permisos o simplemente por cumplimiento/cortesía).

Ciertos programas (como FogCreek's Kiln SW) proporcionan esta capacidad, pero incluso si solo almacena repositorios en una red/unidad compartida, debería poder crear un repositorio personal allí.

Si este no es el caso (es decir, no tiene permisos de servidor), también puede considerar el uso de una rama con nombre. En este caso, simplemente se comprometerá con su sucursal con nombre y pasará esa rama al servidor. Presumiblemente, su colega dejaría sus ramas nombradas en paz y no habría nada nuevo que reunir y fusionar. En términos de "desorden de ramas", sí, están presentes durante el tiempo de vida del repositorio, pero cerrar la rama nombrada justo antes de la fusión los eliminará de su vista y resolverá algunos problemas.

> hg update <branch name> 
> hg commit --close-branch -m 'closing branch <branch name>' 

Al final del día, no considero el desorden rama a ser una preocupación importante a menos que (a) tiene un equipo gigante o (b) no están cerrando sus ramas.

5

Un flujo de trabajo para personas que desarrollan varias características/correcciones de errores al mismo tiempo:

Una posibilidad sería la de clonar tantos repositorios como características a desarrollar. Pero esto puede ser costoso en espacio en disco, tiempo y también confuso. Otra posibilidad es trabajar en un tema diferente en el mismo repositorio local (llamémoslo Principal) pero use solo un , el segundo para confirmar selectivamente una o varias funciones deseadas en el depósito central.

Esto está muy bien explicado y detallado en este artículo:

https://blogs.oracle.com/tor/entry/mercurial_tip_checking_in_regularly

Si alguna vez se encuentra con los siguientes mensajes de error:

  • “Cancelar:! Empuje crea nuevas cabezas remotas” (potenciales encabezados múltiples)
  • "abortar: cruza las ramas (use 'hg merge' o 'hg update -C')" (dir de trabajo en una rama diferente a los cambios extraídos), o
  • “abortar: pendientes cambios no confirmados” (imposibles de fusionar a causa de las modificaciones locales)

entonces el artículo anterior explica por qué todo esto está ocurriendo, y propone un flujo de trabajo para evitar estos problemas. Nota: también es posible usar el mecanismo de parche de mqueues para impulsar sus cambios (vea el comentario n. ° 1 del artículo).

Espero que ayude.

33

Si no desea utilizar estantería, puede hacerlo con sólo 3 comandos:

hg diff > mylocalchanges.txt 

hg revert -a 

# Do your merge here, once you are done, import back your local mods 

hg import --no-commit mylocalchanges.txt 
+3

Hows easy was that .. Muchas gracias .. –

+0

Este es un enfoque muy simple e intuitivo. Descubrí que también necesitaba especificar un número de revisión como este, 'hg revert -rREVNO -a' – ChrisGuest

Cuestiones relacionadas