TL; versión DR: la rama de seguimiento remoto origin/master
solía existir, pero ahora no, por lo que la rama localsource
está rastreando algo que no existe, lo que es sospechoso en el mejor de los casos, lo que significa que una función Git diferente no puede hacer nada por usted, y Git te está advirtiendo al respecto. Te has llevado bien sin que la función de "seguimiento ascendente" funcione según lo previsto, por lo que depende de ti cambiar algo.
Para otra versión de la configuración aguas arriba, vea ¿Por qué tengo que "git push --set-upstream origin <branch>"?
Esta advertencia es algo nuevo en Git, que aparece primero en Git 1.8.5. Las notas de la versión contienen solo una pequeña viñeta al respecto:
- "git branch -v -v" (y "git status") no distinguió entre una rama que no está basada en ninguna otra rama, una rama que está sincronizada con su rama ascendente y una rama que está configurada con un flujo ascendente rama que ya no existe.
Para describir lo que significa, primero debe saber sobre "controles remotos", "ramas de seguimiento remoto" y cómo Git maneja el "seguimiento de un flujo ascendente". ( Las ramas de seguimiento remoto son un término terriblemente defectuoso. En su lugar, comencé a usar nombres de seguimiento remoto , lo que creo que es una ligera mejora. Sin embargo, a continuación, usaré "rama de seguimiento remoto" para mantener la coherencia con la documentación de Git. )
Cada "control remoto" es simplemente un nombre, como origin
o octopress
en este caso. Su propósito es registrar cosas como la URL completa de los lugares desde los cuales usted git fetch
o las git pull
actualizaciones. Cuando usa 1 Git va a ese control remoto (usando la URL guardada) y trae el conjunto apropiado de actualizaciones. También registra las actualizaciones, utilizando "ramas de seguimiento remoto".git fetch remote,
Una "rama de seguimiento remoto" (o nombre de seguimiento remoto) es simplemente una grabación del nombre de una rama como se vio por última vez en algún "control remoto". Cada control remoto es en sí mismo un repositorio Git, por lo que tiene ramas. Las ramas en el "origen" remoto se registran en su repositorio local en remotes/origin/
. El texto dice que mostró que hay una rama llamada source
en origin
y ramas nombradas 2.1
, linklog
y así sucesivamente en octopress
.
(Una rama "normal" o "local", por supuesto, es solo un nombre de rama que ha creado en su propio repositorio).
Por último, puede configurar una sucursal (local) para "rastrear" una "sucursal de seguimiento remoto". Una vez que la sucursal local L
está configurada para rastrear la sucursal de seguimiento remoto R
, Git llamará a R
su "flujo ascendente" y le dirá si está "adelante" y / o "detrás" del flujo ascendente (en términos de confirmaciones). Es normal (incluso recomendable) que la rama local y las ramas de seguimiento remoto usen el mismo nombre (excepto la parte de prefijo remoto), como source
y origin/source
, pero eso no es realmente necesario.
Y en este caso, eso no está sucediendo. Tiene una sucursal local que source
rastrea una sucursal de rastreo remoto origin/master
.
Se supone que no debes conocer la mecánica exacta de cómo Git configura una sucursal local para rastrear una remota, pero son relevantes a continuación, así que te mostraré cómo funciona esto. Empezamos con el nombre de la sucursal local source
. Hay dos entradas de configuración que usan este nombre, deletreadas branch.source.remote
y branch.source.merge
. A partir del resultado que mostró, está claro que ambos están configurados, por lo que verá lo siguiente si ejecuta los comandos dados:
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
Poner estos juntos, 2 esto le dice a Git que su rama de source
un seguimiento de su "rama remota de seguimiento", origin/master
.
Pero ahora mire la salida de git branch -a
, que muestra todos los nombres de sucursales de seguimiento local y remoto en su repositorio. Los nombres de seguimiento remoto se enumeran en remotes/
... y no hayremotes/origin/master
. Presumiblemente hubo, en un momento, pero se ha ido ahora.
Git te dice que puedes eliminar la información de seguimiento con --unset-upstream
. Esto eliminará ambos branch.source.origin
y branch.source.merge
, y detendrá la advertencia.
Sin embargo, parece bastante probable que lo que desea es cambiar del seguimiento origin/master
a otro: probablemente origin/source
, pero tal vez uno de los octopress/
nombres.
Puede hacer esto con git branch --set-upstream-to
, 3 por ejemplo:
$ git branch --set-upstream-to=origin/source
(suponiendo que todavía esté en la "fuente" de la rama, y ese origin/source
es el flujo ascendente que desea, no hay forma de que le diga cuál, si es que hay alguna, realmente quiere).
(Consulte también ¿Cómo hacer que una rama Git existente rastree una rama remota? )
Creo que la forma en que llegaste aquí es que cuando hiciste una git clone
, la cosa de la que clonaste tenía una rama master
. También tenía una rama master
, que estaba configurada para rastrear origin/master
(esta es una configuración normal y estándar para git). Esto significaba que tenías branch.master.remote
y estabas branch.master.merge
, a origin
y refs/heads/master
. Pero luego su origin
control remoto cambió su nombre de master
a source
. Para que coincida, creo que también cambiaste tu nombre local de master
a source
. Esto cambió los nombres de su configuración, de branch.master.remote
ay branch.source.remote
de branch.master.merge
a branch.source.merge
... pero dejó los valores anteriores , por branch.source.merge
lo que ahora estaba equivocado.
Fue en este punto que se rompió el enlace "ascendente", pero en las versiones de Git anteriores a 1.8.5, Git nunca notó la configuración rota. Ahora que tiene 1.8.5, está señalando esto.
Eso cubre la mayoría de las preguntas, pero no la pregunta "¿Necesito arreglarlo?". Es probable que haya estado trabajando alrededor de la ruptura durante años, haciendo (p . Ej .). Si sigue haciendo eso, seguirá solucionando el problema, por lo tanto, no, no necesita solucionarlo. Si lo desea, puede usar para eliminar el flujo ascendente y detener las quejas, y no tener la sucursal local marcada como que tiene ningún flujo ascendente.git pull remote branch
git pull origin source
--unset-upstream
source
El punto de tener un flujo ascendente es hacer que varias operaciones sean más convenientes. Por ejemplo, git fetch
seguido de git merge
"generalmente hará lo correcto" si el flujo ascendente está configurado correctamente, y git status
luego git fetch
le dirá si su repositorio coincide con el flujo ascendente, para esa rama.
Si desea la comodidad, vuelva a configurar el flujo ascendente.
1git pull
utiliza git fetch
, y a partir de Git 1.8.4, esto (¡finalmente!) También actualiza la información de la "rama de seguimiento remoto". En versiones anteriores de Git, las actualizaciones no se registraban en ramas de seguimiento remoto con git pull
, solo con git fetch
. Dado que su Git debe ser al menos la versión 1.8.5, esto no es un problema para usted.
2 Bueno, esto más una línea de configuración que estoy ignorando deliberadamente que se encuentra debajo remote.origin.fetch
. Git tiene que mapear el nombre de "fusión" para descubrir que el nombre local completo de la rama remota es refs/remotes/origin/master
. El mapeo casi siempre funciona igual que esto, sin embargo, por lo que es previsible que master
va a origin/master
.
3 O con git config
. Si solo desea establecer el flujo ascendente en origin/source
la única parte que tiene que cambiar es branch.source.merge
, y git config branch.source.merge refs/heads/source
lo haría. Pero --set-upstream-to
dice lo que quiere que se haga, en lugar de obligarlo a hacerlo usted mismo manualmente, así que esa es una "mejor manera".