888 Stimmen

Umbenennen des Master-Zweigs für lokale und entfernte Git-Repositories

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

Ich möchte sie umbenennen in master-old sowohl lokal als auch auf der Gegenstelle. Ist dies möglich?

Für andere Nutzer, die Folgendes verfolgt haben origin/master (und die immer ihre lokalen master Abzweigung über git pull ), was würde passieren, nachdem ich den entfernten Zweig umbenannt habe?
Würden ihre git pull immer noch funktionieren, oder würde es eine Fehlermeldung ausgeben, dass es nicht gefunden werden konnte origin/master mehr?

Anschließend möchte ich eine neue master Zweigstelle (sowohl lokal als auch remote). Nachdem ich dies getan habe, was würde nun passieren, wenn die anderen Benutzer git pull ?

Ich vermute, dass all dies zu einer Menge Ärger führen würde. Gibt es einen sauberen Weg, um zu bekommen, was ich will? Oder sollte ich einfach die master und erstellen Sie einen neuen Zweig master-new und dort einfach weiterarbeiten?

2 Stimmen

Das in der akzeptierten Antwort angegebene Rezept gilt für eine Verzweigung mit beliebigem Namen, aber die Vorbehalte (wie angemerkt) gelten nicht aufgrund der (standardmäßigen) Sonderrolle der Meister Zweig in Git.

3 Stimmen

@kynan: Ich glaube, ich verstehe nicht ganz. Welche Vorbehalte gelten für Master und nicht für andere Zweige? Wenn es sich um einen Zweig mit dem Namen xy handelt und andere Leute diesen Zweig verfolgt haben, was wäre dann der Unterschied?

4 Stimmen

Der Vorbehalt ist, dass Sie den entfernten Master normalerweise nicht löschen können. Das gilt allerdings nicht für die Antwort von Aristoteles, so dass Sie diese als akzeptierte Antwort markieren sollten. Sie haben recht, jede git push -f beeinträchtigt die Fähigkeit zur pull von einem beliebigen Remote-Tracking-Zweig aus.

651voto

bdonlan Punkte 213545

Eine Umbenennung ist am ehesten durch Löschen und anschließendes Neuanlegen auf der Fernbedienung möglich. Zum Beispiel:

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

Dies ist jedoch mit einer Reihe von Vorbehalten behaftet. Erstens werden keine bestehenden Checkouts von der Umbenennung erfahren - Git kennt no versuchen, Zweigumbenennungen zu verfolgen. Wenn der neue master gibt es noch nicht, Git-Pull wird fehlschlagen. Wenn die neue master erstellt worden ist. Der Pull wird versuchen, die master y master-old . Es ist also generell eine schlechte Idee, es sei denn, Sie haben die Kooperation aller, die das Repository zuvor ausgecheckt haben.

Hinweis: In neueren Versionen von Git können Sie den Master-Zweig standardmäßig nicht aus der Ferne löschen. Sie können dies außer Kraft setzen, indem Sie die Option receive.denyDeleteCurrent Konfigurationswert auf warn o ignore en el remote Repository. Andernfalls, wenn Sie bereit sind, sofort einen neuen Master zu erstellen, überspringen Sie die git push remote :master Schritt, und passieren --force zum git push remote master Schritt. Beachten Sie, dass Sie den Master-Zweig nicht vollständig löschen können, wenn Sie die Konfiguration des Remote-Zweigs nicht ändern können!

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

3 Stimmen

Zweige sind nur ein Paar (Name, Raute) - nicht mehr und nicht weniger. Es gibt ein Reflog für Zweige, aber das wird niemals für entfernte Clients angezeigt.

147 Stimmen

Ich würde master-old auf der Gegenstelle erstellen, bevor ich master auf der Gegenstelle lösche. Ich bin einfach paranoid.

0 Stimmen

Keine Würfel beim zweiten Kommando: "remote: Fehler: Standardmäßig wird das Löschen der aktuellen Verzweigung verweigert, weil der nächste remote: error: 'git clone' zu keiner ausgecheckten Datei führt, was zu Verwirrung führt. remote: error: remote: error: Sie können die Konfigurationsvariable 'receive.denyDeleteCurrent' t remote: error: 'warn' oder 'ignore' im entfernten Repository setzen, um das Löschen des remote: error: aktuellen Zweigs mit oder ohne Warnmeldung zu erlauben. remote: error: remote: error: Um diese Meldung zu unterdrücken, können Sie sie auf 'refuse' setzen. remote: error: refs/heads/master"

272voto

Aristotle Pagaltzis Punkte 106298

Angenommen, Sie sind derzeit auf 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. Erstellen Sie zunächst eine master-old Zweig in der origin Repository, basierend auf dem master in das lokale Repository übertragen.
  2. Erstellen Sie einen neuen lokalen Zweig für diese neue origin/master-old Zweig (der dann automatisch als Tracking-Zweig eingerichtet wird).
  3. Zeigen Sie nun auf Ihr lokales master auf die Übergabe, auf die sie verweisen soll.
  4. Schließlich, Kraft-Änderung master en el origin Repository, um Ihr neues lokales master .

(Wenn Sie es auf eine andere Weise machen, brauchen Sie mindestens einen weiteren Schritt, um sicherzustellen, dass master-old richtig eingerichtet ist, um zu verfolgen origin/master-old . Keine der anderen Lösungen, die zum Zeitpunkt der Erstellung dieses Artikels veröffentlicht wurden, beinhalten dies).

16 Stimmen

Das ist eine bessere Antwort als "die Antwort", da stimme ich zu, aber für Leute, die hierher gekommen sind, um einfach einen Zweig umzubenennen (nicht explizit Master), macht der dritte Schritt nicht viel Sinn.

0 Stimmen

Für die Antwort ist es völlig unerheblich, ob Sie auf master oder eine andere Branche. Die Frage war allerdings schlecht betitelt, sie fragt nach einer Aufgabe, die komplexer ist als nur Umbenennung eines Zweigs.

3 Stimmen

Dies erwies sich als die Lösung, die bei mir funktionierte. Ich habe versucht, master durch einen anderen Zweig zu ersetzen. Ich führte ein git log -1 origin/what_i_want_as_new_master aus, um den $new_master_commit für Schritt 3 zu erhalten. Nach dem Push (Schritt 4) zogen andere Entwickler und erhielten die Meldung "Ihr Zweig ist dem Master um 295 Commits voraus." Um dies zu beheben, habe ich eine E-Mail verschickt, in der ich ihnen mitteilte, dass sie Folgendes ausführen sollen: git pull; git checkout some_random_branch; git branch -D master; git pull; git checkout master; Im Grunde müssen sie ihren lokalen Master entfernen und die neue Version ziehen, da sie sonst lokal an der falschen Stelle sind.

184voto

Excalibur Punkte 3099

Mit Git v1.7 hat sich dies meines Erachtens leicht geändert. Das Aktualisieren der Tracking-Referenz Ihres lokalen Zweigs auf den neuen Remote-Zweig 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

15 Stimmen

Eine Alternative zu --set-upstream ist wie folgt: Sobald Sie Ihren Zweig lokal umbenannt und auf dem Ursprung gelöscht haben, tun Sie es einfach: git push -u --all

1 Stimmen

Was passiert mit dem Rest des Teams, wenn das erledigt ist? Was sollten andere Teammitglieder tun, um auf den neuen Zweig zu wechseln?

6 Stimmen

Dies funktioniert nicht mit dem Master-Zweig, da Git es nicht erlaubt, den entfernten Master zu löschen.

42voto

dnozay Punkte 22949

Es gibt viele Möglichkeiten, den Zweig umzubenennen, aber ich werde mich auf das größere Problem konzentrieren: "Wie kann man es den Kunden ermöglichen, schnell voranzukommen und sich nicht mit ihren Filialen vor Ort herumschlagen zu müssen? .

Zunächst ein kurzes Bild: renaming master branch and allowing clients to fast-forward

Das ist eigentlich einfach zu machen, aber man sollte es nicht missbrauchen. Die ganze Idee hängt von Merge-Commits ab, da sie einen schnellen Vorlauf ermöglichen und die Historie eines Zweigs mit einem anderen verknüpfen.

Umbenennung der Verzweigung:

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

Erstellung des neuen "Master"-Zweigs:

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

Erstellen einer Zusammenführungsübergabe, um eine Eltern-Kind-Historie zu haben:

# 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 voilà.

git push origin master

Dies funktioniert, weil das Erstellen einer merge Commit erlaubt schnelles Vorspulen den Zweig auf eine neue Revision.

unter Verwendung einer sinnvollen Merge-Commit-Nachricht:

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

5 Stimmen

Gracias. git merge -s ours master-old ist das entscheidende Element, das in den anderen Antworten fehlt. Außerdem bedeutet "einfach zu tun" nicht "einfach zu verstehen oder herauszufinden", was bei einem Großteil von Git der Fall zu sein scheint, aber ich schweife ab.

3 Stimmen

Ich finde es gut, dass keine Löschungen erwähnt werden und dass der Übergang für diejenigen, die mit Klonen von Upstream arbeiten, "nahtlos" ist. Ich danke Ihnen!

1 Stimmen

Funktioniert das auch, wenn der Master Änderungen enthält, die Sie nicht in master-new haben wollen?

38voto

Treken Punkte 389
git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

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

0 Stimmen

Löscht irgendein Teil dieser Lösung den lokalen alten Zweignamen, oder ist das eine separate Aufgabe?

4 Stimmen

Ich denke am Ende muss gelaufen werden git branch -d old-branch-name für die Löschung des lokalen alten Zweigs.

0 Stimmen

Sie können Änderungen mit nur einem Befehl durchführen: git push remote-name new-branch-name :old-branch-name .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X