Ich habe ein Repository in Git. Ich habe eine Verzweigung vorgenommen und dann einige Änderungen sowohl am Master als auch an der Verzweigung vorgenommen.
Dann, zehn Commits später, wurde mir klar, dass sich der Zweig in einem viel besseren Zustand befindet als der Master. Daher möchte ich, dass der Zweig zum Master wird und die Änderungen am Master ignoriert.
Ich kann es nicht zusammenführen, da ich die Änderungen nicht auf dem Master behalten möchte. Was sollte ich tun?
Extra : In diesem Fall wurde der 'alte' Master bereits push
in ein anderes Repository wie GitHub verschoben. Wie ändert sich das?
Antworten:
Das Problem mit den beiden anderen Antworten ist, dass der neue Meister den alten Meister nicht als Vorfahren hat. Wenn Sie ihn also drücken, werden alle anderen durcheinander gebracht. Folgendes möchten Sie tun:
Wenn Sie möchten, dass Ihr Verlauf etwas klarer wird, würde ich empfehlen, der Merge-Commit-Nachricht einige Informationen hinzuzufügen, um zu verdeutlichen, was Sie getan haben. Ändern Sie die zweite Zeile in:
quelle
--strategy=ours
unterscheidet sich von--strategy=recursive -Xours
. Dh "unsere" kann eine Strategie für sich sein (Ergebnis ist der aktuelle Zweig, egal was passiert) oder als Option an die "rekursive" Strategie übergeben werden (Änderungen anderer Zweige einbringen und Änderungen des aktuellen Zweigs automatisch bevorzugen, wenn ein Konflikt vorliegt ).git merge --strategy=ours master -m "new master"
damit es funktionierte.git push
wenn Sie möchten, dass Ihr Code auf Remote übertragen wird. Möglicherweise wird eine Warnung wieYour branch is ahead of 'origin/master' by 50 commits.
diese angezeigt . Schieben Sie es einfach! : DStellen Sie sicher, dass alles in Ihr Remote-Repository (GitHub) übertragen wird:
Überschreiben Sie "master" mit "better_branch":
Erzwingen Sie den Push in Ihr Remote-Repository:
quelle
git reset --hard origin/master
nächste Mal benötigt werden, wenn sie ziehen möchten, andernfalls wird git versuchen, die Änderungen in ihre (jetzt) divergierenden lokalen zu integrieren. Die Gefahren davon werden in dieser AntwortEdit: Du hast nicht gesagt, dass du zu einem öffentlichen Repo gedrängt hast! Das macht einen großen Unterschied.
Es gibt zwei Möglichkeiten, die "schmutzige" und die "saubere". Angenommen, Ihr Zweig heißt benannt
new-master
. Das ist der saubere Weg:Dadurch werden die Konfigurationsdateien so geändert, dass sie mit den umbenannten Zweigen übereinstimmen.
Sie können dies auch auf schmutzige Weise tun, wodurch die Konfigurationsdateien nicht aktualisiert werden. Dies ist eine Art, was unter der Haube der oben genannten passiert ...
quelle
git branch old-master master; git branch -f master new-master
. Erstellen Sie den Sicherungszweig neu und verschieben Sie den Master direkt in den neuen Master. (Und entschuldigen Sie die falsche Schreibweise Ihres Namens, habe das gerade bemerkt)Benennen Sie den Zweig um in
master
:quelle
git checkout master&&git reset --hard better_branch
?Soweit ich weiß, können Sie den aktuellen Zweig in einen vorhandenen Zweig verzweigen. Im Wesentlichen wird dies mit allem überschrieben,
master
was Sie in der aktuellen Verzweigung haben:Sobald Sie dies getan haben, können Sie normalerweise Ihren lokalen
master
Zweig verschieben, wobei möglicherweise auch hier der Force- Parameter erforderlich ist :Keine Zusammenführungen, keine langen Befehle. Einfach
branch
undpush
- aber ja, dies wird die Geschichte dermaster
Branche neu schreiben. Wenn Sie also in einem Team arbeiten, müssen Sie wissen, was Sie tun.Alternativ habe ich festgestellt, dass Sie jeden Zweig an einen beliebigen Remote-Zweig senden können, also:
quelle
Ich fand die gewünschte Antwort im Blog-Beitrag. Ersetzen Sie den Hauptzweig durch einen anderen Zweig in git :
Es ist im Wesentlichen dasselbe wie Cascabels Antwort . Abgesehen davon, dass die "Option", die er unter seiner Lösung hinzugefügt hat, bereits in meinen Hauptcodeblock eingebettet ist.
Es ist einfacher, diesen Weg zu finden.
Ich füge dies als neue Antwort hinzu, denn wenn ich diese Lösung später benötige, möchte ich den gesamten Code, den ich verwenden werde, in einem Codeblock haben.
Ansonsten kann ich copy-paste, dann Details lesen Sie unten die Linie zu sehen , dass ich sollte geändert haben - nachdem ich es bereits ausgeführt.
quelle
Die hier angegebenen Lösungen (Umbenennen des Zweigs in 'master') bestehen nicht auf den Konsequenzen für das Remote-Repo (GitHub):
Wenn andere Ihr Repo bereits abgerufen haben, können sie diesen neuen Master-Verlauf nicht abrufen, ohne ihren eigenen Master durch diesen neuen GitHub-Master-Zweig zu ersetzen (oder sich mit vielen Zusammenführungen zu befassen).
Es gibt Alternativen zu einer Git-Push-Force für öffentliche Repos .
Jefromis Antwort (Zusammenführen der richtigen Änderungen zum ursprünglichen Master) ist eine davon.
quelle
Ich fand diese einfache Methode am besten. Der Verlauf wird nicht neu geschrieben, und alle vorherigen Eincheckvorgänge der Zweigstelle werden an den Master angehängt. Es geht nichts verloren und Sie können deutlich sehen, was im Festschreibungsprotokoll passiert ist.
Ziel: Machen Sie den aktuellen Status von "Branch" zum "Master"
Wenn Sie an einem Zweig arbeiten, schreiben Sie Ihre Änderungen fest und übertragen Sie sie, um sicherzustellen, dass Ihre lokalen und Remote-Repositorys auf dem neuesten Stand sind:
Danach ist Ihr Master der genaue Status Ihres letzten Commits der Verzweigung und Ihr Master-Commit-Protokoll zeigt alle Check-Ins der Verzweigung an.
quelle
Man kann auch alle Dateien aus dem anderen Zweig in den Master auschecken:
und dann alle Änderungen festschreiben.
quelle
Um Jefromis Antwort zu ergänzen: Wenn Sie keine bedeutungslose Zusammenführung in den Verlauf der
source
Verzweigung einfügen möchten , können Sie eine temporäre Verzweigung für dieours
Zusammenführung erstellen und diese dann wegwerfen:Auf diese Weise existiert das Zusammenführungs-Commit nur in der Geschichte des
target
Zweigs.Wenn Sie überhaupt keine Zusammenführung erstellen möchten, können Sie alternativ einfach den Inhalt von abrufen
source
und ihn für ein neues Commit verwenden fürtarget
:quelle
Für mich wollte ich, dass mein Entwickler zurück zum Meister ist, nachdem er voraus war.
Während der Entwicklung:
quelle
Meine Art, Dinge zu tun, ist die folgende
quelle
Wenn Sie eGit in Eclipse verwenden :
quelle
Die folgenden Schritte werden im Git-Browser ausgeführt, der von Atlassian (Bitbucket-Server) unterstützt wird.
{Current-branch} als machen
master
master
und nennen Sie ihn "Master-Duplikat".quelle