wake-up-neo.com

Umbenennen von Master-Zweigen für lokale und entfernte Git-Repositorys

Ich habe den Zweig master, der den entfernten Zweig Origin/master verfolgt.

Ich möchte sie lokal und auf der Fernbedienung in master-old umbenennen. Ist das möglich? Was würde für andere Benutzer, die Origin/master verfolgt haben (und die ihren lokalen master-Zweig immer über git pull aktualisiert haben) nach der Umbenennung des Remote-Zweigs passieren? Würde ihr git pull noch funktionieren oder würde es einen Fehler auslösen, den Origin/master nicht mehr finden konnte?

Anschließend möchte ich einen neuen master-Zweig erstellen (sowohl lokal als auch remote). Was würde jetzt passieren, wenn die anderen Benutzer git pull tun?

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

766
Albert

Das nächste Umbenennen ist das Löschen und dann das Erstellen auf der Fernbedienung. 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 hat jedoch viele Vorbehalte. Erstens wissen keine vorhandenen Kassen über die Umbenennung - git tut nicht versucht, die Umbenennung von Zweigen zu verfolgen. Wenn die neue master noch nicht existiert, wird git pull einen Fehler ausgeben. Wenn die neue master erstellt wurde. Der Pull versucht, master und master-old zusammenzuführen. Dies ist im Allgemeinen eine schlechte Idee, es sei denn, Sie haben die Mitwirkung aller, die das Repository zuvor ausgecheckt haben.

Hinweis: In neueren Versionen von git können Sie den Master-Zweig standardmäßig nicht remote löschen. Sie können dies überschreiben, indem Sie den receive.denyDeleteCurrent-Konfigurationswert im remote repository auf warn oder ignore setzen. Andernfalls, wenn Sie bereit sind, sofort einen neuen Master zu erstellen, überspringen Sie den Schritt git Push remote :master und übergeben Sie --force an den Schritt git Push remote master. Wenn Sie die Konfiguration der Fernbedienung nicht ändern können, können Sie den Master-Zweig nicht vollständig löschen!

Diese Einschränkung gilt nur für den aktuellen Zweig (normalerweise der Zweig master). Jeder andere Zweig kann wie oben gelöscht und neu erstellt werden.

587
bdonlan

Angenommen, Sie befinden sich 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 einen master-old-Zweig im Origin-Repository, basierend auf dem master-Commit im lokalen Repository.
  2. Erstellen Sie einen neuen lokalen Zweig für diesen neuen Origin/master-old-Zweig (der automatisch als Verfolgungszweig ordnungsgemäß eingerichtet wird).
  3. Richten Sie jetzt Ihr lokales master auf das Commit, auf das Sie zeigen möchten.
  4. Erzwingen Sie abschließend master im Origin-Repository, um Ihr neues lokales master wiederzugeben.

(Wenn Sie dies auf andere Weise tun, benötigen Sie mindestens einen weiteren Schritt, um sicherzustellen, dass master-old ordnungsgemäß für die Verfolgung von Origin/master-old eingerichtet ist. In keiner der anderen Lösungen, die zum Zeitpunkt dieses Schreibens veröffentlicht wurden, ist dies enthalten.)

247

Mit Git v1.7 hat sich das etwas geändert. Das Aktualisieren der Verfolgungsreferenz Ihrer lokalen Zweigstelle 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
151
Excalibur
git checkout -b new-branch-name
git Push remote-name new-branch-name :old-branch-name

Sie müssen möglicherweise manuell zu new-branch-name wechseln, bevor Sie old-branch-name löschen.

35
Treken

Es gibt viele Möglichkeiten, die Filiale umzubenennen, aber ich werde mich auf das größere Problem konzentrieren: "Wie können Kunden einen schnellen Vorlauf durchführen, ohne sich lokal mit ihren Filialen herumschlagen zu müssen" .

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

Das ist eigentlich ganz einfach; aber missbrauche es nicht. Die ganze Idee hängt von Merge Commits ab. da sie einen schnellen Vorlauf ermöglichen und die Historien eines Zweigs mit einem anderen verknüpfen.

zweig umbenennen:

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

erstellen des neuen "Master" -Zweigs:

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

erstellen eines Zusammenführungs-Commits mit einem Eltern-Kind-Verlauf:

# 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 das Erstellen eines merge-Commits das schnelle Weiterleiten des Zweigs zu einer neuen Revision ermöglicht .

verwenden 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
27
dnozay

Ich nehme an, Sie fragen immer noch nach der gleichen Situation wie in Ihrer vorherigen Frage . Das heißt, Master-New wird kein Master-Alt in seiner Historie enthalten. * Wenn Sie Master-New "Master" aufrufen, haben Sie die Historie tatsächlich neu geschrieben. Es kommt nicht auf wie Sie kommen in einen Zustand, in dem Master kein Nachkomme einer vorherigen Position des Masters ist, nur dass er in diesem Zustand ist. 

Andere Benutzer, die versuchen, zu ziehen, während der Master nicht vorhanden ist, haben nur einen Pull-Fehler (kein entsprechender Ref-Befehl für Remote). Sobald sie an einem neuen Ort wieder vorhanden sind, müssen ihre Pulls versuchen, ihren Master mit dem neuen Remote-Master zusammenzuführen. als ob Sie Master-old und Master-new in Ihrem Repository zusammengeführt hätten. In Anbetracht dessen, was Sie hier tun möchten, hätte die Verschmelzung Konflikte zur Folge. (Wenn sie aufgelöst wurden und das Ergebnis in das Repository zurückgeschoben wurde, befinden Sie sich 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 okay. Es passiert jedem. Es gibt zurückgegebene Commits im Repository von git.git. Das Wichtigste ist, dass wir, wenn wir Geschichte veröffentlichen, jedem vertrauen können.

* Wenn dies der Fall wäre, wäre dies gleichbedeutend mit dem Verschieben einiger Änderungen auf den Master und dem Erstellen eines neuen Zweigs, an dem er zuvor war. Kein Problem.

11
Cascabel

Die ausgewählte Antwort schlug fehl, als ich es versuchte. Es wird ein Fehler ausgegeben: refusing to delete the current branch: refs/heads/master. Ich schätze, ich werde posten, 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, den Platzhalter zu überprüfen, bevor er in das Remote-Repository verschoben wird. Der Rest ist selbsterklärend. Das Löschen des Master-Zweigs und Push in das Remote-Repository sollte jetzt funktionieren. Auszug aus hier .

8
Hendra Uzia

Gut. Meine 2 Cent. Wie wäre es, wenn Sie sich am Server anmelden, zum git-Verzeichnis gehen und den Zweig im bloßen Repository umbenennen. Dies hat nicht alle Probleme, die mit dem erneuten Hochladen desselben Zweigs zusammenhängen. Tatsächlich erkennen die 'Clients' den geänderten Namen automatisch und ändern ihre Fernreferenz. Danach (oder zuvor) können Sie auch den lokalen Namen des Zweigs ändern.

3
user458577

Wie wäre es mit:

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
Hannes Tydén

Dies ist die einfachste und lesbarste Art, die ich kenne:

Lokale Verzweigung mit -m verschieben

git branch -m my_old_branch_name my_new_branch_name

Schieben Sie den Zweig "verschoben" zur Fernbedienung, und stellen Sie mit -u "Upstream" ein

git Push Origin -u my_new_branch_name

(Die Einstellung 'Upstream' verbindet 'Ihren lokalen Zweig' im Wesentlichen mit der Remote, sodass Dinge wie Abrufen, Ziehen und Drücken funktionieren)

Löschen Sie den alten Zweig von der Fernbedienung

git Push Origin -D <old_name>

(Ihre lokale Niederlassung ist bereits weg, weil Sie sie im ersten Schritt "verschoben" haben.)

1
Chris Halcrow

OK, das Umbenennen eines Zweiges in local und auf the remote ist ziemlich einfach! ...

Wenn Sie in der Filiale sind, können Sie leicht tun:

git branch -m <branch>

oder wenn nicht, müssen Sie Folgendes tun:

git branch -m <your_old_branch> <your_new_branch>

Dann drücken Sie den Löschvorgang wie folgt auf die Fernbedienung:

git Push Origin <your_old_branch>

Wenn Sie beim Push-Versuch einen Upstream-Fehler erhalten, machen Sie einfach Folgendes:

git Push --set-upstream Origin <your_new_branch>

Ich erstelle das Bild unten, um die Schritte in der realen Befehlszeile anzuzeigen. Folgen Sie einfach den Schritten und Sie wären gut:

 enter image description here

1
Alireza

Sie können folgendes tun:

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

Aber das Forcieren mit Gewalt ist eine schlechte Idee, wenn andere Personen dieses Repository teilen. Force Push bewirkt, dass der Revisionsverlauf mit dem neuen Konflikt in Konflikt steht.

0

Folgendes kann im Shell-Skript gespeichert werden, um die Aufgabe auszuführen:

Zum Beispiel:

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

Bitte beachten Sie, dass hier der Standard-Remote-Name "Origin" hartcodiert ist. Sie können das Skript so erweitern, dass es konfigurierbar ist!

Dann kann dieses Skript mit bash-Aliasen, git-Aliasen oder in benutzerdefinierten Aktionen von sourcetree verwendet werden.

0
Empus