Frage Benennen Sie den Masterzweig für lokale und Remote-Git-Repositories um


Ich habe den Zweig master welches den entfernten Zweig verfolgt origin/master.

Ich möchte sie in umbenennen master-old sowohl lokal als auch auf der Fernbedienung. Ist das möglich? Für andere Benutzer, die nachverfolgten origin/master (und wer hat immer ihre lokalen aktualisiert master verzweigen über git pull), was würde passieren, nachdem ich den entfernten Zweig umbenannt habe? Würde ihre git pull funktionieren noch oder würde es einen Fehler werfen, den es nicht finden konnte origin/master nicht mehr?

Dann, weiter, möchte ich ein neues erstellen master Zweig (sowohl lokal als auch remote). Noch einmal, nachdem ich das getan habe, was würde jetzt passieren, wenn die anderen Benutzer das tun git pull?

Ich denke, das alles würde zu einer Menge Ärger führen. Gibt es einen sauberen Weg, um zu bekommen, was ich will? Oder sollte ich einfach gehen? master wie es ist und einen neuen Zweig erstellen master-new und arbeite einfach weiter dort?


746
2017-10-06 16:51


Ursprung


Antworten:


Das nächste Umbenennen ist Löschen und erneutes Erstellen auf der Fernbedienung. Beispielsweise:

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

Allerdings hat dies viele Vorbehalte. Zuerst werden keine vorhandenen Kassen über das Umbenennen wissen - git tut es nicht Versuchen Sie, Umbenennungen zu verfolgen. Wenn das neue master existiert noch nicht, git pull wird fehlschlagen. Wenn das neue master wurde erschaffen. Der Pull versucht zu verschmelzen master und master-old. Daher ist es generell eine schlechte Idee, es sei denn, Sie kooperieren mit allen, die das Repository zuvor ausgecheckt haben.

Hinweis: Neuere Versionen von git erlauben es Ihnen nicht, den Master-Zweig standardmäßig remote zu löschen. Sie können dies überschreiben, indem Sie die Option receive.denyDeleteCurrent Konfigurationswert zu warn oder ignore auf der Fernbedienung Repository. Andernfalls, wenn Sie bereit sind, sofort einen neuen Master zu erstellen, überspringen Sie die git push remote :master Schritt und übergeben --force zum git push remote master Schritt. Beachten Sie, dass Sie die Master-Verzweigung nicht vollständig löschen können, wenn Sie die Konfiguration der Fernbedienung nicht ändern können!

Dieser Vorbehalt gilt nur für den aktuellen Zweig (normalerweise der master Ast); Jeder andere Zweig kann wie oben gelöscht und neu erstellt werden.


573
2017-10-06 17:35



Angenommen, Sie sind gerade aktiv 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. Zuerst mache a master-old Zweigstelle in der origin Repository, basierend auf der master Commit im lokalen Repository.
  2. Erstellen Sie eine neue lokale Niederlassung für diese neue Niederlassung origin/master-old Zweig (der automatisch als Nachverfolgungszweig eingerichtet wird).
  3. Zeigen Sie nun auf Ihr Lokal master auf welches Commit Sie wollen, dass es darauf zeigt.
  4. Endlich, Force-Change master in dem origin Repository, um Ihre neuen lokalen widerzuspiegeln master.

(Wenn Sie es auf andere Weise machen, benötigen Sie mindestens einen weiteren Schritt, um dies sicherzustellen master-old ist richtig eingestellt, um zu verfolgen origin/master-old. Keine der anderen Lösungen, die zum Zeitpunkt dieses Schreibens veröffentlicht wurden, enthalten das.)


240
2017-09-24 20:21



Mit Git v1.7 habe ich mich leicht verändert. Das Aktualisieren der Verfolgungsreferenz Ihrer lokalen Niederlassung auf die neue Fernbedienung ist jetzt sehr einfach.

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

146
2018-04-25 17:22



git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

Sie müssen möglicherweise manuell zu wechseln new-branch-name vor dem Löschen old-branch-name


35
2018-02-10 02:29



Es gibt viele Möglichkeiten, den Zweig umzubenennen, aber ich werde mich auf das größere Problem konzentrieren: "Wie man Kunden erlaubt, schnell vorzuspulen und nicht mit ihren Niederlassungen lokal herumzulegen".

Zuerst ein kurzes Bild: renaming master branch and allowing clients to fast-forward

Das ist etwas, was eigentlich einfach ist; aber missbrauche es nicht. Die ganze Idee hängt von Merge-Commits ab; wie sie Schnellvorlauf ermöglichen und Historien einer Verzweigung mit einer anderen verknüpfen.

Umbenennung der Branche:

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

den neuen "Master" Zweig erstellen:

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

Erstellen eines Merge-Commits für ein Parent-Child-Protokoll:

# 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

und voila.

git push origin master

Dies funktioniert, weil ein merge commit erlaubt Schnellvorlauf der Zweig zu einer neuen Revision.

Verwenden einer sinnvollen Nachricht zum Zusammenführen von Zusammenführungen:

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
2018-03-18 00:48



Ich nehme an, Sie fragen immer noch nach der gleichen Situation wie in Ihrem Vorherige Frage. Das heißt, Master-Neu enthält in seiner Geschichte keinen Master-alt. * Wenn Sie Master-Neu "Master" aufrufen, haben Sie effektiv die Geschichte neu geschrieben. Es spielt keine Rolle Wie Sie geraten in einen Zustand, in dem der Meister kein Nachkomme einer früheren Position des Meisters ist, einfach nur, dass er in diesem Zustand ist.

Andere Benutzer, die versuchen, zu ziehen, während der Master nicht existiert, werden ihre Pulls einfach scheitern lassen (keine solche Referenz auf Remote), und wenn sie einmal an einem neuen Ort existieren, müssen ihre Pulls versuchen, ihren Master mit dem neuen Remote Master zusammenzuführen. so als ob Sie Master-Alt und Master-Neu in Ihrem Repository zusammengeführt hätten. In Anbetracht dessen, was Sie hier versuchen, hätte die Zusammenführung Konflikte. (Wenn sie gelöst wurden und das Ergebnis in das Repository zurückgeschoben wurde, wären Sie in einem noch schlechteren Zustand - beide Versionen des Verlaufs dort.)

Um Ihre Frage einfach zu beantworten: Sie sollten akzeptieren, dass es manchmal Fehler in Ihrer Geschichte gibt. Das ist in Ordnung. Es passiert jedem. Im git.git-Repository gibt es rückgängig gemachte Commits. Wichtig ist, dass wir nach der Veröffentlichung der Geschichte jedem vertrauen können.

* Wenn dies der Fall wäre, würde dies dazu führen, dass einige Änderungen auf den Master übertragen werden und dann ein neuer Zweig erstellt wird, an dem er früher war. Kein Problem.


11
2017-10-06 17:12



Das ausgewählte Antwort gescheitert, als ich es versuchte. Es wirft einen Fehler auf: refusing to delete the current branch: refs/heads/master. Ich schätze, ich poste, was für mich funktioniert:

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.

Der Trick besteht darin, direkt an den Platzhalter auszuchecken, bevor er in das Remote-Repository verschoben wird. Der Rest ist selbsterklärend, der Master-Zweig wird gelöscht und der Push-Vorgang an das Remote-Repository sollte jetzt funktionieren. Auszug aus Hier.


8
2017-12-25 12:28