2012-08-08 15 views
80

La página del manual de git-config enumera estas opciones para push.default:¿Cuál es la diferencia entre git push.default = current y push.default = upstream?

nothing - do not push anything. 
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default. 
upstream - push the current branch to its upstream branch. 
tracking - deprecated synonym for upstream. 
current - push the current branch to a branch of the same name. 

En la mayoría de los casos yo asumiría que empuja a la rama aguas arriba de una rama sería el mismo efecto que mover a una rama del mismo nombre , dado que la rama ascendente normalmente tendría el mismo nombre, y dado que la rama del mismo nombre ("actual") normalmente (o siempre, por definición?) estaría en sentido ascendente. Entonces, ¿cuál es la diferencia?

ACTUALIZACIÓN: The man page for git-config se ha actualizado (como cabría esperar), por lo que las distinciones hechas there puede ser mucho más claro ahora.

+2

para desarrolladores es realmente molesto diferir estos, por lo que se presenta 'simple' y será el comportamiento predeterminado para git-push. de hecho, apareció en [git 1.7.11] (https://raw.github.com/git/git/master/Documentation/RelNotes/1.7.11.txt) – xhlwill

+14

Para obtener más información sobre la advertencia de git reciente, 'push.default is desarmado su valor implícito está cambiando en Git 2.0' y en "matching" vs 'simple' see http://stackoverflow.com/questions/13148066/warning-push-default-is-unset-its-implicit-value-is-changing -in-git-2-0 – Nate

+0

iconoclaust: No creo que mi edición haya cambiado la integridad de la pregunta, y la información desactualizada solo necesita ser reparada. ¿Por qué hacer que el usuario haga el trabajo extra de hacer clic en el enlace? – Flimm

Respuesta

68

Ha resumido la diferencia en su pregunta. upstream empuja a configurada rama ascendente, mientras que current asume que la rama ascendente tiene el mismo nombre que la rama local actual, y presiona a ese nombre específico. En realidad, no hay ninguna razón para suponer que la sucursal de seguimiento de la sucursal local tenga el mismo nombre que la sucursal local.

Por ejemplo, si trabaja en múltiples repositorios o a través de muchos mandos a distancia para desarrolladores compartidos, que a menudo terminan seguimiento de diferentes horquillas de la misma rama, como allen-master o susan-master, ambos de los cuales un seguimiento de la rama master en repos Allen y de Susan , respectivamente. En este caso, current sería la configuración incorrecta, porque esos nombres de rama no existen en sus controles remotos. upstream, sin embargo, funcionaría bien.

Un ejemplo más práctico podría ser el seguimiento de un repositorio development y production. Su flujo de trabajo podría usar una rama principal diferente para cada uno, pero eso podría confundir. Supongamos que es un integrador de código y desea rastrear las ramas de ambos repositorios master por separado.

git checkout -b production --track production/master 
git checkout -b development --track development/master 

Ahora usted tiene dos ramas que hacen un seguimiento de sus respectivos repositorios, ninguno de los cuales utilizan la convención de nomenclatura master en absoluto. Hay poca confusión sobre los nombres de las sucursales: describen explícitamente lo que rastrean. Sin embargo, push.default = current no tendría ningún sentido ya que ninguno de los remotos contiene una rama development o production.

+6

Estás dando dos ejemplos para cuando 'ascendente' es preferible a 'actual'. Creo que es bastante obvio, por lo que debería dar un ejemplo para el caso contrario. – AndreKR

+1

@AndreKR AFAIK 'current' es mejor en el caso de que seas un desarrollador nuevo porque no necesitas' git config' mucho especialmente si has clonado desde algún lugar. 'current' presiona o crea-luego-empuja-a ramas homónimas en el repositorio remoto * para usted * si no existen ya, mientras que' simple' rehusará hacerlo directamente cuando no exista una rama del mismo nombre ya. 'upstream' tiene el mismo comportamiento en este caso, a menos que una rama ascendente haya sido explícitamente establecida o configurada de otra forma como se menciona en la respuesta de [Yawar] (http://stackoverflow.com/users/20371). – SeldomNeedy

5

current empujará la rama actual a una rama con el mismo nombre en el repositorio remoto.

upstream empujará la rama actual a la rama ascendente.

La rama ascendente es una rama que se ha definido explícita o implícitamente como ascendente desde su rama actual. Eso significa que push y pull por defecto se sincronizarán con esta rama. La rama ascendente puede estar en el mismo repositorio que la rama actual. Puede hacer cosas interesantes como configurar su local rama principal como ascendente desde su local entidad (tema) rama, y ​​empujar y tirar entre ellos.

La configuración ascendente implícita se realiza mediante el valor de configuración branch.autosetupmerge. Puede encontrar documentación en la página de ayuda git config.La configuración explícita en sentido ascendente se realiza con la opción -u al comando git branch. Ver la página de ayuda para más detalles.

Cuestiones relacionadas