Jak działają gałęzie Git? Czy mogę usunąć gałąź główną?

22

Mam projekt, który ma 2 gałęzie, rozwój i produkcję. Nie używam gałęzi master i za każdym razem, gdy piszę git status, mówi mi, jak daleko moja gałąź jest od mistrza.

Kiedy próbuję usunąć gałąź master git branch -d master, usuwa ją ona tylko z mojego lokalnego repozytorium, a nie na zdalnym serwerze git. Jakieś pomysły?

ufk
źródło

Odpowiedzi:

34

W Git gałąź jest tylko uporządkowaną listą zatwierdzeń (aka: checkins). Coś, co może być nieco mylące dla nowych użytkowników, polega na tym, że oddziały nie muszą mieć nazwy (chociaż w większości przypadków chcesz ją mieć); i nie ma nic szczególnego w żadnej konkretnej gałęzi ( mastergałąź ta jest po prostu domyślna, która jest tworzona dla ciebie podczas inicjowania repozytorium).

Prawdopodobnie już to wiesz, ale Git różni się od niektórych innych systemów kontroli wersji, takich jak popularny „Subversion”, ponieważ każda „kopia robocza” (w języku Subversion) jest własnym repozytorium ... w rzeczywistości nie ma nic szczególnie specjalne na temat poszczególnych kopii; z wyjątkiem tego, że jeden egzemplarz został ogólnie uzgodniony jako „kanoniczny”, który służy do przechowywania produktu końcowego.

Wracając do pytania ... repozytorium „kanoniczne”, które sklonowałeś podczas uruchamiania kopii lokalnej, domyślnie zawierało gałąź „master”; i utknęło wokół. Teraz, jeśli miałeś dostęp do komputera zawierającego repozytorium główne, możesz się zalogować i uruchomić:

git branch -d master

Jeśli jednak nie możesz tego zrobić, nadal możesz to zrobić z poziomu lokalnego komputera. git branchKomenda ma -ropcję, która wpływa na zdalne repozytorium. Innymi słowy, uruchomienie następującego polecenia powinno działać:

git branch -d -r master

Zauważ, że w obu tych przypadkach; Zakładam, że masterzostał on całkowicie włączony do historii programowania, w której obecnie znajduje się twoja kopia lokalna. Jeśli nigdy wcześniej nie korzystałeś master(np. Tylko zameldowałeś się w developmentlub production), nie masz się czym martwić. Jeśli jednak (lub ktoś inny) odprawiałeś rzeczy master, możesz mieć problem. Można wymusić usunięcie, zmieniając -dsię -Dw powyższych poleceń; ale gorąco polecam sprawdzenie, co jest masterwcześniej! Jeśli nie masz dostępu do komputera zdalnego, prawdopodobnie nie będziesz w stanie go odzyskać!


Tak poza tym; jeśli ty (lub ktokolwiek inny) jesteś nowy w Git, bardzo polecam przeczytanie Git from the Bottom Up autorstwa Johna Wiegleya . Chociaż użyłem Git trochę sam, zanim znalazłem ten artykuł, tak naprawdę nie rozumiałem, jak to działa, dopóki go nie przeczytałem. Jest to całkiem przydatne!

mparker17
źródło
3
Jakiś czas od napisania mojego oryginalnego komentarza zachowanie gita nieznacznie się zmieniło. Począwszy od wersji 1.7.12 git, git branch -d -r masternie usuwa już zdalnej gałęzi - usuwa wiedzę twojej lokalnej kopii o zdalnej gałęzi. Następnym razem git fetchoddział wróci! Zamiast tego będziesz chciał uruchomić git push origin :master. Zasadniczo przesuwasz gałąź zerową (pusta nazwa gałęzi po lewej stronie :) nad górną gałąź zdalną (nazwa gałęzi po prawej stronie :), skutecznie ją usuwając.
mparker17,
Należy również zauważyć, że po sklonowaniu repozytorium zwykle domyślnie pobiera się wzorzec. Zależy to od referencji HEAD w klonowanym repozytorium. Więc po usunięciu wzorca upewnij się, że HEAD wskazuje domyślnie gałąź, którą chcesz.
Zitrax
Twój link do Git z dołu do góry zmarł, ale wygląda na to, że to jest tekst, do którego się odwołujesz (?) Czy możesz potwierdzić i zaktualizować link w odpowiedzi?
LUB Mapper
LUB Mapper: To jest tekst, o którym mówię: dziękuję za nowy link! Zaktualizowałem link w odpowiedzi.
mparker17
4

masterjest domyślną gałęzią git. Nie wiem, dlaczego jest to takie straszne, gdy git mówi ci, jak daleko jesteś od mistrza, ale jeśli chcesz usunąć gałąź ze zdalnego repozytorium, lokalne usunięcie nie wystarczy. Spróbuj zamiast tego:

git push origin :master

To nie wypchnie niczego (część przed dwukropkiem) do twojego serwera źródłowego i nadpisze master. Innymi słowy, powinien zdalnie usunąć gałąź główną.

innaM
źródło
Otrzymuję: zdalny: błąd: odmowa usunięcia bieżącej gałęzi: refs / heads / master Do github.com ***. Git! [zdalne odrzucenie] master (usunięcie bieżącego oddziału zabronione) błąd: nie udało się przesłać niektórych odnośników do „ github.com ***. git”
Totty.js
1
@Totty może to może pomóc: matthew-brett.github.io/pydagogue/gh_delete_master.html
MEM