En un repositorio tengo varias ramas, entre ellas "maestro" y "desarrollo", que se configuran para rastrear ramas remotas "origen / maestro" y "origen / desarrollo".
¿Es posible especificar que quiero que tanto master como desarrollo se fusionen (avance rápido) a la vez?
Cuando lo hago git pull
ahora me sale algo como esto:
remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
5386563..902fb45 develop -> origin/develop
d637d67..ba81fb2 master -> origin/master
Updating 5386563..902fb45
Fast-forward
se obtienen todas las ramas remotas, pero solo la rama en la que estoy actualmente se fusiona con su rama remota correspondiente.
Entonces tengo que hacer git checkout master
...
Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.
... y luego git pull
otra vez, y luego volver a desarrollar, para obtener el resultado deseado.
Sé que puedo hacer alias / scripts que sigan estos pasos. Pero quiero evitar eso si es posible, ya que es propenso a errores y no es muy eficiente .
Editar: ok déjame reformular eso. Mi objetivo no era desalentar o desaprobar la personalización de scripts / alias de git. Preferiría una solución integrada si existe :)
git pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/master
pero eso provocó que el maestro remoto se fusionara con el desarrollo ..pull
en unfetch
seguido por unmerge
en cada rama.Respuestas:
Puede configurar un alias que utilice
git fetch
con refspecs para fusionar rápidamente sus ramas con un solo comando. Configure esto como un alias en su.gitconfig
archivo de usuario :Uso:
git sync
.Aquí es por qué funciona:
git checkout --quiet HEAD
comprueba directamente tu confirmación actual, poniéndote en estado de cabeza separada De esta manera, si está activadomaster
odevelop
separa su copia de trabajo de esos punteros de rama, permitiendo que se muevan (Git no le permitirá mover las referencias de rama mientras su copia de trabajo las haya retirado).git fetch origin master:master develop:develop
usa refspecs confetch
para avanzar rápidamente las ramasmaster
ydevelop
en su repositorio local. La sintaxis básicamente le dice a Git "aquí hay una especificación de referencia de la forma<source>:<destination>
, tómala<destination>
y avanza rápidamente al mismo punto que<source>
". Por lo tanto, las fuentes en el alias son las ramas deorigin
, mientras que los destinos son las versiones locales de repositorio de esas ramas.Finalmente,
git checkout --quiet -
verifica la rama en la que estuvo por última vez, independientemente de si hubo o no una falla en los comandos anteriores. Entonces, si estaba encendidomaster
cuando corriógit sync
, y todo tiene éxito, dejará el estado de la cabeza desconectada y revisará el recién actualizadomaster
.Vea también mi respuesta a git: ¿actualizar una sucursal local sin verificarla? .
fuente
origin/develop
cuando usa el alias? No tendría sentido si fuera sudevelop
sucursal local . Además, el puntero paramaster
se puede mover si esdevelop
que está desprotegido, el punto es que simaster
está desprotegido, entonces no puede avanzar rápidamentemaster
porque eso afectaría su copia de trabajo, así que es por eso que separa la copia de trabajo de ella primero usandogit checkout head
. Vi otra respuesta que lo describió como "parado en una roca", tienes que bajarte de la roca antes de poder moverla.fatal: bad config line xx in file xxx
. que es causado por el punto y coma. tienes que ajustar todo el comando entre comillas dobles para evitar este problema.Instalar git-up . Le da el comando
git-up
que extraerá todas las ramas locales en su repositorio.fuente
Parece que no hay una opción integrada para que git se arrastre en varias ramas. Al menos no en la versión 1.8.0. aunque la respuesta de @ Cupcake está cerca.
Sin embargo, el comentario de @ jjlin me hizo darme cuenta de que al menos no necesito tirar dos veces.
Entonces, una secuencia un poco más eficiente sería:
Inevitablemente terminé creando un alias, pero decidí dejar el tirón, y me concentré en avanzar rápidamente una rama diferente.
Por supuesto, sin pruebas, este alias supone que proporciono un nombre válido de una rama ff'able como primer argumento, y de lo contrario tiene un comportamiento indefinido. Tampoco es óptimo para casos de uso con más de dos ramas, pero me dará lo que necesito por ahora.
fuente