'git branch -av' mostra il ramo remoto che non esiste più


168

Questa è probabilmente una domanda stupida, ma sono nuovo di zecca e sto vedendo un ramo remoto che non esiste più.

$ git branch -a
* master
  remotes/origin/master
  remotes/origin/production

Non credo che il ramo di produzione esista da remoto e non riesca a capire perché sia ​​ancora visibile localmente. Come posso eliminare / rimuovere questo ramo? Ecco come appare un tentativo di rimuoverlo:

$ git push origin :production

error: unable to push to unqualified destination: production
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@IP:puppet.git'

Posso controllare il ramo di produzione apparentemente remoto ma ottenere questo:

$ git checkout origin/production
Note: checking out 'origin/production'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at c323996... added powerdns module, no really

Non ho idea di cosa diavolo sto facendo. Qualsiasi aiuto sarebbe apprezzato.


qual è l'output di git branch -aafter a git fetch?
alediaferia,


Il duplicato che ho proposto ha una risposta che spiega molto più di quanto fatto qui.
Cascabel,

Risposte:


338

Devi fare:

git remote prune origin

8
Grazie che ha funzionato! Puoi approfondire cosa sta succedendo dietro le quinte?
CarpeNoctem,

12
Si tratta di filiali di tracciamento remoto nel repository locale e è necessario cancellarle se i rami vengono eliminati nel repository remoto.
Manojlds

2
Raramente trovo e realizzo così rapidamente una domanda e una risposta così semplici.
jleach,

Superbo. Nel mio locale stavo vedendo strani rami che non avevano alcuna connessione con il repository code base. Quando ho eseguito questo comando, ha sintonizzato il mio ramo di origine locale e poi ho aggiunto il master a monte .grazie
Ankur Srivastava

54

Quindi ci sono due problemi. In entrambi i casi, ricorda che Git è distribuito.

Primo. Quando fai cose del genere

$ git branch -a

l'operazione viene eseguita sul repository locale NON sul computer remoto. In altre parole, il tuo repository locale sta segnalando tutte le filiali di cui è a conoscenza. Questi potrebbero essere rami locali (come "master") o rami remoti recuperati da un telecomando. Dall'ultimo recupero, il ramo "produzione" del repository remoto è cambiato, ma il repository locale non lo sa. La risposta di manijlds è corretta. Correre

$ git origine prugna remota

per rimuovere i rami stantii.

Il comando 'git push origin: production' è usato per cancellare il ramo dal repository git del computer remoto. Non il tuo repository locale. In questo caso, qualcun altro ha già eliminato il ramo nel repository git del computer remoto, quindi viene visualizzato questo messaggio di errore.

Ecco un link che riassume questi comandi.

Il secondo problema riguarda il checkout.

Quando si estrae un ramo, si desidera farlo da un ramo locale , non dal ramo remoto. Ecco perché viene visualizzato l'errore relativo a una HEAD staccata. Il repository git-notes ha una buona spiegazione del problema con dettagli cruenti. Fondamentalmente la frase chiave è

Tuttavia, quando si esegue il checkout di qualsiasi cosa che non sia un nome di ramo locale corretto, HEAD non è più un riferimento simbolico a nulla. Al contrario, contiene effettivamente l'hash SHA-1 (l'id commit) del commit a cui stai passando.

Ora, come verificare un ramo locale, che è lo stesso del ramo remoto?

Facile, crei una filiale locale, al momento del checkout della filiale remota.

$ git checkout -b origine / produzione my_local_branch


20
git remote prune origin

è giusto, solo aggiungendo che puoi usare l' --dry-runopzione, che riporta quali rami saranno potati dal tuo repository locale, ma in realtà non li pota

git remote prune origin --dry-run
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.