Przełącz nazwy gałęzi w git

103

Może istnieć więcej niż jeden sposób zadawania tego pytania, więc oto opis problemu. Pracowałem nad mistrzem i wykonałem kilka rzeczy, a potem zdecydowałem, że chcę wstrzymać tę pracę. Zrobiłem kopię zapasową kilku zatwierdzeń, a następnie rozgałęziłem się, zanim zacząłem moją bzdurną pracę. Praktycznie to działa dobrze, właśnie teraz mam inną gałąź jako moją główną gałąź rozwoju. Zastanawiam się, jak mógłbym coś zmienić, więc znowu pracuję nad mistrzem, ale nie ma on mojej śmieciowej pracy i powiedziałem, że praca jest na innej gałęzi.

Można to zadać / rozwiązać na kilka sposobów: Jak zmienić nazwę mojej gałęzi master na inną, a następnie zmienić nazwę innej na master? Jak utworzyć kopię zapasową mastera, a następnie sprawić, by wszystkie zmiany, których kopie zapasowe utworzyłem, znajdowały się w innej gałęzi?

Dzięki za wszystkie (szybkie) odpowiedzi! Wszystkie są dobre.

Daniel Benamy
źródło

Odpowiedzi:

144

Oprócz innych komentarzy pomocny może być przełącznik -m (move) do git-branch. Możesz zmienić nazwę swojego starego mastera na coś innego, a następnie zmienić nazwę nowej gałęzi na master:

git branch -m master crap_work
git branch -m previous_master master
Greg Hewgill
źródło
W zależności od przepływu pracy możesz również chcieć zmienić odniesienia do gałęzi w .git / config. Zmieniłem, [branch "crap_work"]aby czytać, [branch "master"]aby ten master nadal się zsynchronizował origin/master. Oczywiście stan dwóch transakcji repo był taki, że nadal miało to sens.
Tytułowy
3
Nie powoduje to zmiany nazw gałęzi w repozytorium zdalnym, tylko w repozytorium lokalnym.
smohadjer,
1
@smohadjer Aby zmienić nazwy pilotów, należy zrobić git push -uf origin masteri git push -u origin crap_work.
zyy
31

Myślę, że powinieneś rozważyć inną strategię rozwoju, aby zapobiec takim problemom. Wydaje się, że najlepiej dla mnie działa programowanie bezpośrednio w mojej głównej gałęzi. Niezależnie od zmian, które wprowadzam, zawsze tworzę nową gałąź dla nowego kodu:

git checkout -b temat / nazwa_temu master

Stamtąd mogę wypchnąć zmiany do repozytoriów publicznych:

git push pu topic / nazwa_tematu

lub ostatecznie po prostu połącz go z powrotem z moją gałęzią główną:

git checkout master && git merge topic / nazwa_taktu

Jeśli naprawdę potrzebujesz cofnąć się do starszego punktu w czasie i ustawić go jako swój wzorzec, możesz zmienić nazwę bieżącej gałęzi na inną, a następnie wypróbować starszą wersję, aby była mistrzem:

 git branch -m master junk
 git co -b master old_sha1_value
Brian Riehman
źródło
To dobra polityka. A jeśli się nad tym zastanowić, widziałem to w praktyce gdzie indziej. Dzięki.
Rimian
14

Zacznij od master, utwórz gałąź o nazwie in-progress, a następnie zresetuj masterdo wcześniejszego zatwierdzenia.

$ git branch in-progress
$ git reset --hard HEAD^
Ted Percival
źródło
1
Nie widzę powodu, dla którego zostałby odrzucony. Zrobiłem to sam kilka razy, zanim dowiedziałem się o gałęzi -m i zdałem sobie sprawę, że mistrz nie jest nieodłącznie związany jako stała nazwa gałęzi.
skiphoppy
7

To jest stosunkowo łatwe:

git checkout -b fake_master master # fake_master now points to the same commit as master
git branch -D master               # get rid of incorrect master
git checkout -b master real_master # master now points to your actual master
git checkout master                # optional -- switch on to your master branch
olliej
źródło
1
Ta ostatnia jest całkowicie opcjonalna - git checkout -btworzy gałąź i uaktywnia ją.
BorisOkunskiy
0

Spowoduje to ustawienie twojego mistrza w dowolnym punkcie w jednym kroku:

git checkout -B master new_point
Penghe Geng
źródło