Ich habe den Zweig, master
der den entfernten Zweig verfolgt origin/master
.
Ich möchte sie master-old
sowohl lokal als auch auf der Fernbedienung umbenennen . Ist das möglich?
Was würde für andere Benutzer, die nachverfolgt haben origin/master
(und die ihren lokalen master
Zweig immer über aktualisiert haben git pull
), passieren, nachdem ich den Remote-Zweig umbenannt habe?
Würde ihr git pull
noch funktionieren oder würde es einen Fehler auslösen, den es nicht origin/master
mehr finden konnte?
Anschließend möchte ich einen neuen master
Zweig erstellen (sowohl lokal als auch remote). Was würde jetzt wieder passieren, wenn die anderen Benutzer dies tun git pull
?
Ich denke, all dies würde zu viel Ärger führen. Gibt es einen sauberen Weg, um das zu bekommen, was ich will? Oder sollte ich einfach so bleiben master
wie es ist und eine neue Niederlassung gründen master-new
und dort einfach weiterarbeiten?
quelle
git push -f
beeinträchtigt die Fähigkeitpull
von jedem Remote-Tracking-Zweig.master-old
, der auf dasselbe Commit wie der vorherigemaster
Zweig verweist . Anschließend können Sie denmaster
Zweig mit Ihren neuen Änderungen überschreiben, indem Sie einemerge
mit derours
Strategie ausführen. Das Zusammenführen funktioniert, wenn die Fernbedienung keine nicht schnellen Änderungen zulässt. Das bedeutet auch, dass andere Benutzer keine erzwungenen Updates haben.master
ist nur etwas Besonderes, solange es der einzige existierende Zweig ist. Sobald Sie mehr als einen haben, sind alle Zweige gleichberechtigt.Antworten:
Das Umbenennen kommt dem Löschen und erneuten Erstellen auf der Fernbedienung am nächsten. Zum Beispiel:
Dies hat jedoch viele Einschränkungen. Erstens wissen keine vorhandenen Kassen über die Umbenennung Bescheid - git versucht nicht , die Umbenennung von Zweigen zu verfolgen. Wenn das neue
master
noch nicht existiert, wird git pull einen Fehler verursachen. Wenn das neuemaster
erstellt wurde. Der Pull versucht zu verschmelzenmaster
undmaster-old
. Daher ist es im Allgemeinen eine schlechte Idee, es sei denn, Sie arbeiten mit allen zusammen, die das Repository zuvor ausgecheckt haben.Hinweis: In neueren Versionen von git können Sie den Hauptzweig standardmäßig nicht remote löschen. Sie können dies überschreiben, indem Sie den
receive.denyDeleteCurrent
Konfigurationswert aufwarn
oderignore
im Remote- Repository festlegen. Wenn Sie andernfalls sofort einen neuen Master erstellen möchten, überspringen Sie dengit push remote :master
Schritt und fahren Sie--force
mit demgit push remote master
Schritt fort. Beachten Sie, dass Sie den Hauptzweig nicht vollständig löschen können, wenn Sie die Konfiguration der Fernbedienung nicht ändern können!Diese Einschränkung gilt nur für den aktuellen Zweig (normalerweise den
master
Zweig). Jeder andere Zweig kann wie oben gelöscht und neu erstellt werden.quelle
new-branch-name
undold-branch-name
anstelle vonmaster
/ verwenden könntenmaster-old
, daher ist dies ein allgemeines Problem.Angenommen, Sie befinden sich derzeit auf
master
:master-old
Verzweigung imorigin
Repository, basierend auf demmaster
Commit im lokalen Repository.origin/master-old
Zweig (der automatisch ordnungsgemäß als Tracking-Zweig eingerichtet wird).master
Zeigen Sie nun mit Ihrem lokalen Standort auf das Commit, auf das es verweisen soll.master
imorigin
Repository, um Ihre neue lokale Position widerzuspiegelnmaster
.(Wenn Sie dies auf eine andere Weise tun, benötigen Sie mindestens einen weiteren Schritt, um sicherzustellen, dass
master-old
die Nachverfolgung ordnungsgemäß eingerichtet istorigin/master-old
. Keine der anderen zum Zeitpunkt dieses Schreibens veröffentlichten Lösungen enthält dies.)quelle
master
oder einem anderen Zweig befinden. Die Frage hatte jedoch einen schlechten Titel und fragt nach einer Aufgabe, die komplexer ist als nur das Umbenennen eines Zweigs.master
dann könnten sie einfach tungit fetch && git reset --hard origin/master
, um ihre lokale Position so zu erzwingenmaster
, dass sie mit der eingeschaltet istorigin
. Ich habe dies sowie den komplexeren Fall, in dem Sie zusätzlich lokale Commits habenmaster
, die Sie behalten möchten, in stackoverflow.com/q/4084868Mit Git v1.7 hat sich das meiner Meinung nach leicht geändert. Das Aktualisieren des Tracking-Verweises Ihrer lokalen Niederlassung auf die neue Fernbedienung ist jetzt sehr einfach.
quelle
--set-upstream
ist wie folgt: Sobald Sie Ihren Zweig lokal umbenannt und am Ursprung gelöscht haben, tun Sie einfach:git push -u --all
new_branch
und schließlich die Fernbedienungmaster
mit der 2. Zeile löschen .git push origin --delete old_branch
ist etwas besser lesbar.Möglicherweise müssen Sie
new-branch-name
vor dem Löschen manuell zu wechselnold-branch-name
quelle
git branch -d old-branch-name
um den lokalen alten Zweig zu löschen.git push remote-name new-branch-name :old-branch-name
.Es gibt viele Möglichkeiten, die Niederlassung umzubenennen, aber ich werde mich auf das größere Problem konzentrieren: "Wie können Kunden einen schnellen Vorlauf durchführen und müssen sich nicht lokal mit ihren Niederlassungen herumschlagen?" .
Zuerst ein kurzes Bild:
Das ist eigentlich ganz einfach; aber missbrauche es nicht. Die ganze Idee hängt von Zusammenführungsverpflichtungen ab. da sie einen schnellen Vorlauf ermöglichen und die Historien eines Zweigs mit einem anderen verknüpfen.
Umbenennen des Zweigs:
Erstellen des neuen "Master" -Zweigs:
Erstellen eines Zusammenführungs-Commits für einen Eltern-Kind-Verlauf:
und voila.
Dies funktioniert, da durch das Erstellen eines
merge
Commits der Zweig schnell zu einer neuen Revision weitergeleitet werden kann.Verwenden einer sinnvollen Merge-Commit-Nachricht:
quelle
git merge -s ours master-old
ist das entscheidende Stück, das die anderen Antworten vermissen. Auch "leicht zu machen" bedeutet nicht "leicht zu verstehen oder herauszufinden", was bei viel Git der Fall zu sein scheint, aber ich schweife ab.Ich gehe davon aus, dass Sie immer noch nach der gleichen Situation wie in Ihrer vorherigen Frage fragen . Das heißt, Master-New enthält Master-Old nicht in seinem Verlauf. * Wenn Sie Master-New als "Master" bezeichnen, haben Sie den Verlauf effektiv neu geschrieben. Es spielt keine Rolle, wie Sie in einen Zustand gelangen, in dem der Meister kein Nachkomme einer früheren Position des Meisters ist, sondern nur, dass er sich in diesem Zustand befindet.
Bei anderen Benutzern, die versuchen zu ziehen, während der Master nicht vorhanden ist, schlagen ihre Pulls einfach fehl (keine solche Referenz auf der Fernbedienung). Sobald sie an einem neuen Ort erneut vorhanden sind, müssen ihre Pulls versuchen, ihren Master mit dem neuen Remote-Master zusammenzuführen. als ob Sie Master-Alt und Master-Neu in Ihrem Repository zusammengeführt hätten. Angesichts dessen, was Sie hier versuchen, würde die Zusammenführung Konflikte verursachen. (Wenn sie behoben würden und das Ergebnis zurück in das Repository verschoben würde, 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 okay Es passiert jedem. Es gibt zurückgesetzte Commits im git.git-Repository. Wichtig ist, dass jeder, dem wir die Geschichte veröffentlichen, vertrauen kann.
* Wenn dies der Fall wäre, würde dies bedeuten, einige Änderungen auf den Master zu übertragen und dann einen neuen Zweig dort zu erstellen, wo er sich früher befand. Kein Problem.
quelle
Die ausgewählte Antwort ist fehlgeschlagen, als ich es versucht habe. Es wird ein Fehler ausgegeben :
refusing to delete the current branch: refs/heads/master
. Ich denke, ich werde posten, was für mich funktioniert:Der Trick besteht darin, den Platzhalter direkt vor dem Verschieben in das Remote-Repository auszuchecken. Der Rest ist selbsterklärend. Das Löschen des Hauptzweigs und das Verschieben in das Remote-Repository sollten jetzt funktionieren. Auszug von hier .
quelle
Gut. Meine 2 Cent. Wie wäre es, wenn Sie sich am Server anmelden, in das Git-Verzeichnis wechseln und den Zweig im Bare-Repository umbenennen. Dies hat nicht alle Probleme, die mit dem erneuten Hochladen desselben Zweigs verbunden sind. Tatsächlich erkennen die 'Clients' automatisch den geänderten Namen und ändern ihre Fernreferenz. Danach (oder vorher) können Sie auch den lokalen Namen des Zweigs ändern.
quelle
Wie wäre es mit:
quelle
Dies ist der einfachste und am besten lesbare Weg, den ich kenne:
Lokalen Zweig mit -m 'verschieben'
Schieben Sie den 'verschobenen' Zweig auf die Fernbedienung und stellen Sie '-stream' mit -u ein
(Wenn Sie "Upstream" einstellen, wird Ihr lokaler Zweig im Wesentlichen mit der Fernbedienung verbunden, sodass Dinge wie Abrufen, Ziehen und Drücken funktionieren.)
Löschen Sie den alten Zweig von der Fernbedienung
(Ihre lokale Niederlassung ist bereits weg, weil Sie sie im ersten Schritt "verschoben" haben.)
quelle
OK , Umbenennen eines Zweigs sowohl lokal als auch auf der Fernbedienung ist ziemlich einfach! ...
Wenn Sie in der Branche sind, können Sie ganz einfach Folgendes tun:
git branch -m <branch>
oder wenn nicht, müssen Sie Folgendes tun:
git branch -m <your_old_branch> <your_new_branch>
Drücken Sie dann die Löschung wie folgt auf die Fernbedienung:
git push origin <your_old_branch>
Wenn Sie beim Pushen einen Upstream-Fehler erhalten, tun Sie einfach Folgendes:
git push --set-upstream origin <your_new_branch>
Ich erstelle auch das Bild unten, um die Schritte in der realen Befehlszeile zu zeigen. Befolgen Sie einfach die Schritte und Sie wären gut:
quelle
Sie können Folgendes tun:
Force Push ist jedoch eine schlechte Idee, wenn andere Personen dieses Repository gemeinsam nutzen. Force Push führt dazu, dass ihre Revisionshistorie mit der neuen in Konflikt steht.
quelle
Folgendes kann im Shell-Skript gespeichert werden, um die Aufgabe auszuführen:
Zum Beispiel:
Bitte beachten Sie, dass hier der Standard-Remote-Name "Ursprung" fest codiert ist. Sie können das Skript erweitern, um es zu konfigurieren!
Dann kann dieses Skript mit Bash-Aliasen, Git-Aliasen oder beispielsweise in benutzerdefinierten Quellenbaumaktionen verwendet werden.
quelle
Ich glaube, der Schlüssel ist die Erkenntnis, dass Sie eine doppelte Umbenennung durchführen:
master
zumaster-old
und auchmaster-new
zumaster
.Aus all den anderen Antworten habe ich Folgendes zusammengefasst:
wo wir zuerst die
doublerename
Bash-Funktion definieren müssen:Dies ähnelt einer Änderung der Historie
git rebase
, da der Zweiginhalt sehr unterschiedlich ist, unterscheidet sich jedoch darin, dass die Clients dennoch sicher schnell vorspulen könnengit pull master
.quelle
quelle