Zmień bieżącą gałąź Git na gałąź master

Mam repozytorium w Git. Zrobiłem gałąź, a następnie dokonałem pewnych zmian zarówno w Mistrzu, jak i w gałęzi.

Potem, dziesiątki commitów 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 zlekceważyła zmiany na master.

Nie mogę go scalić, ponieważ nie chcę trzymać zmian na master. Co mam zrobić?

Extra: W tym przypadku "stary" mistrz został już push - ed do innego repozytorium takie jak GitHub. Jak to wszystko zmienia?

 1340
git
Author: Peter Mortensen, 2010-05-04

13 answers

Problem z pozostałymi dwoma odpowiedziami polega na tym, że nowy mistrz nie ma starego mistrza jako przodka, więc kiedy go wciśniesz, wszyscy inni będą pomieszani. To jest to co chcesz zrobić:

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

Jeśli chcesz, aby Twoja historia była trochę jaśniejsza, zalecam dodanie pewnych informacji do komunikatu merge commit, aby wyjaśnić, co zrobiłeś. Zmień drugi wiersz na:

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message
 1775
Author: Cascabel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-04 06:00:07

Upewnij się, że wszystko jest przesyłane do zdalnego repozytorium (GitHub):

git checkout master

Zastąp "master" za pomocą "better_branch":

git reset --hard better_branch

Wymuś push do zdalnego repozytorium:

git push -f origin master
 178
Author: Brandon Howard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-09 19:35:00

Edit: [5] To wielka różnica.

Są dwa sposoby: "brudny" i "czysty". Załóżmy, że Twoja gałąź ma nazwę new-master. To jest czysty sposób:
git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

Spowoduje to, że pliki konfiguracyjne zmienią się tak, aby pasowały do przemianowanych gałęzi.

Możesz również zrobić to w brudny sposób, co nie spowoduje aktualizacji plików konfiguracyjnych. To jest coś w rodzaju tego, co dzieje się pod maską powyższego...

mv -i .git/refs/new-master .git/refs/master
git checkout master
 65
Author: Dietrich Epp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-04 21:03:29

Zmień nazwę gałęzi na master przez:

git branch -M branch_name master
 40
Author: Alan Haggai Alavi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-04 05:37:19

Podane tutaj rozwiązania (zmiana nazwy gałęzi na 'master') nie nalegają na konsekwencje dla Remote (GitHub) repo:

  • Jeśli nie naciskałeś niczego od czasu tworzenia tej gałęzi, możesz zmienić jej nazwę i wcisnąć ją bez żadnego problemu.
  • Jeśli miałeś push master na Githubie, będziesz musiał 'git push-f' nową gałąź: nie możesz już naciskać w trybie fast forward .
    -f
    --force

Zazwyczaj polecenie odmawia aktualizacji zdalnego ref, który nie jest przodek lokalnego ref, którego użyto do nadpisania. Ta flaga wyłącza czek. Może to spowodować utratę commitów przez zdalne repozytorium; używaj go ostrożnie.

Jeśli inni już wyciągnęli Twoje repo, nie będą w stanie wyciągnąć nowej historii master bez zastąpienia własnego master nową gałęzią Master GitHub (lub radzenia sobie z wieloma połączeniami).
Istniejealternatywa dla git push --force dla Public repos .
odpowiedź Jefromi (łączenie prawej zmiany z powrotem do oryginalnego master) jest jednym z nich.

 12
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:38

Z tego, co rozumiem, możesz rozgałęziać bieżącą gałąź na istniejącą gałąź. W istocie, to nadpisze master z tym, co masz w bieżącej gałęzi:

git branch -f master HEAD

Gdy już to zrobisz, możesz normalnie wcisnąć lokalną gałąź master, prawdopodobnie wymagając parametru force tutaj również:

git push -f origin master

Brak połączeń, brak długich poleceń. Po prostu branch i push - ale tak, to zmieni historię gałęzi master, więc jeśli pracujesz w zespole, możesz muszę wiedzieć, co robisz.




Alternatywnie odkryłem, że możesz wcisnąć dowolną gałąź do dowolnej zdalnej gałęzi, więc:

# This will force push the current branch to the remote master
git push -f origin HEAD:master

# Switch current branch to master
git checkout master

# Reset the local master branch to what's on the remote
git reset --hard origin/master
 10
Author: bfred.it,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-08 11:41:22

Można również wypisać wszystkie pliki z drugiej gałęzi do master:

git checkout master
git checkout better_branch -- .

A następnie zatwierdź wszystkie zmiany.

 6
Author: user2064284,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-17 10:12:24

Uznałem, że ta prosta metoda działa najlepiej. Nie przepisuje historii i wszystkie poprzednie check-iny gałęzi zostaną dołączone do master. Nic nie zostało utracone i możesz wyraźnie zobaczyć, co się wydarzyło w dzienniku zmian.

Cel: uczynić obecny stan "gałęzi ""master"

Pracując nad gałęzią, zatwierdzaj i wypychaj zmiany, aby upewnić się, że lokalne i zdalne repozytoria są aktualne:

git checkout master      # Set local repository to master
git reset --hard branch  # Force working tree and index to branch
git push origin master    # Update remote repository

Po tym, twój Pan będzie dokładny stan twój ostatni commit branch i twój główny dziennik commitów pokażą wszystkie check-iny branch.

 6
Author: Mark Dietel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-22 09:02:44

Aby dodać do odpowiedzi Jefromi, jeśli nie chcesz umieszczać nic nie znaczącego scalenia w historii gałęzi source, możesz utworzyć tymczasową gałąź dla ours scalania, a następnie wyrzucić ją:

git checkout <source>
git checkout -b temp            # temporary branch for merge
git merge -s ours <target>      # create merge commit with contents of <source>
git checkout <target>           # fast forward <target> to merge commit
git merge temp                  # ...
git branch -d temp              # throw temporary branch away

W ten sposób commit merge będzie istniał tylko w historii gałęzi target.

Alternatywnie, jeśli nie chcesz tworzyć scalenia, możesz po prostu pobrać zawartość {[2] } i użyć ich do nowego commita na target:

git checkout <source>                          # fill index with contents of <source>
git symbolic-ref HEAD <target>                 # tell git we're committing on <target>
git commit -m "Setting contents to <source>"   # make an ordinary commit with the contents of <source>
 3
Author: staafl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-08 10:29:53

Znalazłem odpowiedź, którą chciałem w poście na bloguZastąp gałąź master inną gałąź w git:

git checkout feature_branch
git merge -s ours --no-commit master
git commit      # Add a message regarding the replacement that you just did
git checkout master
git merge feature_branch

Jest zasadniczo taka sama jak Cascabel ' s answer . Poza tym ,że" opcja " dodał poniżej jego rozwiązanie jest już osadzone w moim głównym bloku kodu.

Łatwiej jest znaleźć taki sposób.

Dodaję to jako nową odpowiedź, ponieważ jeśli będę potrzebował tego rozwiązania później, chcę mieć Wszystkie kod I zamierzam użyć w jednym bloku kodu.

W przeciwnym razie mogę kopiować-wklejać, następnie przeczytaj szczegóły poniżej, aby zobaczyć linię, którą ja powinienem zmienić - po tym, jak już go wykonałem.

 3
Author: SherylHohman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-19 18:14:09

Mój sposób robienia rzeczy jest następujący

#Backup branch
git checkout -b master_backup
git push origin master_backup
git checkout master
#Hard Reset master branch to the last common commit
git reset --hard e8c8597
#Merge
git merge develop
 0
Author: ar-g,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-12 10:09:14

Jeśli używasz eGit w Eclipse :

  • Kliknij prawym przyciskiem myszy węzeł projektu.
  • Wybierz Team → następnie Advanced → następnie Zmień nazwę gałęzi
  • następnie rozwiń folder remote tracking .
  • Wybierz gałąź o niewłaściwej nazwie, a następnie kliknij przycisk Zmień nazwę, Zmień nazwę na dowolną nową nazwę.
  • wybierz nowy master, a następnie zmień jego nazwę NA master.
 0
Author: Junchen Liu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-19 18:15:36

Następujące kroki są wykonywane w przeglądarce Git obsługiwanej przez Atlassian (Bitbucket server)

Tworzenie {current-branch} jako master

  1. Utwórz gałąź z {[0] } i nazwij ją "Master-duplicate".
  2. Utwórz gałąź z {current-branch} i nazwij ją "{current-branch} - copy".
  3. w ustawieniu repozytorium (Bitbucket) Zmień "domyślną gałąź" na "Master-duplicate" (bez tego kroku nie będziesz mógł usunąć master - "W następnym step").
  4. Usuń gałąź "master" - zrobiłem ten krok z drzewa źródłowego (możesz to zrobić z przeglądarki CLI lub Git)
  5. Zmień nazwę" {current-branch} "na" master "i wypchnij do repozytorium (spowoduje to utworzenie nowej gałęzi "master " nadal" {current-branch} " będzie istnieć).
  6. w Ustawieniach repozytorium Zmień " domyślną gałąź "na"master".
 -1
Author: Purushothaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-19 18:12:06