¿Cómo hacer que Git pull use rebase por defecto para todos mis repositorios?

186

¿Hay alguna manera de configurar el repositorio Git del host de manera que se git pullrealice de --rebaseforma predeterminada desde sus clones (locales) ? Al buscar en Stack Overflow, me enteré branch.autosetuprebase, pero necesita ser configurado por clon individualmente.

El flujo de mi proyecto está configurado de manera tal que hacemos pullla developbifurcación antes mergede darle una bifurcación característica. Esto pullcasi siempre se usa --rebase, así que estoy tratando de averiguar si esto puede ser el predeterminado.

Hombre enmascarado
fuente
66
¿Por qué quieres eso? Creo que es más razonable enseñar a los usuarios a pensar activamente sobre qué caso será más apropiado (en función de la magnitud de los cambios que hicieron o esperan de upstream) '
Jonas Schäfer
44
@JonasWielicki Sí, estoy de acuerdo. Es solo que algunos de los miembros de mi equipo son nuevos en Git, y me gustaría saber si hay una manera de hacer que se cumplan para evitar problemas durante la fase inicial (hasta que lo hayan aprendido). El equipo también trabaja de forma remota en una zona horaria diferente, lo que significa que estarían atrapados durante varias horas si algo sale mal. Solo curiosidad por saber si esto es posible.
Hombre enmascarado
1
Creo que especialmente para las configuraciones iniciales, es mejor ir a fusionar. Rebase hace cosas mucho más extrañas si su código realmente diverge. Tienes que resolver los mismos conflictos una y otra vez hasta que empujes. Entonces, si un miembro del equipo quiere trabajar en algún código, siempre usa rebase y no presiona hasta que haya terminado (lo que pueden hacer los recién llegados, en lugar de ramificarse), se enfrentarán a los mismos conflictos que ya han resuelto X veces .
Jonas Schäfer
3
@JonasWielicki Los miembros del equipo hacen hacer una nueva rama para cada nueva característica que trabajan en (y esto, que ya han entendido bastante bien). La necesidad de un rebase surge porque otros desarrolladores se han comprometido con la rama de desarrollo "remota" cuando está listo para impulsar sus cambios. Por lo tanto, me gustaría que haga un rebase de extracción desde el control remoto antes de impulsar sus cambios. El proyecto en sí es bastante maduro, solo el equipo es nuevo. :) Por lo tanto, es una "configuración inicial" solo en términos de personas. ¿Cuál sería su consejo para este escenario?
Hombre enmascarado
55
Respondiendo a su primer comentario, en la mayoría de los casos (casi todos), rebase es la opción correcta, ya que lleva mucho tiempo probar a fondo una nueva función, etc. Para el momento en que se haga esto, seguramente habrá muchos compromisos de otros desarrolladores.
Hombre enmascarado

Respuestas:

205

Ahora hay 3 niveles diferentes de configuración para el comportamiento de extracción predeterminado. De lo más general a lo más fino son:

1) pull.rebase

Establecer esto en truesignifica que git pullsiempre es equivalente a git pull --rebase(a menos que branch.<branchname>.rebaseesté establecido explícitamente en false). Esto también se puede configurar por repositorio o globalmente.

2) branch.autosetuprebase

Establecer esto en alwayssignifica que cada vez que se crea una rama de seguimiento, se creará una entrada de configuración como la siguiente. Para un control más detallado, esto también se puede establecer en never, localo remotese puede configurar por repositorio o globalmente. Ver git config --helppara más detalles.

3) branch.<branchname>.rebase

Establecer esto en truesignifica que esa rama en particular siempre se extraerá de su flujo ascendente a través de rebase, a menos que git pull --no-rebasese use explícitamente.

Conclusión

Entonces, aunque no puede cambiar el comportamiento predeterminado para todos los clones futuros de un repositorio, puede cambiar el valor predeterminado para todos los repositorios del usuario actual (existentes y futuros) a través de git config --global pull.rebase true.

Parker Coates
fuente
44
Gracias por su respuesta. Estaba explorando si podría tener una configuración para que cualquiera que clone el repositorio lo tenga habilitado de forma predeterminada. La configuración anterior se almacenaría en ~/.gitconfig, lo que significa que cada desarrollador que clone el repositorio de host necesitaría ejecutar el comando. No me quejo de su solución. Es bueno, solo quiero confirmar que entendí tu punto correctamente.
Hombre enmascarado
Gracias por la respuesta. De hecho, parece que esto es lo más cerca que uno puede llegar.
Hombre enmascarado
139

Qué tal si

git config --global pull.rebase true

Esto le dirá a git que siempre tire con rebase.

mackuntu
fuente
3
Gracias, esto funciona muy bien para las ramas de seguimiento existentes.
Fls'Zen
1
Por favor, quitar --bool, no es necesario
diralik
38

La respuesta es no.

No hay una manera de configurar un repositorio remoto para que todos los que lo clonen tengan el comportamiento predeterminado de git pullcambiar.

Sin embargo, puede configurar un enlace del lado del servidor que verifique que nadie empuje las confirmaciones de fusión ( algo como esto , tal vez).

También hay algunas opciones de configuración que pueden interesarle. Todos los desarrolladores que clonen desde el repositorio remoto deberán configurarlo ellos mismos manualmente.

1. Opción branch.<name>.rebase

Puede configurar una sucursal local para usar siempre --rebase, de esta manera, reemplazando <name>con un nombre de sucursal:

git config branch.<name>.rebase true

Después de ejecutar esto master, la mastersección en se .git/configveía así:

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2. Opción branch.autosetuprebase

Ejecutar ese comando de configuración anterior para cada rama de Git puede ser una molestia, por lo que puede configurar Git para configurarlo automáticamente para cada nueva rama:

git config branch.autosetuprebase always

(También se puede especificar never, remotey local, véase man git-configpara más detalles.)

Sin la --globalopción, la configuración se guarda .git/configy solo el repositorio actual se ve afectado. Con --global, la configuración se guarda en ~/.gitconfig, y cada repositorio no configurado se ve afectado.

Esta opción no afecta a las sucursales ya existentes.

3. Opción pull.rebase

git config --bool pull.rebase true

(También puedes darle la --globalopción).

Si esta opción es verdadera, la ejecución git pulles equivalente a git pull --rebase, a menos que branch.<name>.rebasese haya establecido en false.

Flimm
fuente
3

Esto hace que la --rebaseopción sea la predeterminada cuando se emite una git pull rama determinada.

@Flimm, necesitaba agregar truepara que tu primera opción funcione.

Entonces la sintaxis correcta es:

git config branch.<branch>.rebase true

Para ejecutar este comando en la developrama:

git config branch.develop.rebase true

Y ahora la developsección en se .git/configve así:

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true
Daishi
fuente
Gracias, he editado mi respuesta, en el futuro, siéntase libre de editar la respuesta usted mismo.
Flimm
2
Donwvoter, sea quien sea, explique sus razones. El voto negativo sin comentario me parece completamente arbitrario y poco constructivo.
Daishi
1

Actualmente no hay forma de establecer la política predeterminada para un repositorio.

Si lo desea para usted y usa al menos git 1.7.9, puede establecer globalmente la pull.rebaseconfiguración de la siguiente manera:

git config --global pull.rebase true

Pero tendrás que hacer en cada máquina. Una opción podría ser configurar la plantilla / esqueleto de inicio del usuario predeterminado con esa opción. Sin embargo, los usuarios pueden cambiar esa opción.

Si no desea fusiones, puede definir un enlace del lado del servidor para rechazar los empujes con fusiones.

Para su referencia, esta es la documentación fuente de pull.rebase:

Cuando sea verdadero, vuelva a crear ramas en la parte superior de la rama obtenida, en lugar de fusionar la rama predeterminada del control remoto predeterminado cuando se ejecuta "git pull". Consulte "branch..rebase" para configurar esto por rama.

Cuando se fusiona, pasa la opción --rebase-merges a git rebase para que las confirmaciones de fusión locales se incluyan en la rebase (ver git-rebase para más detalles).

Al preservar, también pase --preserve-merges a lo largo de git rebase para que los commits de fusión comprometidos localmente no se aplanen ejecutando git pull.

Cuando el valor es interactivo, el rebase se ejecuta en modo interactivo.

NOTA: esta es una operación posiblemente peligrosa; no lo use a menos que comprenda las implicaciones (vea git-rebase para más detalles).

David
fuente