W naszym repozytorium GitHub współpracownik usunął gałąź o nazwie release
. Ale kiedy uruchamiam git checkout release
lokalnie, zawsze otrzymuję usuniętą gałąź release
. To samo, nawet gdy sprawdziłem inną gałąź, usunąłem release
gałąź git branch -D release
i uruchomiłem ponownie git checkout release
.
Czy jest coś do naprawienia w repozytorium GitHub, czy powinienem naprawić coś lokalnie?
git branch --remote
generuje po uruchomieniugit fetch
? Konieczne może być przycięcie,git fetch -p
aby zapomnieć o usuniętych zdalnych gałęziach.git branch --remote
wyjścieorigin/release
. Czy chcesz uruchomićgit fetch -p
bez dodatkowych argumentów i czy spowoduje to przycięcie wszystkich usuniętych zdalnych gałęzi?git fetch -p
bez dodatkowych argumentów przycina wszystkie usunięte zdalne gałęzie.Odpowiedzi:
Po usunięciu gałęzi po stronie zdalnej możesz nadal zobaczyć lokalnie wcześniej pobraną gałąź lokalną, patrz:
Usunąłeś tylko „wydanie”, ale nie „piloty / pochodzenie / wydanie”. Usuń to w ten sposób:
Lub usuń wszystkie pobrane gałęzie, które już nie istnieją po drugiej stronie:
źródło
git branch -rd origin/release
to, co robi-r
średnią? Czy to-d
znaczy tak samo jak-D
? Możnagit branch -rd origin/release
zastąpićgit branch -d remotes/origin/release
?List or delete (if used with -d) the remote-tracking branches.
; -D:Shortcut for --delete --force.
git branch -rd origin/release
zastąpićgit branch -d remotes/origin/release
?-r
odnosi się do zdalnych oddziałów, jest potrzebny. Lokalne i zdalne oddziały są przechowywane w różnych katalogach, porównująls -l .git/refs/heads
ils -l .git/refs/remotes
. Możesz także mieć lokalny oddział o nazwie, bezremotes/origin/release
którego można by usunąć-r
. To może wydawać się mylące, ale możesz po prostu bawić się, tworzyć gałęzie o dziwnych nazwach i patrzeć, jak to wygląda.git/
.Gdy oddziały są usuwane zdalnie, musisz przyciąć swoje lokalne repozytorium - najłatwiej to zrobić
Spowoduje to zaktualizowanie lokalnego repozytorium ze wszystkimi zmianami wprowadzonymi w zdalnym repozytorium, ale bez aktualizacji żadnego z lokalnych oddziałów. Po uruchomieniu tego
nie będzie już wyświetlać usuniętej zdalnej gałęzi.
repozytoria git są kompletne, zarówno w twoim systemie, jak i na serwerze. Kiedy więc po raz pierwszy sklonujesz repozytorium, otrzymasz pełną kopię, a lokalny git „wie” o wszystkich zdalnych gałęziach, a także o lokalnych oddziałach. Informacje te nie są synchronizowane automatycznie, więc kiedy twój kolega usunął
release
gałąź na serwerze, lokalne repozytorium git nie straciło pojęcia zdalnegorelease
oddziału. Synchronizacja zgit fetch
aktualizacjami powoduje, że wszystkie lokalne informacje w zdalnych oddziałach są zgodne ze stanem na serwerze (ściśle mówiąc, zdalne repozytorium, gdziekolwiek to jest), ale bez usuwania jakichkolwiek lokalnych informacji w zdalnych oddziałach. Przycinanie za pomocągit fetch -p
(lubgit fetch --prune
lubgit remote prune
) usuwa lokalne informacje ze zdalnych gałęzi, które zostały usunięte.źródło
-p
(--prune
) wymusza to.release
oddział przezgit branch -D release
przedgit checkout release
makegit checkout release
coraz przystankurelease
oddział?git checkout release
automatycznie utworzy gałąź, jeśli istnieje gałąź zdalna o tej nazwie.git branch -D release
już usunąłrelease
gałąź w moim lokalnym repozytorium; Jeśli to drugie, współpracownik usunąłrelease
gałąź na GitHub; Więc nadal nie jestem pewien, dlaczego „automatycznie utworzy gałąź, jeśli istnieje gałąź zdalna o tej nazwie”?Tim: Git jest dystrybuowany VCS, więc kiedy klonujesz repozytorium ze zdalnego do lokalnego, klonuje wszystko (historię). Kiedy więc sklonowałeś swoje repozytorium, miało ono gałąź zwaną release. Ponieważ Twój kolega zdalnie usunął gałąź wydania, dopóki nie wykonasz przycinania
git fetch -p
lub nie usuniesz tej gałęzi jawnie, lokalny będzie miał tę gałąź.źródło
Być może nieco styczna, ale perspektywa tej strony może pomóc zrozumieć ogólny temat usuwania gałęzi:
http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/
Częściowo pokrywają się z tym, co już tu omówiono, ale nacisk kładziony jest na prowadzenie domu: usuwanie oddziałów, zdalnych i lokalnych, które nie są już potrzebne w środowisku współpracy. W szczególności
git branch --merged
polecenie identyfikuje gałęzie, które można bezpiecznie usunąć z powodu połączenia z linią główną (lub dowolną gałęzią, na której Ci zależy). Jeśli współpracujesz, niektóre bardziej wyrafinowane mini skrypty, takie jak ten, prezentują rzeczy w przyjemnym, łatwym do zrozumienia formacie z datami i autorami.(Niestety „miły, strawny” nie dotyczy formatowania samych skryptów).
źródło