TL; versione DR: origin/masteresisteva un ramo di tracciamento remoto , ma non esiste ora, quindi il ramo locale sourcesta 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 origino octopressin questo caso. Il loro scopo è quello di registrare cose come l'URL completo dei luoghi da cui tu git fetcho gli git pullaggiornamenti. 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 sourcesu origine rami con nome 2.1, linkloge 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 Limpostato il ramo locale per tenere traccia del ramo di tracciamento remoto R, Git chiamerà il Rsuo "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 sourcee origin/source, ma non è effettivamente necessario.
E in questo caso, ciò non accade. Hai una filiale locale che sourcetraccia 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.remotee 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 sourcetiene 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.origine branch.source.merge, e fermerà l'avviso.
Sembra abbastanza probabile che quello che vuoi, però, sia passare dal tracciamento origin/masteral 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.remotee branch.master.mergeimpostato, su origine refs/heads/master. Ma poi il tuo origintelecomando ha cambiato il suo nome da mastera source. Per abbinare, credo che tu abbia anche cambiato il tuo nome locale da mastera source. Questo ha cambiato i nomi delle tue impostazioni, da branch.master.remotea branch.source.remotee da branch.master.mergea branch.source.merge... ma ha lasciato i vecchi valori , quindi branch.source.mergeora 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 branchgit pull origin source--unset-upstreamsource
Il punto di avere un monte è quello di rendere più convenienti varie operazioni. Ad esempio, git fetchseguito da git mergegeneralmente "farà la cosa giusta" se l'upstream è impostato correttamente, e git statussuccessivamente git fetchti 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 mastervada a origin/master.
3 Oppure, con git config. Se vuoi solo impostare l'upstream origin/sourcesull'unica parte che deve cambiare è branch.source.merge, e git config branch.source.merge refs/heads/source
lo faresti. Ma --set-upstream-todice quello che vuoi fare, piuttosto che farti andare, fallo manualmente, quindi è un "modo migliore".