Frage Machen Sie den aktuellen Git-Zweig zu einem Master-Zweig


Ich habe ein Repository in Git. Ich machte einen Zweig, machte dann einige Änderungen sowohl an den Meister als auch an die Zweigstelle.

Dann, Dutzende von Commits später, erkannte ich, dass der Zweig in einem viel besseren Zustand als der Master ist, also möchte ich, dass der Zweig zum Master "wird" und die Änderungen am Master ignoriert.

Ich kann es nicht zusammenführen, weil ich die Änderungen am Master nicht behalten möchte. Was soll ich machen?

Extra: In diesem Fall war der "alte" Master bereits push-ed zu einem anderen Repository wie GitHub. Wie ändert sich das?


1310
2018-05-04 05:30


Ursprung


Antworten:


Das Problem mit den anderen beiden Antworten ist, dass der neue Master nicht den alten Master als Vorfahren hat, also wenn Sie ihn anschieben, werden alle anderen durcheinander gebracht. Das möchten Sie tun:

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

Wenn Sie möchten, dass Ihre Historie etwas übersichtlicher ist, würde ich empfehlen, der Merge-Commit-Nachricht einige Informationen hinzuzufügen, um klarzustellen, was Sie getan haben. Ändern Sie die zweite Zeile in:

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message

1743
2018-05-04 06:00



Stellen Sie sicher, dass alles in Ihr Remote-Repository (GitHub) verschoben wird:

git checkout master

Überschreiben Sie "Master" mit "better_branch":

git reset --hard better_branch

Erzwingen Sie den Push in Ihr Remote-Repository:

git push -f origin master

168
2018-06-24 20:25



Bearbeiten: Du hast nicht gesagt, dass du zu einem öffentlichen Repo gedrängt wurdest! Das macht eine Welt der Unterschiede.

Es gibt zwei Wege, den "schmutzigen" Weg und den "sauberen" Weg. Angenommen, Ihr Zweig ist benannt new-master. Das ist der saubere Weg:

git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

Dadurch werden die Konfigurationsdateien so geändert, dass sie mit den umbenannten Zweigen übereinstimmen.

Sie können es auch auf die schmutzige Weise tun, die die Konfigurationsdateien nicht aktualisiert. Dies ist eine Art von was unter der Haube der oben genannten ...

mv -i .git/refs/new-master .git/refs/master
git checkout master

65
2018-05-04 05:37



Benennen Sie den Zweig um in master durch:

git branch -M branch_name master

39
2018-05-04 05:37



Die hier angegebenen Lösungen (Umbenennung der Verzweigung in 'Master') bestehen nicht auf den Konsequenzen für den Remote (GitHub) Repo:

    -f
    --Macht

Normalerweise verweigert der Befehl die Aktualisierung einer Remote-Referenz, die kein Vorgänger der lokalen Referenz ist, die zum Überschreiben verwendet wird. Dieses Flag deaktiviert die Überprüfung. Dies kann dazu führen, dass das Remote-Repository seine Commits verliert. Benutze es vorsichtig.

Wenn andere bereits Ihren Repo gezogen haben, können sie diesen neuen Master-Verlauf nicht mehr abrufen, ohne ihren eigenen Master durch den neuen GitHub-Master-Zweig zu ersetzen (oder mit vielen Zusammenführungen zu arbeiten).
Es gibt Alternativen zu einem Git Push - Force für öffentliche Repos.
Jefromis Antwort (Das Zusammenführen der richtigen Änderungen zurück zum ursprünglichen Master) ist einer von ihnen.


11
2018-05-04 05:57



Von dem, was ich verstehe, können Sie den aktuellen Zweig in einen bestehenden Zweig verzweigen. Im Wesentlichen wird dies überschrieben master mit allem, was Sie in der aktuellen Branche haben:

git branch -f master HEAD

Sobald Sie das getan haben, können Sie normalerweise Ihre lokalen drücken master Zweig, möglicherweise erfordern die Macht Parameter auch hier:

git push -f origin master

Keine Zusammenführungen, keine langen Befehle. Einfach branch und push- aber ja, Das wird die Geschichte umschreiben des master Wenn du in einem Team arbeitest, musst du wissen, was du tust.




Alternativ habe ich festgestellt, dass Sie jede Verzweigung an jede entfernte Zweigstelle senden können.

# This will force push the current branch to the remote master
git push -f origin HEAD:master

# Switch current branch to master
git checkout master

# Reset the local master branch to what's on the remote
git reset --hard origin/master

10
2018-04-04 22:44



Man kann auch alle Dateien aus dem anderen Zweig in master auschecken:

git checkout master
git checkout better_branch -- .

und dann alle Änderungen festschreiben.


6
2018-03-04 17:51



Ich fand diese einfache Methode, um am besten zu arbeiten. Es schreibt den Verlauf nicht neu und alle vorherigen Eincheckvorgänge des Zweigs werden an den Master angehängt. Nichts ist verloren, und Sie können deutlich sehen, was im Commit-Protokoll passiert ist.

Ziel: Machen Sie den aktuellen Status "Zweig" zum "Master"

Arbeiten Sie in einem Zweig, übergeben Sie Ihre Änderungen und drücken Sie sie, um sicherzustellen, dass Ihre lokalen und fernen Repositorys auf dem neuesten Stand sind:

git checkout master      # Set local repository to master
git reset --hard branch  # Force working tree and index to branch
git push origin master    # Update remote repository

Danach ist Ihr Master der genaue Status Ihres letzten Commits der Verzweigung und Ihr Master-Commit-Protokoll zeigt alle Check-Ins der Verzweigung an.


5
2018-04-08 15:30