mercurial - español - tortoisehg svn
¿Cómo eliminar la rama accidental en TortoiseHg? (5)
(Soy un recién llegado relativo a TortoiseHg, así que tenga paciencia conmigo :-) Uso TortoiseHg en dos máquinas para hablar con mi repositorio de origen remoto. Hice cambios en una máquina, los confirmé e intenté enviarlos al repositorio remoto, PERO me olvidé de hacer primero una extracción para obtener primero el código más reciente. El empuje me dio unas pocas líneas de salida, lo que sugiere que me olvidé de tirar primero (¡cierto!) Y mencioné algo como "abortar: empujar crea nuevas sucursales remotas ...".
Así que hice una extracción, que agregó varios nodos al encabezado de mi gráfico en el explorador de repositorio. El problema es que el impulso que intenté hacer ahora se muestra como una rama en el explorador de repositorio. Mirando desde el lado del servidor (codeplex), no muestra signos de mi intento de inserción, lo que indica que esta rama accidental todavía es local en mi máquina.
¿Cómo podría eliminar esta rama accidental? Intenté seleccionar ese nodo en el gráfico y luego hacer "revertir", pero no pareció hacer nada. Me pregunto si sería más simple simplemente descartar mi árbol de directorios en mi máquina local y hacer una extracción completamente nueva y limpia del servidor ...
En el Explorador de repositorio, elija la primera revolución de sus cambios locales, luego haga clic con el botón derecho en la punta de la rama que acaba de extraer y elija "Rebase encima de seleccionado" o "Modificar historial-> Rebase encima de seleccionado" dependiendo de su versión cliente Esto "volverá a basar" sus revoluciones en los extraídos.
Además, para ayudar a evitarlo en el futuro ...
En el Explorador de repositorio, seleccione Herramientas-> Configuración. En la lista desplegable superior izquierda, seleccione "Configuración global del usuario", por lo que esto se aplica a todos los repositorios. A continuación, elija Sincronizar a la izquierda. En "Después de la operación de extracción", seleccione "rebase". Esto hará que sus revisiones locales se "rebasen" en función de las revisiones que acaba de realizar, en lugar de dejarlas en una rama diferente.
Así es como lo hago y es probablemente lo que normalmente quieres.
Para más información, vea el proyecto de rebase y la extensión de rebase .
Esto es cómo hacerlo con la herramienta de línea de comandos. Supongo que se puede asignar fácilmente a TortoiseHg (aunque no estoy seguro, ya que nunca lo uso ...) De todos modos, ya que debería hacerse solo de vez en cuando, creo que no hay ningún problema al usar el terminal aquí. .
Un ejemplo de configuración
Supongamos que su repositorio remoto es algo como esto:
@ changeset: 3:a4c18a1fba12
| tag: tip
| summary: commit 4
|
o changeset: 2:91c5dbfba15c
| summary: commit 3
|
o changeset: 1:4c77cb7952ea
| summary: commit 2
|
o changeset: 0:085dae46f27e
summary: commit 1
A nivel local, no tenía commit 4, por lo que cometió algo directamente sobre commit 3:
@ changeset: 3:39526003350f
| tag: tip
| summary: commit 4 made locally
|
o changeset: 2:91c5dbfba15c
| summary: commit 3
|
o changeset: 1:4c77cb7952ea
| summary: commit 2
|
o changeset: 0:085dae46f27e
summary: commit 1
Así que intentas empujarlo, y recibes este mensaje:
$ hg push
pushing to ssh://[email protected]/brandizzi/mercurial-test-repo
searching for changes
remote has heads on branch ''default'' that are not known locally: a4c18a1fba12
abort: push creates new remote head 39526003350f!
(pull and merge or see "hg help push" for details about pushing new heads)
Según lo solicitado, lo sacas:
$ hg pull
pulling from ssh://[email protected]/brandizzi/mercurial-test-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run ''hg heads'' to see heads, ''hg merge'' to merge)
Lo tienes ahora ...
o changeset: 4:a4c18a1fba12
| summary: commit 4
|
| @ changeset: 3:39526003350f
|/ summary: commit 4 made locally
|
o changeset: 2:91c5dbfba15c
| summary: commit 3
|
o changeset: 1:4c77cb7952ea
| summary: commit 2
|
o changeset: 0:085dae46f27e
summary: commit 1
... pero preferiría no fusionarse según lo solicitado. Quieres tener esto en su lugar:
o changeset: 4:a4c18a1fba12
| summary: commit 4 made locally
|
o changeset: 3:a4c18a1fba12
| summary: commit 4
|
o changeset: 2:91c5dbfba15c
| summary: commit 3
|
o changeset: 1:4c77cb7952ea
| summary: commit 2
|
o changeset: 0:085dae46f27e
summary: commit 1
Y luego quieres empujarlo al repositorio remoto.
¿Cómo se consigue eso?
Resolviendolo
Para obtener eso, no puede haber presionado "commit 4 made local". Además, no hay manera de ponerlo después de los nuevos intentos remotos. Dicho esto, podemos obtener lo que pedimos.
Dicho esto, solo necesitas volver a ingresar tu confirmación local en la nueva confirmación remota:
$ hg rebase --source 3 --dest 4
Si tienes suerte, será suficiente.
Manejo de conflictos
Si no tienes suerte, puedes tener algunos conflictos:
$ hg rebase --source 3 --dest 4
rebasing 3:39526003350f "commit 4 made locally"
merging test.txt
warning: conflicts while merging test.txt! (edit, then use ''hg resolve --mark'')
unresolved conflicts (see hg resolve, then hg rebase --continue)
Luego, solo resuelva los conflictos (editándolos manualmente):
$ hg st
M test.txt
$ nano test.txt # Edit and save
... marcar el archivo como resuelto ...
$ hg resolve --mark
(no more unresolved files)
continue: hg rebase --continue
... y proceder con la rebase:
$ hg rebase --continue
rebasing 3:39526003350f "commit 4 made locally"
saved backup bundle to /home/adam/software/mercurial-test-repo/.hg/strip-backup/39526003350f-64863882-backup.hg
Aquí está tu nueva historia:
@ changeset: 4:ca31fe8a15f0
| summary: commit 4 made locally
|
o changeset: 3:a4c18a1fba12
| summary: commit 4
|
o changeset: 2:91c5dbfba15c
| summary: commit 3
|
o changeset: 1:4c77cb7952ea
| summary: commit 2
|
o changeset: 0:085dae46f27e
summary: commit 1
Ahora, empújalo
$ hg push
pushing to ssh://[email protected]/brandizzi/mercurial-test-repo
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
Esos días, no es tan complejo como solía ser, ¿verdad? :)
Haga un "Combinar con" y marque "Descartar todos los cambios de la revisión del objetivo de combinación (otro)". Por supuesto, debe asegurarse de que el objetivo que se muestra como objetivo de fusión sea realmente el que desea tirar antes de hacer clic en el botón Combinar.
Tenía una sucursal que no quería, pero descubrí que no podía fusionar la sucursal (o para mí era muy difícil averiguar cómo fusionar) porque contenía un conflicto basado en un cambio de caso de nombre de archivo.
En última instancia, decidí hg commit --close-branch
. Ya que la rama había existido solo en mi repositorio local, y no en el que había clonado, ¡el siguiente hg push
ni siquiera se molestó en empujar la rama cerrada hacia el repositorio principal! Muy conveniente. En ese momento, todo lo que tenía que hacer para eliminarlo por completo era eliminar mi repositorio local y volver a clonarlo del "maestro".
Primero asegúrese de haber cometido todos sus cambios locales. Luego fusione las ramas llamando a hg merge
y confirme el resultado.
Esto debería llevarte de vuelta a una sola rama, reuniendo las dos cabezas.