La página de manual de git-config enumera estas opciones para push.default:
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, asumiría que empujar a una rama ascendente de una rama sería lo mismo que empujar a una rama del mismo nombre, ya 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 aguas arriba. Entonces, ¿cuál es la diferencia?
ACTUALIZACIÓN : La página de manual de git-config se ha actualizado (como era de esperar), por lo que las distinciones hechas allí pueden ser mucho más claras ahora.
git
git-branch
git-push
iconoclasta
fuente
fuente
push.default is unset; its implicit value is changing in Git 2.0
y sobrematching
vs,simple
consulte stackoverflow.com/questions/13148066/…Respuestas:
Ha resumido la diferencia en su pregunta.
upstream
empuja a la rama ascendente configurada , mientras quecurrent
asume que la rama ascendente tiene el mismo nombre que la rama local actual , y empuja a ese nombre específico. En realidad, no hay razón para suponer que la rama de seguimiento ascendente de una sucursal local tenga el mismo nombre que la sucursal local.Por ejemplo, si trabaja en varios repositorios o en muchos controles remotos de desarrollador compartidos, a menudo termina rastreando diferentes bifurcaciones de la misma rama, como
allen-master
osusan-master
, las cuales rastrean lamaster
rama en los repositorios de Allen y Susan, respectivamente. En este caso,current
sería la configuración incorrecta, porque esos nombres de sucursales 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
yproduction
. Su flujo de trabajo puede usar una rama de línea principal diferente para cada uno, pero eso puede resultar confuso. Suponga que es un integrador de código y desea rastrear lasmaster
ramas de ambos repositorios por separado.Ahora tienes dos ramas que rastrean sus respectivos repositorios, ninguna de las cuales usa la
master
convención de nomenclatura en absoluto. Hay poca confusión sobre los nombres de las ramas: describen explícitamente lo que rastrean. Sin embargo,push.default = current
no tendría ningún sentido ya que ninguno de los controles remotos contiene una ramadevelopment
oproduction
.fuente
upstream
se prefierecurrent
. Creo que es bastante obvio, por lo que debería dar un ejemplo para el caso contrario.current
es mejor en el caso de que seas un desarrollador nuevo porque no necesitasgit config
mucho, especialmente si has clonado desde algún lugar.current
empuja hacia o crea-luego-empuja-a ramas homónimas en el repositorio remoto por usted si aún no existen, mientras quesimple
se negará a hacer esto directamente cuando una rama del mismo nombre no exista ya.upstream
tiene el mismo comportamiento en este caso a menos que se haya establecido explícitamente una rama ascendente o se haya establecido de otra manera como se menciona en la respuesta de Yawar .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 de su rama actual. Eso significa que empujar y tirar de forma predeterminada se sincronizará con esta rama. La rama ascendente puede estar en el mismo repositorio que la rama actual. Puede hacer cosas interesantes como configurar su rama maestra local como aguas arriba de su rama de característica local (tema) y empujar y tirar entre ellas.
La configuración ascendente implícita se realiza mediante el
branch.autosetupmerge
valor de configuración. Puede encontrar documentación en lagit config
página de ayuda. La configuración ascendente explícita se realiza con la-u
opción delgit branch
comando. Consulte la página de ayuda para obtener más detalles.fuente
branch.autoSetupMerge
que piense lo mismo que-u
/--set-upstream
. Al menos, no veo nada en la documentación que implique que hace que git push se comporte como si fuera llamado-u
por defecto, que es lo que me parece que estás diciendo. ¿Puede aclarar lo que quiso decir?branch.autoSetupMerge
configuración de forma predeterminada crea una nueva rama local y la establece en sentido ascendente como rama de seguimiento remoto. Esta acción implícita se puede realizar explícitamente utilizando las banderas-t
(--track
) o-u ...
(--set-upstream-to=...
), que hacen lo mismo con sintaxis ligeramente diferentes.git push
, asumí (erróneamente) que estabas hablando de la-u
opción degit push
, en lugar de la-u
opción degit branch
. Perdón por la confusión :)