Soy un usuario de git confundido por la ramificación de mercurial. ¿Cómo se supone que debo rastrear pequeños cambios?

32

Siempre he usado git antes, pero quiero contribuir a Python, así que ahora tengo que aprender mercurial y lo encuentro muy frustrante.

Entonces, hice un par de parches pequeños y quería rastrearlos como commits en mi repositorio mercurial local. Aparentemente hay 4 formas de manejar la ramificación en mercurial . 1 y 4 me parecieron completamente ridículas, las ramas con nombre parecen ser pesadas y siento que no se supone que las use para las soluciones rápidas de 1 confirmación, así que usé marcadores.

Ahora, mi parche se rechaza y quiero eliminar una de mis ramas de marcadores de mi repositorio. OK, en git simplemente forzaría la eliminación de mi rama y me olvidaría de ella, así que elimino mi marcador y ahora tengo los siguientes problemas:

  • TortoiseHG y hg logtodavía muestra que commit y defaultbranch tiene 2 cabezas. Y si entiendo correctamente, no puede eliminar confirmaciones en hg sin complementos adicionales.

  • Mercurial no solo tiene hashes, sino también números de revisión. Como he agregado un par de mis propias confirmaciones, todas las confirmaciones obtenidas después de eso tienen números de revisión diferentes del repositorio central principal.

  • Lo hago hg updatedespués de tirar para mover mi mastermarcador al último commit automáticamente, pero no pude encontrar una manera de hacerlo en TortoiseHG.

¿Qué estoy haciendo mal? ¿Es esto normal y esperado y debería ignorar estos problemas? ¿O cómo se supone que debo trabajar con mis sucursales?

Anton Barkovsky
fuente

Respuestas:

22

Personalmente, para su escenario, no me molestaría incluso en crear una rama, a menos que estuviera trabajando en múltiples cambios, cada uno de los cuales tendría que ser aceptado por los desarrolladores principales.

Simplemente clone su repositorio y trabaje en él, luego haga una solicitud de extracción.

Si tuviera que usar una rama, preferiría usar ramas con nombre. Fueron diseñados para este propósito exacto, donde no estaban los marcadores. No veo por qué lo considerarías pesado.

Mercurial tiene una página completa en su wiki que describe diferentes formas de " Podar ramas muertas ". La opción "Usar clon" debe satisfacer sus requisitos.

Para responder a sus problemas más específicos ...

TortoiseHG y hg log todavía muestran que commit y la rama predeterminada tienen 2 cabezas. Y si entiendo correctamente, no puede eliminar confirmaciones en hg sin complementos adicionales.

Este es un error que cometí con Mercurial cuando era nuevo en él. No tengas miedo de esos complementos adicionales. Algunas de ellas son herramientas muy poderosas y, a menudo, luego se incorporan al producto principal. Así es como funciona Mercurial. Si necesita una para realizar una tarea específica, consígala y úsela.

Revisar el historial se considera algo malo en el mundo de Mercurial, por lo que el producto de vainilla no siempre tiene todo lo que un usuario de Git cree que debería tener, pero hay muchos complementos para aquellos que desean usar la aplicación pero tienen diferentes prioridades.

Mercurial no solo tiene hashes, sino también números de revisión. Como he agregado un par de mis propias confirmaciones, todas las confirmaciones obtenidas después de eso tienen números de revisión diferentes del repositorio central principal.

No te preocupes por los números de revisión. Son una cuestión de conveniencia, no más. Los códigos hash son los identificadores importantes que pasarán de un repositorio a otro. Los números de revisión son inconsistentes en los repositorios. Echa un vistazo a Hg Init para una buena explicación.

Los números de revisión son solo un atajo útil y más memorable cuando se trabaja con un único repositorio.

Actualizo hg después de tirar para mover mi marcador maestro al último commit automáticamente, pero no pude encontrar una manera de hacerlo en TortoiseHG.

Cuando use TortoiseHG, use el Workbench en lugar de las otras herramientas. Todo (casi) está ahí. La actualización está en los menús contextuales de revisión. No siempre es intuitivo, pero hay una buena guía en el enlace de arriba y, a medida que te acostumbras, terminas haciendo clic con abandono seguro.

pdr
fuente
Ciertamente he visto el argumento antes de que las ramas con nombre propio significan que el historial de edición es menos necesario en hg
jk.
9

Aparentemente hay 4 formas de manejar la ramificación en mercurial. 1 y 4 me parecieron completamente ridículas, las ramas con nombre parecen ser pesadas

En Mercurial, no creas ramas. Cada commit es efectivamente una rama, cualquier commit puede tener múltiples padres y múltiples hijos. Esas son las cuatro formas diferentes de organizar las mismas entidades.

Usted puede darles diferentes nombres, que no tiene que , pero es una idea buena. No hay nada pesado en las ramas con nombre: son solo algunos metadatos adicionales. Personalmente prefiero ramas con nombre a cualquier otra cosa en cualquier situación.

TortoiseHG y hg log todavía muestran que commit y la rama predeterminada tienen 2 cabezas.

Cuál es exactamente la razón para usar ramas con nombre en lugar de volcar todo default.

Y si entiendo correctamente, no puede eliminar confirmaciones en hg sin complementos adicionales.

En realidad, no puede eliminar nada en Mercurial y no debería . Puede usar hg strippero no está registrado; básicamente, solo corta una parte de su repositorio local. No puede presionar eso, y si saca de un repositorio que tiene la rama que despojó localmente, regresa.

Mercurial no solo tiene hashes, sino también números de revisión. Como he agregado un par de mis propias confirmaciones, todas las confirmaciones obtenidas después de eso tienen números de revisión diferentes del repositorio central principal.

Los números no significan nada. Puedes ignorarlos si te confunden.

Actualizo hg después de tirar para mover mi marcador maestro al último commit automáticamente, pero no pude encontrar una manera de hacerlo en TortoiseHG.

No he usado TortoiseHG pero hg pull -uharé ambas cosas pully update.

Siempre he usado git antes, pero quiero contribuir a Python, así que ahora tengo que aprender mercurial y lo encuentro muy frustrante.

Está bien, muchos usuarios de Mercurial sienten lo mismo por Git (incluido yo).

un tipo triste
fuente
6

Incluso cuando Mercurial y Git son similares, tienen diseños diferentes, quizás la diferencia de diseño más importante es que en Mercurial la modificación de la historia no es tan flexible como en git (porque es un poco desaconsejado).

Respuesta corta : no importa si tiene una pequeña cantidad de cambios, aún puede usar una rama. Si está pensando en eliminar esa rama, use un marcador para poder eliminarla más tarde y quitar los cambios después.

Primero, tratando de arrojar un poco de luz sobre algunas de las cosas que mencionas:

  • Se considera que 1 y 4 se ramifican porque cada vez que se compromete, efectivamente está creando una rama sin nombre (si hay otra confirmación al mismo tiempo en su repositorio fuente / bendecido), que técnicamente es una rama. En el método 4 está creando una nueva "cabeza", mientras que en el método 1 no lo está . Se supone que las cabezas se fusionan. Estoy de acuerdo en que el método 1 es un poco tonto, pero parece que a algunos les gusta ... para proyectos pequeños, supongo.

  • Con respecto al método 2, no es que las ramas sean pesadas, es que son permanentes . No puede eliminar una rama a menos que use algo como la extensión de la tira. Una vez más, la filosofía de diseño de Mercurial no se dirige hacia la modificación de la historia (pero ha mejorado en eso).

  • En cuanto a los números de revisión , son solo una referencia local y más legible para que usted use todos los comandos que tienen que ver con las revisiones. Si te gusta usar hashes, aún puedes hacerlo. Los números de revisión son solo un atajo y Mercurial no los tiene en cuenta para cualquier operación interna entre diferentes repositorios.

Ahora, para responder a sus otras preguntas:

  • Puede verificar con qué cabezas tiene hg heads, si ve más de 2 cabezas en una sola rama con nombre, es preferible que estén fusionadas. Eso es probablemente donde está tu marcador .
  • Para deshacerse de una revisión que acaba de hacer, puede hacerlo hg rollback, pero supongo que este no es el caso.
  • Para eliminar un marcador simplemente haz hg bookmark --delete yourbookmark
  • Te alegrará que sea fácil cortar ramas en la historia. Mire la extensión Rebase y la operación Strip .
  • Mercurial ya viene incluido con varias extensiones, pero no están activadas por defecto . Simplemente vaya a cualquier carpeta y haga clic derecho en cualquier lugar para obtener el menú contextual de TortoiseHG, vaya a Configuración global y luego Extensiones: active la extensión MQ y la extensión Rebase. Esto no daña la compatibilidad entre repositorios.
  • Ahora que estás aquí, podrías:
    • Tira donde comenzó tu marcador (esto probablemente soluciona tu problema)
    • Para una visualización más fácil, tal vez podría modificar sus cambios en el frente y luego despojarlos después. Acabo de mencionar rebase porque podría ser algo útil para usted en otro momento.

Además, en git puedes tener "sucursales locales privadas" porque tienes que empujarlas explícitamente y luego puedes eliminarlas. En Mercurial empuja todo lo que tiene , sin embargo, si desea evitar esto , puede usar la función Fases y marcar un conjunto de revisiones como secreto . Las revisiones secretas no serán empujadas.

Finalmente, no está haciendo nada malo , solo tenga en cuenta que son solo herramientas diferentes construidas con mentalidades ligeramente diferentes, que se reducen a: modificar el historial (git) o ​​no modificar el historial (hg). En Mercurial es más difícil dispararte al pie modificando la historia (especialmente con Fases) y es por eso que a algunos les gusta más que git .

dukeofgaming
fuente
No hay forma de garantizar que todas las copias descentralizadas de conjuntos de cambios que registran una rama con nombre se hayan eliminado después de la ejecución hg strip. Supongo que uno podría argumentar lo mismo sobre las copias descentralizadas de los nombres de las ramas de Git, excepto la distinción de que las ramas con nombre tienen un espacio de nombre global y los nombres de las ramas de Git no. Y existen múltiples cabezas debido a las ramas de nombre. Es un error de diseño infeccioso para un VCS descentralizado.
Shelby Moore III
1

Creo que con mercurial es más fácil no preocuparse por las ramas. Solo encuentro en qué parte de la historia quiero editar y crear confirmaciones según sea necesario (también conocido como ramas anónimas). A veces, los marcadores pueden ser útiles si tengo que saltar entre cabezas en diferentes contextos, pero a menudo no me molesto con ellos. Las ramas con nombre están bien para las ramas de larga duración (ramas de corrección de errores, ramas de proyecto), pero para las correcciones de 1 o 2 confirmaciones, no son la herramienta adecuada para el trabajo.

El truco con las ramas anónimas es establecer su fase en "secreto" si no quiere empujarlas, es decir, si desea mantenerlas locales. Si usted no quiere empujar ellos, pero que no quiere tener más confirmaciones basados en ellos, que acaba de cometer un "--close-rama" en la parte superior de ellos lo que significa que ya no aparecen en la lista de 'cabezas' y mercurial dejará de quejarse de múltiples cabezas en esa rama.

bc.cam
fuente
-1

Creo que simplemente podemos usar marcador en lugar de rama; De todos modos, vamos a seguir apoyando el producto, y fusionar dos sucursales a largo plazo sería un gran dolor de cabeza.

Weijing Lin
fuente