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?
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.
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
master-old
-Zweig im Origin
-Repository, basierend auf dem master
-Commit im lokalen Repository.Origin/master-old
-Zweig (der automatisch als Verfolgungszweig ordnungsgemäß eingerichtet wird).master
auf das Commit, auf das Sie zeigen möchten.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.)
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
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.
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" .
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.
# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old
# create master from new starting point
git branch master <new-master-start-point>
# 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
git Push Origin master
Dies funktioniert, weil das Erstellen eines merge
-Commits das schnelle Weiterleiten des Zweigs zu einer neuen Revision ermöglicht .
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
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.
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 .
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.
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
Dies ist die einfachste und lesbarste Art, die ich kenne:
git branch -m my_old_branch_name my_new_branch_name
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)
git Push Origin -D <old_name>
(Ihre lokale Niederlassung ist bereits weg, weil Sie sie im ersten Schritt "verschoben" haben.)
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:
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.
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.