Soy el único en mi organización que se compromete con el siguiente mensaje:
Combinar la rama de seguimiento remoto 'origen / desarrollo' en desarrollo
No estoy seguro de lo que estoy haciendo para causarlos, pero me gustaría parar.
¿Qué comando estoy emitiendo para crear este commit, y cuál es el comando apropiado que debo usar para no producirlo?
git
branching-and-merging
git-merge
git-remote
Jordan Feldstein
fuente
fuente
git pull --autostash --rebase
Funciona para ti @Johnjohn?Respuestas:
git pull
probablemente está creando el commit. Si realiza una confirmación local y luego se ejecutagit pull
después de que otra persona empuje una confirmación al repositorio, Git descarga la confirmación del otro desarrollador y luego la combina en su sucursal local.Cómo evitar estos compromisos de fusión en el futuro
Podrías usar
git pull --rebase
para evitar que esto suceda en el futuro, pero rebasar tiene sus peligros, y recomiendo evitarlos porpull
completo .En cambio, te animo a que sigas este patrón de uso:
Explicación
git remote update -p
descarga todas las confirmaciones en los repositorios remotos y actualiza las ramas de seguimiento remoto (por ejemplo,origin/master
). NO toca su directorio de trabajo, índice o sucursales locales.El
-p
argumento elimina las ramas aguas arriba eliminadas. Por lo tanto, si lafoo
rama se elimina en elorigin
repositorio,git remote update -p
eliminará automáticamente suorigin/foo
referencia.git merge --ff-only @{u}
le dice a Git que combine la rama ascendente (el@{u}
argumento) en su rama local, pero solo si su rama local puede ser "reenviada rápidamente" a la rama ascendente (en otras palabras, si no ha divergido).git rebase -p @{u}
mueve efectivamente las confirmaciones que ha realizado pero que aún no ha empujado en la parte superior de la rama ascendente, lo que elimina la necesidad de crear las confirmaciones de fusión tontas que está tratando de evitar. Esto mejora la linealidad del historial de desarrollo, lo que facilita su revisión.La
-p
opción le dice a Git que conserve las fusiones. Esto evita que Git linealice las confirmaciones que se vuelven a modificar. Esto es importante si, por ejemplo, fusionó una rama de característica enmaster
. Sin-p
, cada commit en la rama de características se duplicaríamaster
como parte de la linealización realizada porgit rebase
. Esto haría que el historial de desarrollo sea más difícil de revisar, no más fácil.Cuidado :
git rebase
puede que no haga lo que espera que haga, así que revise los resultados antes de presionar. Por ejemplo:Prefiero este enfoque
git pull --rebase
por las siguientes razones:-p
(--preserve-merges
)git rebase
en caso de que necesite volver a crear una fusión intencional (por ejemplo, la fusión de una rama de característica ya insertadamaster
).Taquigrafía: en
git up
lugar degit pull
Para que sea más fácil hacer lo anterior, recomiendo crear un alias llamado
up
:Ahora todo lo que necesita hacer para actualizar su sucursal es ejecutar:
en lugar de
git pull
. Si obtiene un error porque su rama local se ha separado de la rama aguas arriba, esa es su señal para cambiar la base.¿Por qué no
git pull --rebase
?Correr
git pull --rebase
es equivalente a corrergit fetch
seguido degit rebase
. Esto intenta avanzar rápidamente a los nuevos compromisos ascendentes, pero si eso no es posible, entonces cambiará sus compromisos locales en los nuevos compromisos ascendentes. Esto generalmente está bien, pero tenga cuidado:git pull --rebase
no le da la oportunidad de examinar los compromisos antes de incorporarlos. Dependiendo de lo que ha cambiado aguas arriba, es muy posible que rebase es la operación de un malrebase --onto
,merge
,reset
, opush -f
podría ser más apropiado que una llanurarebase
.--preserve-merges
a la operación de rebase, por lo que cualquier fusión intencional de una rama de característica se linealizará, repitiendo (y por lo tanto duplicando) todas las confirmaciones de la rama de característica."Arreglando" una confirmación de fusión existente creada por
git pull
Si aún no ha empujado un compromiso de fusión creado por
git pull
, puede cambiar el compromiso de fusión. Suponiendo que no ha realizado ninguna fusión intencional (p. Ej., Fusionando una rama de función ya insertada en su rama actual), lo siguiente debería hacerlo:El comando anterior le dice a Git que seleccione todas las confirmaciones que no sean de fusión accesibles desde
HEAD
(la confirmación actual), menos todas las confirmaciones accesibles desde@{u}
(que es la abreviatura de "la rama ascendente", es decir,origin/master
siHEAD
esmaster
), reproducción (selección de cereza ) en la parte superior de la rama ascendente, y luego mueva la referencia de la rama actual para que apunte al resultado de reproducir las confirmaciones. Esto mueve efectivamente las confirmaciones sin fusión a la confirmación ascendente más reciente, lo que elimina la fusión creada porgit pull
.Si tiene una confirmación de fusión intencional, no desea ejecutarla
git rebase @{u}
porque reproducirá todo desde la otra rama. Tratar este caso es sustancialmente más complicado, por lo que es bueno usarlogit up
y evitarlo porgit pull
completo. Probablemente tendrá que usarreset
para deshacer la fusión creada porpull
y luego hacergit rebase -p @{u}
. El-p
argumento togit rebase
no ha funcionado de manera confiable para mí, por lo que podría tener que usarreset
para deshacer la fusión intencional, actualizar su sucursal local@{u}
y luego rehacer la fusión intencional (lo cual es una molestia si hubiera mucha fusión peluda conflictos).fuente
-p
. Evité recomendarlo antes porque no se necesita con mucha frecuencia y su comportamiento no está bien documentado.git remote update -p
ygit fetch
?git remote update -p
es lo mismo quegit fetch --all -p
. Tengo la costumbre de usargit remote update -p
cuandofetch
no tenía la-p
opción.Deberias hacer eso. O si quieres seguir usando pull
También puede configurar esa bifurcación en su configuración para volver a crear un rebase automáticamente, o configurarse así automáticamente para cualquier otra bifurcación de seguimiento futura que realice. Entonces puedes volver a usar
Más sobre esto en la sección "pull with rebase en lugar de fusionar" de esta página:
http://mislav.uniqpath.com/2010/07/git-tips/
fuente