Mam repozytorium w Git. Zrobiłem gałąź, a następnie dokonałem pewnych zmian zarówno w systemie głównym, jak i w gałęzi.
Potem, kilkadziesiąt zatwierdzeń później, zdałem sobie sprawę, że gałąź jest w znacznie lepszym stanie niż master, więc chcę, aby gałąź „stała się” master i zignorowała zmiany w master.
Nie mogę tego scalić, ponieważ nie chcę zachować zmian na poziomie głównym. Co powinienem zrobić?
Dodatkowo : w tym przypadku „stary” wzorzec został już przeniesiony push
do innego repozytorium, takiego jak GitHub. Jak to zmienia rzeczy?
Odpowiedzi:
Problem z pozostałymi dwiema odpowiedziami polega na tym, że nowy mistrz nie ma starego mistrza jako przodka, więc kiedy go popchniesz, wszyscy inni zostaną pomieszani. Oto co chcesz zrobić:
Jeśli chcesz, aby twoja historia była trochę jaśniejsza, polecam dodanie informacji do komunikatu zatwierdzenia scalania, aby wyjaśnić, co zrobiłeś. Zmień drugą linię na:
źródło
--strategy=ours
różni się od--strategy=recursive -Xours
. Tj. „Nasza” może być strategią samą w sobie (wynik będzie aktualną gałęzią bez względu na wszystko) lub przekazana jako opcja strategii „rekurencyjnej” (wprowadzaj zmiany innych gałęzi i automatycznie preferuj zmiany bieżącej gałęzi, gdy wystąpi konflikt ).git merge --strategy=ours master -m "new master"
, żeby to zadziałało.git push
zaraz, jeśli chcesz, aby Twój kod został przekazany zdalnie. Może pojawić się ostrzeżenie:Your branch is ahead of 'origin/master' by 50 commits.
To jest oczekiwane. Po prostu go popchnij! : DUpewnij się, że wszystko jest wypychane do Twojego zdalnego repozytorium (GitHub):
Nadpisz „master” słowem „better_branch”:
Wymuś wypchnięcie do zdalnego repozytorium:
źródło
git reset --hard origin/master
następnym razem, gdy będą chcieli je pobrać, w przeciwnym razie git spróbuje scalić zmiany w ich (teraz) rozbieżnym lokalnym. Niebezpieczeństwa związane z tym wyjaśniono bardziej w tej odpowiedziEdycja: Nie powiedziałeś, że przeszedłeś na publiczne repozytorium! To robi różnicę.
Istnieją dwa sposoby: „brudny” i „czysty”. Załóżmy, że nazwa twojego oddziału
new-master
. To jest czysty sposób:Spowoduje to zmianę plików konfiguracyjnych, aby pasowały do gałęzi o zmienionych nazwach.
Możesz to również zrobić w brudny sposób, który nie zaktualizuje plików konfiguracyjnych. To jest coś, co dzieje się pod maską powyższego ...
źródło
git branch old-master master; git branch -f master new-master
. Utwórz gałąź kopii zapasowej na świeżo, a następnie bezpośrednio przenieś master do new-master. (I przepraszam, że źle napisałeś swoje imię, właśnie to zauważyłem)Zmień nazwę oddziału na
master
:źródło
git checkout master&&git reset --hard better_branch
?Z tego, co rozumiem, możesz rozgałęzić bieżącą gałąź w istniejącą gałąź. Zasadniczo zastąpi to
master
wszystko, co masz w bieżącym oddziale:Gdy to zrobisz, możesz zwykle wypchnąć
master
oddział lokalny , prawdopodobnie wymagając również tutaj parametru force :Bez scalania, bez długich poleceń. Po prostu
branch
ipush
- ale tak, to będzie przepisać historię zmaster
branży, więc jeśli pracujesz w zespole masz wiedzieć, co robisz.Alternatywnie odkryłem, że możesz wypchnąć dowolną gałąź do dowolnej gałęzi zdalnej, więc:
źródło
Odpowiedzi znalazłem w poście na blogu Zamień gałąź główną na inną gałąź w git :
Jest to w zasadzie to samo co odpowiedź Cascabela . Tyle że „opcja”, którą dodał poniżej swojego rozwiązania, jest już osadzona w moim głównym bloku kodu.
Łatwiej jest znaleźć w ten sposób.
Dodaję to jako nową odpowiedź, ponieważ jeśli będę potrzebować tego rozwiązania później, chcę mieć cały kod, którego zamierzam użyć w jednym bloku kodu.
W przeciwnym razie mogę skopiować i wkleić, a następnie przeczytać szczegóły poniżej, aby zobaczyć wiersz, który powinienem zmienić - po jego wykonaniu.
źródło
Podane tutaj rozwiązania (zmiana nazwy gałęzi na „master”) nie kładą nacisku na konsekwencje dla zdalnego repozytorium (GitHub):
Jeśli inni wyciągnęli już twoje repozytorium, nie będą w stanie wyciągnąć nowej historii master bez zastąpienia własnego master przez tę nową gałąź master GitHub (lub radzenie sobie z wieloma połączeniami).
Istnieją alternatywy dla git push - force dla publicznych repozytoriów .
Odpowiedź Jefromiego (połączenie odpowiednich zmian z powrotem do pierwotnego mistrza) jest jedną z nich.
źródło
Znalazłem tę prostą metodę, która działa najlepiej. Nie przepisuje historii, a wszystkie poprzednie zameldowania w oddziale zostaną dołączone do wzorca. Nic nie jest stracone i możesz wyraźnie zobaczyć, co się wydarzyło w dzienniku zatwierdzeń.
Cel: uczynienie obecnego stanu „gałęzi” „mistrzem”
Pracując w oddziale, zatwierdzaj i wypychaj zmiany, aby upewnić się, że lokalne i zdalne repozytoria są aktualne:
Następnie twój master będzie dokładnie w stanie twojego ostatniego zatwierdzenia oddziału, a twój główny dziennik zatwierdzeń pokaże wszystkie zameldowania w oddziale.
źródło
Można również pobrać wszystkie pliki z drugiej gałęzi do głównego:
a następnie zatwierdzić wszystkie zmiany.
źródło
Aby dodać do odpowiedzi Jefromiego, jeśli nie chcesz umieszczać bezsensownego scalenia w historii
source
oddziału, możesz utworzyć tymczasową gałąź dlaours
scalenia, a następnie wyrzucić:W ten sposób zatwierdzenie scalania będzie istniało tylko w historii
target
oddziału.Alternatywnie, jeśli w ogóle nie chcesz tworzyć scalenia, możesz po prostu pobrać zawartość
source
i użyć ich do nowego zatwierdzeniatarget
:źródło
Dla mnie chciałem, aby mój diabeł wrócił do mistrza po tym, jak był przed nami.
Podczas opracowywania:
źródło
Mój sposób robienia rzeczy jest następujący
źródło
Jeśli używasz eGit w Eclipse :
źródło
Poniższe kroki są wykonywane w przeglądarce Git obsługiwanej przez Atlassian (serwer Bitbucket)
Wykonanie {current-branch} jako
master
master
i nazwij ją „master-duplicate”.źródło