„git branch -av” pokazuje zdalną gałąź, która już nie istnieje

168

To prawdopodobnie głupie pytanie, ale jestem nowy w git i widzę zdalną gałąź, która już nie istnieje.

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

Nie wierzę, że gałąź produkcyjna istnieje zdalnie i nie mogę zrozumieć, dlaczego nadal jest wyświetlana lokalnie. Jak mogę usunąć / usunąć tę gałąź? Oto jak wygląda próba jego usunięcia:

$ 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'

Mogę sprawdzić rzekomo zdalną gałąź produkcyjną, ale otrzymuję to:

$ 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

Nie mam pojęcia, co do cholery robię. Każda pomoc będzie mile widziana.

CarpeNoctem
źródło
jaki jest wynik git branch -apo git fetch?
alediaferia
Duplikat, który zaproponowałem, ma odpowiedź, która wyjaśnia znacznie więcej niż zrobili to manojlds.
Cascabel,

Odpowiedzi:

338

Musisz zrobić:

git remote prune origin
manojlds
źródło
8
Dzięki, że zadziałało! Czy możesz wyjaśnić, co dzieje się za kulisami?
CarpeNoctem
12
Są to gałęzie zdalnego śledzenia w lokalnym repozytorium i musisz je wyczyścić, jeśli gałęzie zostaną usunięte ze zdalnego repozytorium.
manojlds
2
Rzadko kiedy tak szybko znajduję i wdrażam tak proste pytanie i odpowiedź.
jleach
Świetny. W moim lokalnym widziałem dziwne gałęzie, które nie miały połączenia z repozytorium kodu bazowego. Kiedy uruchomiłem to polecenie, dostroiłem moją lokalną gałąź źródłową, a następnie dodałem nadrzędnego mastera. Dzięki
Ankur Srivastava
54

Więc są dwa problemy. W obu przypadkach pamiętaj, że Git jest dystrybuowany.

Pierwszy. Kiedy robisz takie rzeczy jak

$ git branch -a

operacja jest wykonywana na lokalnym repozytorium, a NIE na komputerze zdalnym. Innymi słowy, lokalne repozytorium raportuje wszystkie znane mu gałęzie. Mogą to być oddziały lokalne (takie jak „master”) lub gałęzie zdalne pobrane z pilota. Od czasu ostatniego pobrania gałąź „produkcja” zdalnego repozytorium uległa zmianie, ale lokalne repozytorium o tym nie wie. Odpowiedź od manojlds jest prawidłowa. Biegać

$ git zdalne pochodzenie śliwek

aby usunąć nieświeże gałęzie.

Polecenie „git push origin: production” służy do usuwania gałęzi z repozytorium git komputera zdalnego. Nie twoje lokalne repozytorium. W tym przypadku ktoś inny usunął już gałąź w repozytorium git komputera zdalnego, więc zobaczysz ten komunikat o błędzie.

Oto link podsumowujący te polecenia.

Drugi problem dotyczy kasy.

Podczas sprawdzania oddziału chcesz to zrobić z oddziału lokalnego , a nie zdalnego. Dlatego pojawia się błąd dotyczący odłączonej HEAD. W git-notes repo ma dobre wyjaśnienie problemu w gory szczegółach. Zasadniczo frazą kluczową jest

Jednak gdy wyewidencjonujesz cokolwiek, co nie jest poprawną lokalną nazwą oddziału, wówczas HEAD nie jest już symbolicznym odniesieniem do niczego. Zamiast tego faktycznie zawiera skrót SHA-1 (identyfikator zatwierdzenia) zatwierdzenia, na który się przełączasz.

Teraz, jak sprawdzić oddział lokalny, czyli taki sam jak oddział zdalny?

Łatwo, tworzysz oddział lokalny, w momencie kasowania oddziału zdalnego.

$ git checkout -b my_local_branch pochodzenie / produkcja

Pablo Maurin
źródło
20
git remote prune origin

ma rację, wystarczy dodać, że możesz użyć --dry-runopcji, która informuje, które gałęzie zostaną usunięte z lokalnego repozytorium, ale tak naprawdę ich nie przycina

git remote prune origin --dry-run
0xcrab
źródło