Mam gałąź, master
która śledzi gałąź zdalną origin/master
.
Chcę zmienić ich nazwę na master-old
lokalną i zdalną. czy to możliwe?
W przypadku innych użytkowników, którzy śledzili origin/master
(i którzy zawsze aktualizowali swój master
oddział lokalny za pośrednictwem git pull
), co stałoby się po zmianie nazwy oddziału zdalnego?
Czy git pull
nadal będą działać, czy wygeneruje błąd, którego nie będzie w stanie znaleźć origin/master
?
Następnie chcę utworzyć nowy master
oddział (lokalnie i zdalnie). Ponownie, po zrobieniu tego, co stałoby się teraz, gdyby zrobili to inni użytkownicy git pull
?
Myślę, że to wszystko spowodowałoby wiele problemów. Czy istnieje czysty sposób na uzyskanie tego, czego chcę? A może powinienem po prostu odejść bez master
zmian, utworzyć nowy oddział master-new
i popracować nad tym?
źródło
git push -f
wpływa na zdolnośćpull
dowolnego oddziału zdalnego śledzenia.master-old
która wskazuje na to samo zatwierdzenie, co poprzedniamaster
gałąź. Następnie można zastąpićmaster
oddział z nowymi zmianami wykonującmerge
zeours
strategią. Wykonanie scalenia działa, gdy pilot nie zezwala na zmiany inne niż szybkie. Oznacza to również, że inni użytkownicy nie będą wymuszać aktualizacji.master
jest wyjątkowy, o ile jest to jedyna istniejąca gałąź. Gdy masz więcej niż jeden, wszystkie gałęzie są na równi.Odpowiedzi:
Najbliższą rzeczą do zmiany nazwy jest usunięcie, a następnie ponowne utworzenie na pilocie. Na przykład:
Ma to jednak wiele zastrzeżeń. Po pierwsze, żadne istniejące kasy nie będą wiedziały o zmianie nazwy - git nie próbuje śledzić nazw gałęzi. Jeśli nowy
master
jeszcze nie istnieje, git pull spowoduje błąd. Jeśli nowymaster
został utworzony. pull spróbuje połączyćmaster
imaster-old
. Jest to więc ogólnie zły pomysł, chyba że współpracujesz z każdym, kto wcześniej sprawdził repozytorium.Uwaga: nowsze wersje git domyślnie nie pozwalają na zdalne usunięcie gałęzi master. Możesz to zmienić, ustawiając
receive.denyDeleteCurrent
wartość konfiguracji nawarn
lubignore
w zdalnym repozytorium. W przeciwnym razie, jeśli jesteś gotowy, aby od razu utworzyć nowego mistrza, pomińgit push remote :master
krok i przejdź--force
dogit push remote master
kroku. Pamiętaj, że jeśli nie możesz zmienić konfiguracji pilota, nie będziesz w stanie całkowicie usunąć gałęzi master!To zastrzeżenie dotyczy tylko bieżącej gałęzi (zazwyczaj
master
gałęzi); każdy inny oddział można usunąć i odtworzyć jak wyżej.źródło
new-branch-name
iold-branch-name
zamiastmaster
/master-old
, więc jest to ogólny problem.Zakładając, że aktualnie jesteś na
master
:master-old
gałąź worigin
repozytorium, na podstawiemaster
zatwierdzenia w lokalnym repozytorium.origin/master-old
oddziału (który zostanie automatycznie skonfigurowany poprawnie jako oddział śledzenia).master
to, co chcesz zatwierdzić.master
worigin
repozytorium, aby odzwierciedlić nowy lokalnymaster
.(Jeśli zrobisz to w jakikolwiek inny sposób, potrzebujesz co najmniej jednego kroku, aby upewnić się, że
master-old
jest odpowiednio skonfigurowany do śledzeniaorigin/master-old
. Żadne z innych rozwiązań opublikowanych w momencie pisania tego tekstu nie obejmuje tego.)źródło
master
innym oddziale. Pytanie zostało źle zatytułowanych choć prosi o zadanie bardziej skomplikowane niż tylko zmiana nazwy oddziału.master
, mogliby po prostugit fetch && git reset --hard origin/master
zmusić swojego lokalnegomaster
do bycia takim samym jak tenorigin
. Udokumentowałem to, a także bardziej złożony przypadek, w którym masz lokalne zatwierdzeniamaster
W przypadku Git v1.7 myślę, że to się nieco zmieniło. Aktualizacja referencji śledzenia lokalnego oddziału do nowego pilota jest teraz bardzo łatwa.
źródło
--set-upstream
jest następująca: po zmianie nazwy oddziału lokalnie i usunięciu źródła, po prostu zrób:git push -u --all
new_branch
a następnie ostatecznie usunąć pilotamaster
za pomocą 2. linii.git push origin --delete old_branch
jest nieco bardziej czytelne.new-branch-name
Przed usunięciem może być konieczne ręczne przełączenie naold-branch-name
źródło
git branch -d old-branch-name
aby usunąć lokalną starą gałąź.git push remote-name new-branch-name :old-branch-name
.Istnieje wiele sposobów zmiany nazwy oddziału, ale zamierzam skupić się na większym problemie: „jak pozwolić klientom na szybkie przewijanie do przodu i nie musieć lokalnie zadzierać z oddziałami” .
Najpierw szybki obrazek:
To jest naprawdę łatwe do zrobienia; ale nie nadużywaj tego. Cały pomysł opiera się na zobowiązaniach do scalania; ponieważ umożliwiają szybkie przewijanie do przodu i łączą historie gałęzi z inną.
zmiana nazwy oddziału:
utworzenie nowej gałęzi „master”:
utworzenie scalenia zatwierdzenia, aby mieć historię rodzic-dziecko:
i voila.
Działa to, ponieważ utworzenie
merge
zatwierdzenia umożliwia szybkie przekierowanie gałęzi do nowej wersji.za pomocą sensownego komunikatu zatwierdzenia scalania:
źródło
git merge -s ours master-old
jest kluczowym elementem, którego brakuje innym odpowiedziom. Również „łatwe do zrobienia” nie oznacza „łatwe do zrozumienia lub dowiedzenia się”, co wydaje się mieć miejsce w przypadku większości gitów, ale zaczynam dygresję.Zakładam, że wciąż pytasz o tę samą sytuację, co w poprzednim pytaniu . Oznacza to, że master-new nie będzie zawierał master-old w swojej historii. * Jeśli nazwiesz master-new „master”, skutecznie przepisasz historię. Nie ma znaczenia, jak wejdziesz w stan, w którym mistrz nie jest potomkiem poprzedniej pozycji mistrza, po prostu że jest w tym stanie.
Inni użytkownicy próbujący wyciągnąć, gdy master nie istnieje, po prostu nie będą mogli wyciągnąć swoich ściągów (brak takiego odwołania na zdalnym), a gdy ponownie pojawi się w nowym miejscu, ich ściągnięcia będą musiały spróbować połączyć swojego mistrza z nowym zdalnym masterem, tak jakbyś połączył master-old i master-new w swoim repozytorium. Biorąc pod uwagę to, co próbujesz tutaj zrobić, scalenie miałoby konflikty. (Gdyby zostały rozwiązane, a wynik zostałby zepchnięty z powrotem do repozytorium, byłbyś w jeszcze gorszym stanie - obie wersje historii tam.)
Aby odpowiedzieć na twoje pytanie po prostu: powinieneś zaakceptować fakt, że czasami w twojej historii będą błędy. To jest w porządku. Zdarza się każdemu. Przywrócono zatwierdzenia w repozytorium git.git. Ważne jest to, że po opublikowaniu historii jest to coś, czemu każdy może zaufać.
* Gdyby tak było, byłoby to równoznaczne z wypchnięciem niektórych zmian na master, a następnie utworzeniem nowej gałęzi tam, gdzie kiedyś była. Nie ma problemu.
źródło
Wybrana odpowiedź nie powiodło się, gdy próbowałem go. Zgłasza błąd:
refusing to delete the current branch: refs/heads/master
. Chyba opublikuję to, co dla mnie działa:Sztuką jest wykupienie symbolu zastępczego tuż przed wypchnięciem go do zdalnego repozytorium. Reszta jest oczywista, usunięcie gałęzi master i przekazanie jej do zdalnego repozytorium powinno już działać. Fragment stąd .
źródło
Dobrze. Moje 2 centy. Co powiesz na zalogowanie się na serwerze, przejście do katalogu git i zmianę nazwy gałęzi w czystym repozytorium. Nie ma to wszystkich problemów związanych z ponownym ładowaniem tego samego oddziału. W rzeczywistości „klienci” automatycznie rozpoznają zmodyfikowaną nazwę i zmienią swoje zdalne odwołanie. Następnie (lub wcześniej) możesz również zmodyfikować lokalną nazwę oddziału.
źródło
Co powiesz na:
źródło
To najprostszy i najbardziej „czytelny” sposób, jaki znam:
„Przenieś” oddział lokalny za pomocą -m
Wciśnij gałąź „przeniesiona” do pilota, ustaw „upstream” za pomocą -u
(ustawienie „upstream” zasadniczo „łączy” lokalny oddział ze zdalnym, tak aby działały takie jak pobieranie, ściąganie i wypychanie)
Usuń starą gałąź ze zdalnego
(Twój lokalny oddział już nie istnieje, ponieważ „przeniosłeś” go w pierwszym kroku)
źródło
OK , zmiana nazwy gałęzi zarówno lokalnie, jak i zdalnie jest dość prosta! ...
Jeśli jesteś w oddziale, możesz łatwo zrobić:
git branch -m <branch>
lub jeśli nie, musisz:
git branch -m <your_old_branch> <your_new_branch>
Następnie wciśnij usuwanie do pilota w następujący sposób:
git push origin <your_old_branch>
Teraz gotowe, jeśli podczas próby wypychania wystąpi błąd wysyłania, po prostu wykonaj:
git push --set-upstream origin <your_new_branch>
Tworzę również poniższy obrazek, aby pokazać kroki w prawdziwej linii poleceń, po prostu wykonaj kroki, a będziesz dobrze:
źródło
Możesz wykonać następujące czynności:
Ale forsowanie jest złym pomysłem, jeśli inne osoby współużytkują to repozytorium. Force push spowoduje konflikt historii zmian z nową wersją.
źródło
W celu wykonania zadania można zapisać w skrypcie powłoki:
Na przykład:
Pamiętaj, że tutaj domyślna zdalna nazwa „origin” jest zakodowana na stałe, możesz rozszerzyć skrypt, aby był konfigurowalny!
Następnie ten skrypt może być używany z aliasami bash, aliasami git lub, na przykład, w niestandardowych akcjach sourcetree.
źródło
Uważam, że kluczem jest uświadomienie sobie, że dokonujesz podwójnej zmiany nazwy:
master
namaster-old
i równieżmaster-new
namaster
.Ze wszystkich innych odpowiedzi zsyntetyzowałem to:
gdzie najpierw musimy zdefiniować funkcję
doublerename
Bash:Jest to podobne do zmiany historii
git rebase
, ponieważ zawartość gałęzi jest zupełnie inna, ale różni się tym, że klienci nadal mogą bezpiecznie przewijać do przodugit pull master
.źródło
źródło