La configurazione specifica di fondersi con il <nome del ramo> dal telecomando, ma tale ref non è stato recuperato.


204

Ricevo questo errore per pull:

La configurazione specifica di fondersi con il riferimento 'refs / heads / feature / Sprint4 / ABC-123-Branch' dal telecomando, ma tale ref non è stato recuperato.

Questo errore non arriva per nessun altro ramo.
La particolarità di questo ramo è che è stato creato dal precedente commit di un altro ramo.

Il mio file di configurazione è simile a:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
[remote "origin"]
    url = <url here>
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "new-develop"]
    remote = origin
    merge = refs/heads/new-develop
[branch "feature/Sprint4/ABC-123-Branch"]
    remote = origin
    merge = refs/heads/feature/Sprint4/ABC-123-Branch

Puoi condividere il comando che stai utilizzando per eseguire l'unione?
dchayka,

1
Questo problema può verificarsi quando il ramo remoto è stato eliminato. Ricontrolla se è davvero lì.
Benny Neugebauer, il

4
Lettori futuri: se sai che esiste il ramo remoto, controlla se stai ignorando il caso o meno. Avevo impostato un ramo locale per tracciare un ramo remoto, ma ho digitato il nome del telecomando in tutte le lettere minuscole. Ho appena dovuto riconfigurare local per tenere traccia di origin / BranchName invece di origin / branchname
Jerreck,

Ho appena avuto questo errore e il problema era molto più semplice delle risposte seguenti, avevo perso la mia connessione VPN. Quindi questo è anche l'errore che si ottiene se git non può accedere al server di origine remoto.
Ben Thurley,

Il mio server git era fuori servizio. Questa è la causa.
dellasavia,

Risposte:


151

Cosa significa

Il tuo upstream - il telecomando che chiami - originnon ha più, o forse non ha mai avuto (è impossibile distinguere da queste informazioni da solo) un ramo chiamato feature/Sprint4/ABC-123-Branch. C'è una ragione particolarmente comune per questo: qualcuno (probabilmente non tu, o ricorderai) ha eliminato il ramo in quell'altro repository Git.

Cosa fare

Questo dipende da cosa vuoi . Vedi la sezione di discussione qui sotto. Puoi:

  • creare o ricreare il ramo sul telecomando o
  • eliminare la filiale locale o
  • qualsiasi altra cosa ti venga in mente.

Discussione

Devi essere in esecuzione git pull(se stavi funzionando git mergeotterrai un messaggio di errore diverso o nessun messaggio di errore).

Quando corri git fetch, il tuo Git contatta un altro Git, in base alla urllinea nella [remote "origin"]sezione della tua configurazione. Che Git esegue un comando ( upload-pack) che, tra le altre cose, invia il tuo Git un elenco di tutte le filiali. Puoi usare git ls-remoteper vedere come funziona (provalo, è educativo). Ecco un frammento di ciò che ottengo quando eseguo questo su un repository Git per gitse stesso:

$ git ls-remote origin
From [url]
bbc61680168542cf6fd3ae637bde395c73b76f0f    HEAD
60115f54bda3a127ed3cc8ffc6ab6c771cbceb1b    refs/heads/maint
bbc61680168542cf6fd3ae637bde395c73b76f0f    refs/heads/master
5ace31314f460db9aef2f1e2e1bd58016b1541f1    refs/heads/next
9e085c5399f8c1883cc8cdf175b107a4959d8fa6    refs/heads/pu
dd9985bd6dca5602cb461c4b4987466fa2f31638    refs/heads/todo
[snip]

Le refs/heads/voci elencano tutti i rami esistenti sul telecomando, 1 insieme ai corrispondenti ID di commit (per le refs/tags/voci gli ID possono puntare a contrassegnare oggetti anziché a commit).

Il tuo Git prende ciascuno di questi nomi di diramazione e lo cambia in base alle fetchlinee nella stessa remotesezione. In questo caso, il Git sostituisce refs/heads/mastercon refs/remotes/origin/master, per esempio. Il tuo Git lo fa con ogni nome di ramo che si presenta.

Registra anche i nomi originali nel file speciale FETCH_HEAD(puoi vedere questo file se sbirri nella tua .gitdirectory). Questo file salva i nomi e gli ID recuperati.

Il git pullcomando è inteso come una scorciatoia per praticità: viene eseguito git fetchsul telecomando appropriato e quindi git merge(o, se richiesto, git rebase) con qualsiasi argomento necessario per unire (o rebase) come indicato dalla [branch ...]sezione. In questo caso, la tua [branch "feature/Sprint4/ABC-123-Branch"]sezione dice di recuperare da origin, quindi unire con qualsiasi ID trovato sotto il nome refs/heads/feature/Sprint4/ABC-123-Branch.

Dal momento che non è stato trovato nulla con quel nome, si git pulllamenta e si ferma.

Se lo avessi eseguito in due passaggi separati, git fetche quindi git merge(o git rebase), Git avrebbe esaminato i tuoi remotes/origin/rami di tracciamento remoto memorizzati nella cache per vedere in che cosa fondersi o in cui rifarsi. Se non ci fosse tale succursale un in una sola volta, si può ancora avere il ramo a distanza-tracking. In questo caso non si riceverà un messaggio di errore. Se non ci fosse mai un ramo di questo tipo, o se si è eseguito git fetchcon --prune(che rimuove i rami morti di tracciamento remoto), in modo da non avere un ramo di tracciamento remoto corrispondente, si otterrebbe un reclamo, ma si farebbe origin/feature/Sprint4/ABC-123-Branchinvece riferimento .

In entrambi i casi , possiamo concludere che feature/Sprint4/ABC-123-Branchora non esiste sul telecomando denominato origin.

Probabilmente esisteva contemporaneamente e probabilmente hai creato il tuo ramo locale dal ramo di tracciamento remoto. In tal caso, probabilmente hai ancora il ramo di tracciamento remoto. Potresti indagare per vedere chi ha rimosso il ramo dal telecomando e perché, oppure potresti semplicemente spingere qualcosa per ricrearlo o eliminare il ramo di monitoraggio remoto e / o il ramo locale.


1 Beh, almeno tutto ciò che ammetterà . Ma a meno che non abbiano nascosto in modo specifico alcuni riferimenti, l'elenco include tutto.

Modifica, luglio 2020: c'è un nuovo protocollo di recupero che può evitare di elencare tutto , e elenca solo i nomi che Git dice che sta cercando. Questo può aiutare con i repository che hanno un numero enorme di filiali e / o tag. Tuttavia, se il tuo Git è interessato a tutti i nomi possibili, otterrai comunque tutti i nomi qui.


Grazie per aver spiegato cosa fa effettivamente il comando git pull. Sono stato in grado di risolvere il mio problema eseguendo git fetch e quindi unendo.
Fizch

11
Per rimuovere i riferimenti di diramazione remota inesistenti nel repository locale, utilizzaregit remote prune origin
Yoav

1
@ Ben-Uri: sì, o, correre git fetch --prune origin, o insieme fetch.prunea truenella configurazione (tutti e tre sono destinati a fare la stessa cosa, anche se in alcune versioni di Git alcuni di questi non erano abbastanza affidabile).
Torek,

1
Dovresti git checkout <your remote branch>e andar bene (in alcuni casi).
Alexander Shtang,

3
@JonathanBenn: è possibile utilizzare git branch --set-upstream-to=origin/master masterper cambiare l'impostazione upstream per il proprio locale master. Elimina-e-ricrea ha questo come effetto collaterale (supponendo che tu usi lo stile DWIM git checkout masterper crearlo), con un effetto collaterale aggiuntivo che ti costringe masterad abbinarlo origin/master.
Torek,

72

Questo può accadere anche se tu / qualcuno rinominassi il ramo. Quindi segui questi passaggi (se sai che il nome del ramo è stato rinominato) Supponendo che il nome del ramo precedente sia wrong-branch-namee qualcuno lo abbia rinominato in correct-branch-nameSo.

git checkout correct-branch-name

git pull (vedrai questo "La tua configurazione specifica ..")

git branch --unset-upstream

git push --set-upstream origin correct-branch-name

git pull (non otterrai il messaggio precedente)


1
Non è nemmeno necessario git pushe non funzionerà se il ramo corrente si trova dietro il suo telecomando. git pull origin correct-branch-nameè abbastanza.
Pierre,

2
Il comando per impostare l'upstream è sbagliato sopra. Fai un git pull dopo, --unset-upstream, nell'output del pull puoi vedere un errore, con il comando per impostare l'upstream, come sotto, git branch --set-upstream-to = origin / <branch > mybranch
Ankit Marothi,

Ha funzionato bene per me dopo aver rimosso alcuni file di grandi dimensioni dal mio repository e aveva bisogno di tornare a un nuovo repository che ho appena creato
larrytech,

40

Controlla se il tuo ramo remoto è disponibile per il pull. Ho avuto lo stesso problema, finalmente ho capito che il ramo remoto era stato cancellato da qualcuno.


4
È stato lo stesso per me!
Aerin

3
Dopo una richiesta pull, la fusione (ovvero la persona che ha fatto la fusione) ha la possibilità di eliminare il ramo che è stato unito nel ramo di destinazione. Se provi a tirare a quel punto otterrai questo errore.
Artokun,

è vero :)
Malhaar Punjabi

7

Per me è stato un problema di distinzione tra maiuscole e minuscole. La mia filiale locale era Version_feature2 invece di Version_Feature2. Ho ricontrollato il mio ramo usando l'involucro corretto e poi git pull ha funzionato.


2
Anche questo è stato il mio problema. Non è necessario ovvio con nomi di filiali abbastanza lunghi / complicati.
Håkon K. Olafsen,

6

Questo errore può anche essere ricevuto quando il nome del ramo di origine presenta alcuni problemi.

Ad esempio: il ramo di origine è team1-Teame il ramo locale è stato verificato come team1-team. Quindi, questo Tin -Teame tin -teampuò causare tale errore. Questo è successo nel mio caso. Quindi, modificando il nome locale con il nome del ramo di origine, l'errore è stato risolto.


6

Nel mio caso mancava semplicemente il commit iniziale sul ramo remoto, quindi il ramo locale non trovava nulla da estrarre e stava dando quel messaggio di errore.

L'ho fatto:

git commit -m 'first commit' // on remote branch
git pull // on local branch

4

Ho avuto un errore simile quando la causa effettiva era che il mio disco era pieno. Dopo aver eliminato alcuni file, ha git pulliniziato a funzionare come mi aspettavo.


4

Ho continuato a imbattermi in questo problema. Nel mio caso, il commento di @ Jerreck sulle differenze di caso nei nomi dei rami era la causa di questo errore. Alcuni strumenti di Windows non sono consapevoli della distinzione tra maiuscole e minuscole.

Per disattivare la distinzione tra maiuscole e minuscole in git, eseguire questo comando:

git config --global core.ignorecase true

Si noti che ciò avrà un impatto maggiore rispetto ai nomi delle filiali. Ad esempio, se hai "Foo.h" e "foo.h" nella stessa directory (non un'ottima idea durante la creazione di software per Windows), sospetto che non sia possibile disattivare la distinzione tra maiuscole e minuscole.


2

Controlla se qualcuno ha eliminato il ramo dal telecomando.


1

Nel mio caso, avevo eliminato il ramo originale da cui derivava il mio ramo attuale. Quindi nel file .git / config avevo:

[branch "simil2.1.12"]
    remote = origin
    merge = refs/heads/simil2.0.5
    rebase = false

simil2.0.5 è stato eliminato. L'ho sostituito con lo stesso nome di filiale:

[branch "simil2.1.12"]
    remote = origin
    merge = refs/heads/simil2.1.12
    rebase = false

e ha funzionato


1

Puoi facilmente collegare la tua filiale locale con una remota eseguendo:

git checkout <your-local-branch>
git branch --set-upstream-to=origin/<correct-remote-branch> <your-local-branch>
git pull

0

Per me questo è successo perché ho unito uno sviluppatore di succursali in master usando l'interfaccia web e poi ho provato a sincronizzare / estrarre usando VSCode che era aperto sul ramo di sviluppo (è strano che non potrei passare a master senza ottenere questo errore).

git pull
Your configuration specifies to merge with the ref 'refs/heads/dev'
from the remote, but no such ref was fetched.'

Ha senso che non lo trovi refs / heads / dev - per me è stato più semplice eliminare la cartella locale e clonare di nuovo.


0

Ho appena avuto esattamente questo errore quando facevo "git pull" quando il mio disco era pieno. Ha creato un po 'di spazio e tutto ha ripreso a funzionare bene.


0

È possibile modificare il ~/.gitconfigfile nella cartella principale. Qui è dove vengono salvate tutte le impostazioni --global.

In alternativa, utilizzare git config --global --unset-all remote.origin.urle dopo l'esecuzione git fetchcon l'URL del repository.


0

Stavo affrontando lo stesso problema in cui il mio ramo attuale era dev e stavo controllando il ramo MR e facendo git pull da allora in poi. Una soluzione semplice che ho preso è stata la creazione di una nuova cartella per MR Branch e ho eseguito il pull di git seguito da clone git.

Quindi, in sostanza, ho gestito cartelle diverse per inviare il codice a un ramo diverso.


0

Ho appena ricevuto lo stesso errore, quando non ho usato il caso corretto. Potrei dare un'occhiata a "integrazione". Git mi ha detto di eseguire un git pullaggiornamento per il mio ramo. L'ho fatto, ma ho ricevuto l'errore menzionato. Il nome di filiale corretto è "Integrazione" con la "I" maiuscola. Quando ho controllato quel ramo e tirato, ha funzionato senza problemi.


-2

Se un altro pull funziona, significa che la tua connessione Internet non era connessa.


Un certo numero di voti negativi, eppure questa è stata la causa che ho avuto di ricevere questo errore. Avevo Internet ma avevo perso la VPN sul mio server git. Dopo essersi ricollegato alla VPN il pull ha funzionato bene.
Ben Thurley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.