Zmiana nazwy gałęzi master zarówno dla repozytoriów lokalnych jak i zdalnych Git

Mam gałąź master, która śledzi odległą gałąź origin/master.

Chcę zmienić ich nazwę na master-old zarówno lokalnie, jak i na pilocie. Czy to możliwe? W przypadku innych użytkowników, którzy śledzili origin/master (i którzy zawsze aktualizowali swoją lokalną gałąź master poprzez git pull), co się stanie po zmianie nazwy zdalnej gałęzi? Czy ich git pull nadal działa, czy może wyrzuci błąd, którego nie może już Znaleźć origin/master?

Następnie chcę utworzyć nową gałąź master (zarówno lokalnie jak i zdalne). Co by się stało, gdyby zrobili to inni użytkownicy git pull?

Myślę, że to wszystko spowoduje wiele kłopotów. Czy jest czysty sposób, aby dostać to, czego chcę? A może po prostu zostawić master tak jak jest i utworzyć nową gałąź master-new i po prostu pracować tam dalej?

Author: Albert, 2009-10-06

15 answers

Najbliższą rzeczą do zmiany nazwy jest usunięcie, a następnie ponowne utworzenie na pilocie. Na przykład:

git branch -m master master-old
git push remote :master         # delete master
git push remote master-old      # create master-old on remote

git checkout -b master some-ref # create a new local master
git push remote master          # create master on remote

Jednak ma to wiele zastrzeżeń. Po pierwsze, żadne istniejące kasy nie będą wiedzieć o zmianie nazwy-git próbuje śledzić zmiany nazw gałęzi , a nie. Jeśli nowa master jeszcze nie istnieje, git pull wyświetli błąd. Jeśli nowa master została utworzona. pociągnięcie spróbuje połączyć master i master-old. Więc to generalnie zły pomysł, chyba że masz współpracę z każdym, kto ma sprawdzałem repozytorium wcześniej.

Uwaga: nowsze wersje git domyślnie nie pozwalają na zdalne usunięcie gałęzi master. Można to nadpisać, ustawiając wartość konfiguracyjną receive.denyDeleteCurrent na warn lub ignore w zdalnym repozytorium . W przeciwnym razie, jeśli chcesz od razu utworzyć nowy master, pomiń krok git push remote :master i przekaż --force do kroku git push remote master. Pamiętaj, że jeśli nie będziesz w stanie zmienić konfiguracji pilota, nie będziesz w stanie całkowicie usunąć Mistrzu branch!

To zastrzeżenie dotyczy tylko bieżącej gałęzi (Zwykle gałęzi master); każda inna gałąź może zostać usunięta i odtworzona jak powyżej.

 577
Author: bdonlan,
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
2014-08-12 14:32:00

Zakładając, że aktualnie jesteś na master:

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4
  1. najpierw Utwórz gałąź master-old w repozytorium origin, opartą na commicie master w repozytorium lokalnym.
  2. Utwórz nową lokalną gałąź dla nowej gałęzi origin/master-old (która zostanie automatycznie poprawnie skonfigurowana jako gałąź śledząca).
  3. teraz wskaż lokalny master na dowolny commit, na który chcesz go wskazać.
  4. na koniec Wymuś zmianę master w repozytorium origin, aby odzwierciedlić Twój nowy lokalny master.

(jeśli zrobisz to w jakikolwiek inny sposób, potrzebujesz co najmniej jednego kroku, aby upewnić się, że master-old jest prawidłowo skonfigurowany do śledzenia origin/master-old. Żadne z innych rozwiązań opublikowanych w czasie pisania tego tekstu nie zawiera tego.)

 242
Author: Aristotle Pagaltzis,
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-09-24 20:26:43

Z Git v1. 7, myślę, że to się nieco zmieniło. Zaktualizowanie referencji śledzenia oddziału lokalnego do nowego pilota jest teraz bardzo łatwe.

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote
 148
Author: Excalibur,
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
2013-04-25 17:22:13
git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

Być może będziesz musiał ręcznie przełączyć się na new-branch-name przed usunięciem old-branch-name

 35
Author: Treken,
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
2014-03-12 11:43:27

Istnieje wiele sposobów na zmianę nazwy gałęzi, ale skupię się na większym problemie: "Jak umożliwić klientom szybkie przewijanie do przodu i nie musieć mieszać ze swoimi gałęziami lokalnie" .

Najpierw szybkie zdjęcie: zmiana nazwy gałęzi master i umożliwienie klientom szybkiego przewijania

To jest coś naprawdę łatwego do zrobienia, ale nie nadużywaj tego. Cała idea opiera się na commitach merge, ponieważ pozwalają one na przewijanie do przodu i łączenie historii gałęzi z innymi.

Zmiana nazwy gałęzi:

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

Tworzenie nowa gałąź "master":

# create master from new starting point
git branch master <new-master-start-point>

Tworzenie commita scalającego, aby mieć historię rodzic-dziecko:

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

I voila.

git push origin master

Działa to, ponieważ utworzenie merge commit pozwala na szybkie przekierowanie gałęzi do nowej rewizji.

Użycie sensownego komunikatu merge commit:

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old
 25
Author: dnozay,
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-10-24 16:12:36

Zakładam, że nadal 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 zadzwonisz master-nowy "master", skutecznie będziesz miał przepisaną historię. Nie ma znaczenia Jak dostajesz się do stanu, w którym master nie jest potomkiem poprzedniej pozycji mistrza, po prostu jest w tym stanie.

Inni użytkownicy próbujący ściągnąć, gdy master nie istnieje, po prostu będą mieli swoje ściągnięcia nie powiodą się (nie ma takiego ref na zdalnym), a gdy ponownie pojawi się w nowym miejscu, ich ściągnięcia będą musiały spróbować połączyć swój master z nowym zdalnym master, tak jak gdybyś połączył master-stary i master-nowy w repozytorium. Biorąc pod uwagę to, co próbujesz zrobić, połączenie może mieć konflikt. (Gdyby zostały rozwiązane, a wynik został wepchnięty z powrotem do repozytorium, byłbyś w jeszcze gorszym stanie - obie wersje historii tam.)

Aby odpowiedzieć na twoje pytanie po prostu: powinieneś zaakceptuj, że czasami będą błędy w twojej historii. W porządku. Każdemu się to zdarza. W git są cofnięte commity.repozytorium git. Ważne jest to, że kiedy opublikujemy historię, każdy może jej zaufać.

*gdyby tak było, byłoby to równoznaczne z przepchnięciem pewnych zmian na master, a następnie utworzeniem nowej gałęzi tam, gdzie kiedyś była. Nie ma sprawy.

 11
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
2017-05-23 11:54:59

Wybrana odpowiedź nie powiodła się, gdy próbowałem. Wyświetla błąd: refusing to delete the current branch: refs/heads/master. Chyba napiszę co u mnie działa:

git checkout master             # if not in master already

git branch placeholder          # create placeholder branch
git checkout placeholder        # checkout to placeholder
git push remote placeholder     # push placeholder to remote repository

git branch -d master            # remove master in local repository
git push remote :master         # remove master from remote repository.

Sztuczka polega na tym, aby przejść do pliku zastępczego tuż przed wysłaniem go do zdalnego repozytorium. Reszta jest oczywista, usunięcie gałęzi master i wypchnięcie jej do zdalnego repozytorium powinno działać teraz. Fragment TUTAJ .

 8
Author: Hendra Uzia,
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:18:26

Dobrze. Moje 2 centy. Co powiesz na zalogowanie się na serwerze, przejście do katalogu git i zmianę nazwy gałęzi w repozytorium. Nie ma to wszystkich problemów związanych z reuploadingiem tej samej gałęzi. W rzeczywistości "klienci" automatycznie rozpoznają zmodyfikowaną nazwę i zmienią swoje zdalne odniesienie. Później (lub wcześniej) możesz również zmodyfikować lokalną nazwę gałęzi.

 3
Author: ,
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
2012-10-26 18:32:55

A co z:

git checkout old-branch-name
git push remote-name new-branch-name
git push remote-name :old-branch-name
git branch -m new-branch-name
 1
Author: Hannes Tydén,
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-08-17 08:21:10

Jest to najprostszy i najbardziej "czytelny" sposób, jaki znam:

'Przenieś' lokalny oddział używając -m

git branch -m my_old_branch_name my_new_branch_name

Przesuń gałąź 'moved' do pilota, Ustaw 'upstream' używając -u

git push origin -u my_new_branch_name

(Ustawienie 'upstream' zasadniczo 'łączy' Twoją lokalną gałąź ze zdalnym, aby takie rzeczy jak fetch, pull i push działały)

Usuń starą gałąź ze zdalnego

git push origin -D <old_name>

(twój lokalny oddział już zniknął, ponieważ "przeniosłeś" go w pierwszym kroku)

 1
Author: Chris Halcrow,
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-08 01:15:25

OK, Zmiana nazwy gałęzi zarówno lokalnie jak i na zdalnym jest dość prosta!...

Jeśli na gałęzi, można łatwo zrobić:

git branch -m <branch>

Lub jeśli nie, musisz zrobić:

git branch -m <your_old_branch> <your_new_branch>

Następnie przesuń usunięcie do pilota w następujący sposób:

git push origin <your_old_branch>

Teraz gotowe, Jeśli pojawi się błąd upstream podczas próby wciśnięcia, po prostu zrób:

git push --set-upstream origin <your_new_branch>

Tworzę również poniższy obrazek, aby pokazać kroki w real command linia, po prostu wykonaj kroki i będziesz dobry:

Tutaj wpisz opis obrazka

 1
Author: Alireza,
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-03-26 10:51:32

Możesz wykonać następujące czynności:

git -m master master-old #rename current master
git checkout -b master   #create a new branch master
git push -f origin master #force push to master

Ale wymuszanie jest złym pomysłem, jeśli inni ludzie dzielą się tym repozytorium. Force push spowoduje konflikt ich historii wersji z nową.

 0
Author: Riyafa Abdul Hameed,
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-16 14:04:45

Do skryptu powłoki można zapisać:

Na przykład:

remote="origin"

if [ "$#" -eq 0 ] # if there are no arguments, just quit
then
    echo "Usage: $0 oldName newName or $0 newName" >&2
    exit 1
elif
    [ "$#" -eq 1 ] # if only one argument is given, rename current branch
then 
    oldBranchName="$(git branch | grep \* | cut -d ' ' -f2)" #save current branch name
    newBranchName=$1
else
    oldBranchName=$1
    newBranchName=$2
fi

git branch -m $oldBranchName $newBranchName

git push $remote :$oldBranchName #delete old branch on remote
git push --set-upstream $remote $newBranchName # add new branch name on remote and track it

Należy pamiętać, że tutaj domyślna nazwa zdalnego "origin" jest zakodowany na twardo, można rozszerzyć skrypt, aby if konfigurowalny!

Wtedy ten skrypt może być używany z aliasami bash, aliasami git lub na przykład w niestandardowych akcjach sourcetree.

 0
Author: Empus,
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-04-08 17:51:48

Wierzę, że kluczem jest uświadomienie sobie, że wykonujesz podwójne zmienić nazwę: master na master-old, a także master-new na master.

Z wszystkich innych odpowiedzi, które zsyntetyzowałem to:

doublerename master-new master master-old

Gdzie najpierw musimy zdefiniować doublerename funkcję Bash:

# doublerename NEW CURRENT OLD
#   - arguments are branch names
#   - see COMMIT_MESSAGE below
#   - the result is pushed to origin, with upstream tracking info updated
doublerename() {
  local NEW=$1
  local CUR=$2
  local OLD=$3
  local COMMIT_MESSAGE="Double rename: $NEW -> $CUR -> $OLD.

This commit replaces the contents of '$CUR' with the contents of '$NEW'.
The old contents of '$CUR' now lives in '$OLD'.
The name '$NEW' will be deleted.

This way the public history of '$CUR' is not rewritten and clients do not have
to perform a Rebase Recovery.
"

  git branch --move $CUR $OLD
  git branch --move $NEW $CUR

  git checkout $CUR
  git merge -s ours $OLD -m $COMMIT_MESSAGE

  git push --set-upstream --atomic origin $OLD $CUR :$NEW
}

Jest to podobne do zmieniającej się historii git rebase w tym, że zawartość gałęzi jest zupełnie inna, ale różni się tym, że klienci mogą bezpiecznie przewijać do przodu za pomocą git pull master.

 -1
Author: Martin Vidner,
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-07-28 15:35:05
git update-ref newref oldref
git update-ref -d oldref newref
 -3
Author: dlamotte,
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
2014-08-12 14:33:42