TL; versione DR: origin/master
esisteva un ramo di tracciamento remoto , ma non esiste ora, quindi il ramo locale source
sta monitorando qualcosa che non esiste, il che è nella migliore delle ipotesi sospetto — significa che una diversa funzionalità Git non è in grado di fare nulla per te — e Git ti sta avvisando. Stai andando d'accordo senza che la funzionalità di "monitoraggio a monte" funzioni come previsto, quindi dipende da te se cambiare qualcosa.
Per un'altra versione delle impostazioni upstream, vedi Perché devo "git push --set-upstream origin <branch>"?
Questo avviso è una novità di Git, che appare per primo in Git 1.8.5. Le note di rilascio contengono solo un breve punto elenco al riguardo:
- "git branch -v -v" (e "git status") non ha fatto distinzione tra un ramo che non si basa su nessun altro ramo, un ramo che è sincronizzato con il suo ramo a monte e un ramo che è configurato con un monte ramo che non esiste più.
Per descrivere cosa significa, devi prima conoscere i "telecomandi", i "rami di tracciamento remoto" e come Git gestisce il "tracciamento a monte". ( I rami di localizzazione remota sono un termine terribilmente imperfetto: ho iniziato invece a utilizzare nomi di localizzazione remota , che ritengo sia un leggero miglioramento. Di seguito, tuttavia, userò "filiale di localizzazione remota" per coerenza con la documentazione di Git. )
Ogni "telecomando" è semplicemente un nome, come origin
o octopress
in questo caso. Il loro scopo è quello di registrare cose come l'URL completo dei luoghi da cui tu git fetch
o gli git pull
aggiornamenti. Quando usi 1 Git passa a quel telecomando (usando l'URL salvato) e porta il set appropriato di aggiornamenti. Registra anche gli aggiornamenti, utilizzando "filiali di tracciamento remoto".git fetch remote,
Un "ramo di tracciamento remoto" (o nome di tracciamento remoto) è semplicemente una registrazione di un nome di ramo come visto per ultimo su un "ramo" remoto. Ogni telecomando è esso stesso un repository Git, quindi ha rami. I rami su "origine" remota sono registrati nel repository locale in remotes/origin/
. Il testo che ha mostrato dice che c'è un ramo di nome source
su origin
e rami con nome 2.1
, linklog
e così via su octopress
.
(Un ramo "normale" o "locale", ovviamente, è solo un nome di ramo che hai creato nel tuo repository.)
Infine, puoi impostare un ramo (locale) per "tracciare" un "ramo di tracciamento remoto". Una volta L
impostato il ramo locale per tenere traccia del ramo di tracciamento remoto R
, Git chiamerà il R
suo "upstream" e ti dirà se sei "avanti" e / o "dietro" l'upstream (in termini di commit). È normale (anche raccomandabile) che il ramo locale e i rami di tracciamento remoto utilizzino lo stesso nome (tranne la parte del prefisso remoto), come source
e origin/source
, ma non è effettivamente necessario.
E in questo caso, ciò non accade. Hai una filiale locale che source
traccia un ramo di localizzazione remoto origin/master
.
Non dovresti conoscere l'esatta meccanica di come Git imposta un ramo locale per seguirne uno remoto, ma sono rilevanti di seguito, quindi mostrerò come funziona. Si comincia con il tuo nome filiale locale, source
. Esistono due voci di configurazione che utilizzano questo nome, compitato branch.source.remote
e branch.source.merge
. Dall'output che hai mostrato, è chiaro che entrambi sono impostati, in modo da vedere quanto segue se avessi eseguito i comandi dati:
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
Mettendo insieme questi, 2 questo dice Git che il ramo source
tiene traccia "filiali remote-tracking", origin/master
.
Ma ora guarda l'output di git branch -a
, che mostra tutti i nomi delle filiali di localizzazione e monitoraggio remoto nel tuo repository. I nomi di tracciamento remoto sono elencati in remotes/
... e non è presenteremotes/origin/master
. Presumibilmente c'era, una volta, ma ora non c'è più.
Git ti sta dicendo che puoi rimuovere le informazioni di tracciamento con --unset-upstream
. Questo cancellerà sia branch.source.origin
e branch.source.merge
, e fermerà l'avviso.
Sembra abbastanza probabile che quello che vuoi, però, sia passare dal tracciamento origin/master
al tracciamento di qualcos'altro: probabilmente origin/source
, ma forse uno dei octopress/
nomi.
Puoi farlo con git branch --set-upstream-to
, ad esempio 3 :
$ git branch --set-upstream-to=origin/source
(supponendo che tu sia ancora sul ramo "fonte", e questo origin/source
è l'upstream che desideri, non c'è modo per me di dire quale, se ne hai, vuoi effettivamente, però).
(Vedi anche Come si fa a tracciare un ramo Git esistente come ramo remoto? )
Penso che il modo in cui sei arrivato qui sia che quando hai fatto per la prima volta git clone
, la cosa da cui hai clonato aveva un ramo master
. Hai anche avuto un ramo master
, che è stato impostato per tenere traccia origin/master
(questa è una configurazione standard normale per git). Questo significava che avevi branch.master.remote
e branch.master.merge
impostato, su origin
e refs/heads/master
. Ma poi il tuo origin
telecomando ha cambiato il suo nome da master
a source
. Per abbinare, credo che tu abbia anche cambiato il tuo nome locale da master
a source
. Questo ha cambiato i nomi delle tue impostazioni, da branch.master.remote
a branch.source.remote
e da branch.master.merge
a branch.source.merge
... ma ha lasciato i vecchi valori , quindi branch.source.merge
ora era sbagliato.
Fu a questo punto che il collegamento "upstream" si spezzò, ma nelle versioni Git precedenti alla 1.8.5, Git non notò mai l'impostazione spezzata. Ora che hai 1.8.5, lo sta sottolineando.
Questo copre la maggior parte delle domande, ma non quella "devo ripararla". È probabile che tu stia lavorando da anni alla distruzione, facendo (ad esempio ). Se continui a farlo, continuerà a aggirare il problema, quindi no, non è necessario risolverlo. Se lo desideri, puoi utilizzare per rimuovere l'upstream e interrompere i reclami e non avere alcuna filiale locale contrassegnata come se avesse alcun upstream.git pull remote branch
git pull origin source
--unset-upstream
source
Il punto di avere un monte è quello di rendere più convenienti varie operazioni. Ad esempio, git fetch
seguito da git merge
generalmente "farà la cosa giusta" se l'upstream è impostato correttamente, e git status
successivamente git fetch
ti dirà se il tuo repository corrisponde a quello dell'upstream, per quel ramo.
Se si desidera la comodità, reimpostare l'upstream.
1git pull
utilizza git fetch
, e a partire da Git 1.8.4, questo (finalmente!) Aggiorna anche le informazioni sul "ramo di monitoraggio remoto". Nelle versioni precedenti di Git, gli aggiornamenti non venivano registrati nelle filiali di tracciamento remoto con git pull
, solo con git fetch
. Poiché il tuo Git deve essere almeno la versione 1.8.5, questo non è un problema per te.
2 Bene, questo più una linea di configurazione sto deliberatamente ignorando che si trova sotto remote.origin.fetch
. Git deve mappare il nome "unisci" per capire che è il nome locale completo per il ramo remoto refs/remotes/origin/master
. La mappatura funziona quasi sempre così, quindi è prevedibile che master
vada a origin/master
.
3 Oppure, con git config
. Se vuoi solo impostare l'upstream origin/source
sull'unica parte che deve cambiare è branch.source.merge
, e git config branch.source.merge refs/heads/source
lo faresti. Ma --set-upstream-to
dice quello che vuoi fare, piuttosto che farti andare, fallo manualmente, quindi è un "modo migliore".