TL; DR: git branch --set-upstream-to origin/solaris
La respuesta a la pregunta que hizo, que reformularé un poco como "¿Tengo que configurar un flujo ascendente?" Es: no, no tiene que configurar un flujo ascendente en absoluto.
Sin embargo, si no tiene un flujo ascendente para la rama actual, Git cambia su comportamiento git push
y otros comandos también.
La historia de empuje completa aquí es larga y aburrida y se remonta a la historia anterior a Git versión 1.5. Para acortarlo mucho, git push
se implementó mal. 1 A partir de Git versión 2.0, Git ahora tiene una perilla de configuración deletreada push.default
que ahora está predeterminada simple
. Durante varias versiones de Git antes y después de 2.0, cada vez que se ejecutó git push
, Git podría arrojar un montón de ruido tratando de convencer a establecer push.default
sólo para conseguir git push
que se calle.
No menciona qué versión de Git está ejecutando, ni si ha configurado push.default
, por lo que debemos adivinar. Supongo que está utilizando Git versión 2-point-something, y que ha configurado push.default
para simple
que se calle. Precisamente la versión de Git que tiene, y lo que si hay algo que ha push.default
ajustado en, lo hace la materia, debido a que la historia larga y aburrida, pero al final, el hecho de que usted está recibiendo otra queja de Git indica que su Git es configurado para evitar uno de los errores del pasado.
¿Qué es un upstream?
Un flujo ascendente es simplemente otro nombre de rama, generalmente una rama de seguimiento remoto, asociada con una rama (regular, local).
Cada rama tiene la opción de tener un (1) conjunto ascendente. Es decir, cada rama tiene un flujo ascendente o no tiene un flujo ascendente. Ninguna sucursal puede tener más de una corriente arriba.
El flujo ascendente debería , pero no tiene que ser, una rama válida (ya sea de seguimiento remoto o local ). Es decir, si la rama actual B tiene U ascendente , debería funcionar. Si no funciona, si se queja de que U no existe, la mayoría de Git actúa como si el flujo ascendente no estuviera configurado. Algunos comandos, como , mostrarán la configuración aguas arriba pero la marcarán como "desaparecida".origin/B
master
git rev-parse U
git branch -vv
¿De qué sirve una corriente arriba?
Si push.default
se establece en simple
o upstream
, la configuración ascendente hará que git push
, utilizada sin argumentos adicionales, simplemente funcione.
Eso es todo, eso es todo lo que hace git push
. Pero eso es bastante significativo, ya que git push
es uno de los lugares donde un error tipográfico simple causa grandes dolores de cabeza.
Si su push.default
está configurado en nothing
, matching
o current
, establecer un flujo ascendente no sirve para nada git push
.
(Todo esto supone que su versión de Git es al menos 2.0).
La corriente arriba afecta git fetch
Si ejecuta git fetch
sin argumentos adicionales, Git descubre qué control remoto debe buscar consultando el flujo ascendente de la rama actual. Si el flujo ascendente es una rama de seguimiento remoto, Git obtiene de ese control remoto. (Si el flujo ascendente no está configurado o es una rama local, Git intenta buscarlo origin
).
La corriente arriba afecta git merge
y git rebase
también
Si ejecuta git merge
o git rebase
no tiene argumentos adicionales, Git usa el flujo ascendente de la rama actual. Por lo tanto, acorta el uso de estos dos comandos.
La corriente arriba afecta git pull
Nunca se debe 2 uso git pull
de todos modos, pero si lo hace, git pull
utiliza la configuración de aguas arriba para averiguar qué distancia para buscar a partir, y luego que se ramifican a fusionarse o rebase con. Es decir, git pull
hace lo mismo que, git fetch
porque realmente se ejecuta, git fetch
y luego hace lo mismo que git merge
o git rebase
, porque realmente se ejecuta git merge
o git rebase
.
(Por lo general, solo debe hacer estos dos pasos manualmente, al menos hasta que conozca a Git lo suficientemente bien como para que cuando cualquiera de los pasos falle, lo que eventualmente ocurrirá, reconozca lo que salió mal y sepa qué hacer al respecto).
La corriente arriba afecta git status
Esto en realidad puede ser lo más importante. Una vez que tenga un conjunto ascendente, git status
puede informar la diferencia entre su rama actual y su ascendente, en términos de confirmaciones.
Si, como es el caso normal, usted está en una rama B
con su flujo ascendente establecido y ejecuta , inmediatamente verá si tiene compromisos que puede impulsar y / o compromisos en los que puede fusionar o rebasar.origin/B
git status
Esto se debe a que se git status
ejecuta:
git rev-list --count @{u}..HEAD
: ¿cuántos commits tienes B
que no están en ?origin/B
git rev-list --count HEAD..@{u}
: ¿cuántos commits tienes que no están en ?origin/B
B
Establecer un flujo ascendente le brinda todas estas cosas.
¿Cómo es que master
ya tiene un conjunto aguas arriba?
Cuando clones por primera vez desde un control remoto, usa:
$ git clone git://some.host/path/to/repo.git
o similares, el último paso Git hace es, esencialmente, git checkout master
. Esto verifica tu sucursal local, solo master
que no tienes una sucursal local master
.
Por otra parte, usted no tiene una rama remota de seguimiento de nombre origin/master
, ya que acaba de clonado él.
Git adivina que debe haber significado: "me hace un nuevo local, master
que apunta a la misma se comprometen a distancia como de seguimiento origin/master
, y, mientras estás en ello, ajuste la corriente arriba para master
que origin/master
."
Esto sucede para cada rama git checkout
que aún no tienes. Git crea la rama y la hace "rastrear" (tener como un flujo ascendente) la rama de seguimiento remoto correspondiente.
Pero esto no funciona para nuevas sucursales, es decir, sucursales sin sucursal de seguimiento remoto todavía .
Si crea una nueva rama:
$ git checkout -b solaris
hay, hasta ahora, no origin/solaris
. Su local solaris
no puede rastrear la rama de seguimiento remoto origin/solaris
porque no existe.
Cuando empuja la nueva rama por primera vez:
$ git push origin solaris
eso crea solaris
en origin
, y por lo tanto también crea origin/solaris
en su propio repositorio de Git. Pero es demasiado tarde: ya tienes un local solaris
que no tiene corriente arriba . 3
¿No debería Git configurar eso, ahora, como el flujo ascendente automáticamente?
Probablemente. Ver "implementado mal" y la nota al pie 1. Es difícil cambiar ahora : hay millones 4 de scripts que usan Git y algunos bien pueden depender de su comportamiento actual. Cambiar el comportamiento requiere una nueva versión principal, un programa para forzarlo a establecer algún campo de configuración, etc. En resumen, Git es víctima de su propio éxito: cualquier error que tenga, hoy en día, solo puede repararse si el cambio es mayormente invisible, claramente mucho mejor o se hace lentamente con el tiempo.
El hecho es que no lo hace hoy, a menos que use --set-upstream
o -u
durante el git push
. Eso es lo que te dice el mensaje.
No tienes que hacerlo así. Bueno, como señalamos anteriormente, no tiene que hacerlo en absoluto, pero supongamos que desea un flujo ascendente. Ya ha creado una sucursal solaris
en origin
, a través de una inserción anterior, y como git branch
muestra su salida, ya tiene origin/solaris
en su repositorio local.
Simplemente no lo tiene configurado como upstream solaris
.
Para configurarlo ahora, en lugar de durante el primer impulso, use git branch --set-upstream-to
. El --set-upstream-to
subcomando toma el nombre de cualquier rama existente, como origin/solaris
, y establece la rama actual en sentido ascendente a esa otra rama.
Eso es todo, eso es todo lo que hace, pero tiene todas las implicaciones mencionadas anteriormente. Significa que puede simplemente correr git fetch
, luego mirar a su alrededor, luego correr git merge
o, git rebase
según corresponda, hacer nuevos commits y ejecutar git push
, sin un montón de problemas adicionales.
1 Para ser justos, en ese momento no estaba claro que la implementación inicial fuera propensa a errores. Eso solo quedó claro cuando cada nuevo usuario cometió los mismos errores cada vez. Ahora es "menos pobre", lo que no quiere decir "genial".
2 "Nunca" es un poco fuerte, pero encuentro que los novatos de Git entienden mucho mejor las cosas cuando separo los pasos, especialmente cuando puedo mostrarles lo que git fetch
realmente hizo, y luego pueden ver qué git merge
o qué git rebase
harán a continuación.
3 Si ejecuta su primer git push
como git push -u origin solaris
—es decir, si agrega la -u
bandera— Git se establecerá origin/solaris
como el flujo ascendente para su rama actual si (y solo si) el empuje tiene éxito. Por lo tanto, debe suministrar -u
en el primer empujón. De hecho, puede suministrarlo en cualquier inserción posterior, y establecerá o cambiará el flujo ascendente en ese punto. Pero creo que git branch --set-upstream-to
es más fácil, si lo olvidaste.
4 Medido por el método Austin Powers / Dr Evil de decir simplemente "un MILLLL-YUN", de todos modos.