So stellen Sie die lokale Verzweigung mit dem Remote-Master wieder her

934

Ich habe ein geklontes Projekt aus einem Hauptzweig aus dem Remote-Repository remote_repo. Ich erstelle einen neuen Zweig und verpflichte mich zu diesem Zweig. Andere Programmierer gingen remote_repoin den Hauptzweig.

Ich muss jetzt meinen Zweig RB auf den remote_repoMaster zurücksetzen .

Wie macht man das? Welche Befehle müssen in ein Terminal eingegeben werden?

Damir
quelle
14
Für mich ist diese Frage nicht eindeutig, da "mit" eine Umbasierung in beide Richtungen bedeuten könnte. Wenn ich mir die Antworten ansehe, sehe ich, dass die Absicht darin besteht, Ihren Zweig auf den Remote-Master zu übertragen, nicht umgekehrt. Ich erwähne es für den Fall, dass jemand einer Antwort unten folgt und das Gegenteil von dem bekommt, was er will.
Glenn Lawrence
8
@GlennLawrence Ich denke, es ist besser, die ursprüngliche Frage zu bearbeiten, als einen Kommentar hinzuzufügen. Dies wird auch durch den Stapelüberlauf gefördert. Außerdem wird das Umbasieren des Masters auf RB wahrscheinlich sowieso fehlschlagen, da RB von der Geschichte des Masters abhängt.
Daniel Kullmann

Antworten:

1245

Rufen Sie zuerst den neuen Master aus dem Upstream-Repository ab und stützen Sie dann Ihren Arbeitszweig darauf:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

Update : In der Antwort von Paul Draper finden Sie eine präzisere Möglichkeit, dasselbe zu tun. Neuere Git-Versionen bieten eine einfachere Möglichkeit, das Äquivalent der beiden oben genannten Befehle auszuführen.

Frerich Raabe
quelle
16
Dies ist die einzige Antwort, die tatsächlich das tut, was gefragt wurde
kayaker243
5
@ kayaker243 Nein, es ist das gleiche wie die Antwort von Paul Drapers, aber in langer Form, denke ich.
Erik
7
@erik Beachten Sie, dass Paul Draper seine Antwort ungefähr ein halbes Jahr nach dem Kommentar von kayaker243 (und fast zwei Jahre nach dieser Antwort) schrieb.
Frerich Raabe
3
Ich verstehe Folgendes: Your branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.Scheint, als würde ein anderer git pullbenötigt. Ist das richtig oder fehlt mir hier etwas?
Dror
2
@RGC Nein, git rebase masterwird nicht den gleichen Job wie der zweite Befehl ( git rebase origin/master) ausführen, da masterund origin/mastermöglicherweise auf verschiedene Commits verweist (insbesondere angesichts der Tatsache, dass der erste Befehl git fetch origingeändert wurde origin/master).
Frerich Raabe
815
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]
Paul Draper
quelle
19
(Entspricht Frerichs Antwort)
Paul Draper
12
Ist dies nicht etwas anders als Frerichs Antwort, da dadurch Änderungen vom Ursprungsmaster zum lokalen Master vorgenommen werden, während Frerichs Antwort den lokalen Master unberührt lässt? (ziehen gegen holen)
Jimmy Huch
7
Nein, in Frerichs Antwort ändert die Rebase den lokalen Master. Ein Pull --rebase ist das gleiche wie ein von einem Fütterungsmaterial gefolgt Fetch
argumentum ad hominem
9
Zu Ihrer Information, Sie können interaktive Rebases mitgit pull --rebase=interactive origin master
Emmby
14
@adhominem - Ich habe die Git-Pull-Dokumentation überprüft und kann nichts sehen, was die Behauptung stützt, dass der lokale Master geändert wurde. Wenn ich in einem Zweig mit dem Namen bin devund ausgeführt werde git pull --rebase origin master, wird nur der Zweig devgeändert, nicht master. In der --rebaseFlag-Dokumentation heißt es, dass versucht wird, rebase the current branch on top of the upstream branch after fetchinglokale Tracking-Zweige zu ändern.
Stellen Sie Monica 2331977 am
227

Nachdem Sie Änderungen an Ihrer Filiale vorgenommen haben, checken Sie sie aus masterund ziehen Sie sie, um die neuesten Änderungen aus dem Repo zu erhalten:

git checkout master
git pull origin master

Überprüfen Sie dann Ihre Filiale und stützen Sie Ihre Änderungen auf master:

git checkout RB
git rebase master

... oder die letzten beiden Befehle in einer Zeile:

git rebase master RB

Wenn Sie versuchen, zurück zu drücken origin/RB, wird wahrscheinlich eine Fehlermeldung angezeigt. Wenn Sie der einzige sind, an dem gearbeitet wird RB, können Sie Push erzwingen:

git push --force origin RB

... oder wie folgt, wenn Sie git entsprechend konfiguriert haben:

git push -f
CharlesB
quelle
4
Wenn Sie versuchen, zu origin / RB zurückzukehren, wird wahrscheinlich eine Fehlermeldung angezeigt. Wenn Sie der einzige sind, der an RB arbeitet, können Sie Push - Force Origin RB verwenden. Quelle: stackoverflow.com/questions/8939977/…
Joey Baruch
1
Ah ... ich habe genau das. Mein "RB" wird korrekt neu basiert, aber ich erhalte endlose Fehler, wenn ich versuche, ihn nach dem erneuten Basieren zu pushen. Abgesehen von Push - Force Origin RB - gibt es eine "schönere" (nicht erzwungene) Möglichkeit, dies zu tun? Ich versuche nur, die Wahrnehmung von Gits hier zu verstehen - und scheitere.
Motti Shneor
2
@MottiShneor Nein, es gibt keinen schönen Weg. Wenn in der Zwischenzeit jemand anderes in die Filiale drängt, gehen seine Änderungen verloren! Wenn Sie nett zum Git-Commit-Verlauf sein möchten, sollten Sie den Master lieber in Ihrem Zweig zusammenführen, was sicher ist (Sie können darauf git pushverzichten -f).
Daniel Kullmann
110

Hinweis: Wenn Sie bereits umfassende Kenntnisse über Rebase haben, verwenden Sie für einen schnellen Rebase unter einem Liner. Lösung: Angenommen, Sie befinden sich in Ihrem Arbeitszweig und sind die einzige Person, die daran arbeitet.

git fetch && git rebase origin/master

Lösen Sie alle Konflikte, testen Sie Ihren Code, schreiben Sie fest und übertragen Sie neue Änderungen an den Remote-Zweig.

                            ~:   For noobs   :~

Die folgenden Schritte können jedem helfen, der neu ist git rebaseund dies problemlos tun möchte

Schritt 1: Angenommen, zu diesem Zeitpunkt müssen auf YourBranch keine Commits und Änderungen vorgenommen werden. Wir besuchen YourBranch.

git checkout YourBranch
git pull --rebase

Was ist passiert? Ruft alle Änderungen ab, die von anderen Entwicklern vorgenommen wurden, die an Ihrem Zweig arbeiten, und legt Ihre Änderungen darüber hinaus neu fest.

Schritt 2: Lösen Sie alle auftretenden Konflikte.

Schritt 3:

git checkout master
git pull --rebase

Was ist passiert? Ruft die neuesten Änderungen vom Remote-Master ab und setzt den lokalen Master auf dem Remote-Master neu. Ich halte den Remote Master immer sauber und lasse ihn bereit! Und arbeiten Sie lieber nur an Master oder Filialen vor Ort. Ich empfehle dies so lange, bis Sie eine Hand bei Git-Änderungen oder Commits bekommen. Hinweis: Dieser Schritt ist nicht erforderlich, wenn Sie den lokalen Master nicht verwalten. Stattdessen können Sie einen Remote-Master direkt in der lokalen Verzweigung abrufen und neu starten. Wie ich in einem Schritt am Anfang erwähnt habe.

Schritt 4: Lösen Sie alle auftretenden Konflikte.

Schritt 5:

git checkout YourBranch
git rebase master

Was ist passiert? Rebase auf Master passiert

Schritt 6: Lösen Sie alle Konflikte, wenn es Konflikte gibt. Verwenden Sie git rebase --continuediese Option, um die Wiederherstellung nach dem Hinzufügen der gelösten Konflikte fortzusetzen. Sie können git rebase --abortdie Rebase jederzeit abbrechen.

Schritt 7:

git push --force-with-lease 

Was ist passiert? Übertragen von Änderungen auf Ihre Remote-YourBranch. --force-with-leasestellt sicher, dass andere Entwickler andere Änderungen für YourBranch erhalten, während Sie die Basis neu festlegen. Dies ist sehr nützlich, anstatt Druck auszuüben. Falls eingehende Änderungen vorliegen, rufen Sie diese ab, um Ihre lokale YourBranch zu aktualisieren, bevor Sie Änderungen vornehmen.

Warum muss ich Änderungen vornehmen? So schreiben Sie die Festschreibungsnachricht in der Remote-YourBranch nach ordnungsgemäßer erneuter Basis neu oder ob Konflikte gelöst wurden? Dann müssen Sie die Änderungen, die Sie im lokalen Repo gelöst haben, auf das Remote-Repo von YourBranch übertragen

Yahoooo ...! Sie sind erfolgreich mit der Neugründung fertig.

Möglicherweise möchten Sie auch Folgendes tun:

git checkout master
git merge YourBranch

Wann und warum? Führen Sie Ihren Zweig zum Master zusammen, wenn Sie und andere Mitentwickler Änderungen vorgenommen haben. Dies macht YourBranch mit Master auf dem neuesten Stand, wenn Sie später an demselben Zweig arbeiten möchten.

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~
bh4r4th
quelle
Wofür ist das: "Ruft die neuesten Änderungen vom Master ab und stützt den Master auf den neuesten Master." Master auf Master neu starten? Müssen Sie nicht nur den neuesten Master ziehen?
John Little
@ JohnLittle Danke für den Hinweis. Ich meine Pulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!. Ich werde meine Beschreibung aktualisieren.
bh4r4th
21

Schritt 1:

git fetch origin

Schritt 2:

git rebase origin/master

Schritt 3: (Beheben Sie eventuelle Konflikte)

git add .

Schritt 4:

git rebase --continue

Schritt 5:

git push --force
GauthamManivannan
quelle
5
Keine Erklärung, mit welchem ​​Zweig begonnen werden soll. Keine gute Antwort.
Karl Morrison
12

1. Master zuerst aktualisieren ...

git checkout [master branch]
git pull [master branch]

2.Basieren Sie jetzt den Quellzweig mit dem Hauptzweig neu

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

Wenn der Quellzweig auf der Fernbedienung noch nicht vorhanden ist, tun Sie Folgendes:

git push -u origin [source branch]

"et voila ..."

N Djel Okoye
quelle
Ich mag die schrittweise Vorgehensweise dieser Antwort. Es hilft zu brechen, was genau passiert.
Dave Liu
6

git fetch origin master:master Ruft die neueste Version von Master ab, ohne sie auschecken zu müssen.

Alles was Sie brauchen ist:

git fetch origin master:master && git rebase master 👌

Naz
quelle
Nicht git fetchaktualisieren Master , ohne dass es auschecken? Abgesehen davon, dass git fetchnicht git mergedas richtige Updates? Wenn wir also auschecken master, werden nicht die neuesten Updates angezeigt. So ist nicht kürzer es während auf Funktionszweig zu tun, git fetchdann git rebase origin/master? Wir können das nicht tun, git rebase masterweil das versuchen wird, masterim Arbeitsbereich eine Basis zu erstellen . Wir müssen origin/mastervon den nicht zusammengeführten, aber in der Region sitzen.
Noitidart