Usunięcie gałęzi Git

79

Co w Gicie oznacza „usunięcie” gałęzi?

Czy zniknie z repozytorium? Czy nadal będzie można po niej nawigować za pośrednictwem git branch?

To, co naprawdę chcę zrobić, to oznaczyć gałąź jako „ślepą uliczkę”, tj. Gałąź jest tak daleko od mastera, że ​​nikt nie powinien jej używać jako punktu wyjścia, chociaż w tej gałęzi było kilka dobrych pomysłów, więc lubię to zachować w celach informacyjnych.

bobobobo
źródło

Odpowiedzi:

157

Możesz usunąć gałąź, ale najpierw otaguj ją, aby jej historia nie zniknęła. W ten sposób gałąź nie pojawia się na liście gałęzi, co, miejmy nadzieję, powinno zniechęcić ludzi do pracy nad nią, ale praca nie zostanie trwale usunięta (nawet po uruchomieniu czyszczenia pamięci). Na przykład, ilekroć mam gałąź, która stała się nieistotna, ale nie jestem przygotowany do jej trwałego usunięcia, oznaczam ją jako „archive / < nazwa-oddziału >”.

Będąc w masterlub w innym oddziale:

git tag archive/foo foo
git branch -D foo

Spowoduje to utworzenie tagu o nazwie archive/fooz foogałęzi przed usunięciem foo. Możesz również dodać wiadomość do tagu, która wyjaśnia, co jest w gałęzi, dlaczego istniała, dlaczego jest teraz ślepą uliczką itp.

git tag -m 'Foo is deprecated in favor of bar' archive/foo foo

Możliwość rejestrowania, dlaczego gałąź jest przestarzała, jest prawdopodobnie zaletą znakowania w porównaniu z przenoszeniem gałęzi do alternatywnej przestrzeni nazw.

Jeśli kiedykolwiek będziesz musiał wskrzesić gałąź, która została zarchiwizowana w ten sposób, jest to tak proste, jak:

git branch foo archive/foo
git tag -d archive/foo       # Optional

Teraz gałąź jest z powrotem, jakby nigdy nie została usunięta.

Dan Moulding
źródło
5
@sardaukar: To może również działać ze zdalnymi repozytoriami, wypychając tag archiwum (używając --tagsopcji git push), a następnie usuwając zdalną gałąź (używając :<branch-to-delete>refspec podczas wypychania). Na przykład:git tag archive/foo foo; git branch -D foo; git push --tags origin :foo
Dan Molding
Byłoby miło, gdyby git mógł automatycznie informować ludzi, że ta gałąź została zarchiwizowana i pokazywać komunikat o zatwierdzeniu, gdyby ludzie próbowali pobrać z archiwum gałęzi, ale tak się nie stało.
Robin Green
1
Bardzo ładna odpowiedź, dokładnie to, czego szukałem! Dla pewności, czy jest to przydatne, jeśli gałąź została scalona z powrotem do mastera przed usunięciem?
claf
Innym pokrewnym pytaniem (jeśli ktoś nadal śledzi ten wątek) jest to, jak powinienem "zamknąć" (scalić w master lub archiwum w tagu lub czymkolwiek), jeśli w tej gałęzi zaangażowanych było wielu programistów? usunięcie i oznaczenie gałęzi (zarówno lokalnej, jak i zdalnej) nie jest zbyt niegrzeczne dla innych programistów tej gałęzi?
claf
1
ta odpowiedź jest świetnym, genialnym rozwiązaniem
Christopher Thomas,
2

Gałęzie Git są przechowywane jako odwołania do wersji. Jeśli usuniesz gałąź, odniesienie zostanie usunięte; jeśli nic więcej nie odwołuje się do tej wersji, ostatecznie zostanie ona usunięta. Ponadto, jeśli usuniesz gałąź, to poprawnie zniknęła (z repozytorium). Jeśli chcesz oznaczyć gałąź jako przestarzałą, ale zachować ją do późniejszego wykorzystania, możesz przenieść gałąź do podkatalogu:

$ git branch
* master
  testing_feature_one
  testing_feature_two
$ git branch -m testing_feature_one deprecated/testing_feature_one
$ git branch
  deprecated/testing_feature_one
* master
  testing_feature_two

Alternatywnie możesz utworzyć oddzielne repozytorium dla przestarzałych gałęzi, przeciągnąć je, a następnie usunąć z oryginału. W obu przypadkach wpłynie to na wszystkich użytkowników, którzy śledzą gałęzie - zawartość ich repozytorium nie ulegnie zmianie (ani żadna z nazw ich gałęzi), ale jeśli spróbują ponownie pobrać, muszą zmienić cel w swojej konfiguracji.

Andrew Aylett
źródło
2

git branch -D <branchName>usunie twój oddział z repozytorium. Nie będziesz już w stanie go zobaczyć ani nawigować. Utracisz również wszystkie zmiany plików wprowadzone w tej gałęzi.

https://git-scm.com/docs/git-branch

Stewie Griffin
źródło
0

Nie będzie można się po nim poruszać za pośrednictwem gałęzi git i dopóki nie zostanie wykonane czyszczenie pamięci, nie zostanie utracone z repozytorium.

Jeśli chcesz oznaczyć daną gałąź jako ślepą uliczkę, po prostu zrób to (git może nie zrobić tego za Ciebie, ale z pewnością możesz)!

Oznaczanie go (w dowolny sposób) jako odniesienia historycznego działa.

Fałszywy kod Monkey Rashid
źródło