Holen Sie sich Änderungen vom Master in den Zweig in Git


689

In meinem Repository habe ich einen Zweig namens, an aqdem ich arbeite.

Ich habe dann neue Arbeit geleistet und Fehler gemacht master.

Was ist der beste Weg, um diese Commits in die aqBranche zu bringen? Erstellen Sie einen weiteren neuen Zweig aus masterund führen Sie ihn zusammen mit aq?


3
In Zukunft können Sie Ihren Bugfix-Zweig auch von einem gemeinsamen Vorfahren des Masters und anderer Zweige starten, für die die Korrekturen erforderlich sind, damit Sie ihn in all diesen Zweigen zusammenführen können, ohne etwas anderes zu übernehmen.
Cascabel

2
@Jefromi, aber das liegt außerhalb seiner Kontrolle, wenn er nicht die einzige Person ist, die an dem Projekt arbeitet. andere Leute aktualisieren den Master. Zum Teufel, Sie selbst können den Master von einem dritten Zweig aus aktualisieren, und die Situation wäre unvermeidlich und erfordert eine allgemeine Lösung.
Ahnbizcad

@ahnbizcad Ich bin mir ziemlich sicher, dass er die Kontrolle darüber hat, wo er seine eigene Niederlassung gründet. Wenn sein Zweig ein gemeinsamer Vorfahr derjenigen ist, zu denen er verschmelzen möchte, und die Leute anschließend zu diesen Zweigen hinzufügen, ist er immer noch ein gemeinsamer Vorfahr.
Cascabel

Jungs fragen, macht dieser Befehl es,git pull origin my_branch_name
Basheer AL-MOMANI

Antworten:


794

Überprüfen Sie den aqZweig und starten Sie ihn von master.

git checkout aq
git rebase master

Kann Rebase aus einem anderen Zweig kommen? Dh. git rebase otherbranch? Es scheint, dass ich in meiner Frage ein wenig daneben lag. Ich habe mich von einem Zweig verzweigt und dann Änderungen am ursprünglichen Zweig vorgenommen.
Slee

2
Wenn ich recht habe, werden bei der Pull-Anforderung alle Master-Commits angezeigt. Wenn Sie Merge / Origin-Master verwenden, werden alle Master-Commits als 1 Commit angezeigt, was die Codeüberprüfung erleichtert.
Foo Bar User

4
Manchmal git mergewäre es besser. Wenn sich beide Zweige im Laufe der Zeit entwickelt haben, sollten Sie überlegen, welcher für Sie am besten geeignet ist.
erick2red

70
Spät zur Party, aber dies ist eine großartige Übersicht darüber, wann Rebase gegen Merge: atlassian.com/git/tutorials/merging-vs-rebasing/…
ebuat3989

7
Wenn Ihre vorherigen Commits für Branch aq öffentlich sind, führen Sie keine Rebase durch. atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant

301

Sie sollten in der Lage sein, genau dann, git merge origin/masterwenn Sie sich in Ihrem AQ-Zweig befinden.

git checkout aq
git merge origin/master

55
Ob die Rebase „besser“ ist, hängt vollständig von der jeweiligen Situation ab.
Bombe

13
Warum rufst du nicht einfach "Git Merge Master" anstelle von "Git Merge Origin / Master" an?
Michael Küller

145
Verwenden rebaseSie diese Option, wenn Ihre Niederlassung lokal ist und nicht an sie weitergeleitet wurde origin. Verwenden mergeSie diese Option, wenn Ihr Zweig bereits verschoben wurde. rebasewird die Geschichte neu schreiben.
Müllsammler

17
@Toskan Sie können auf Probleme stoßen, bei denen Ihr lokaler Master mit der Fernbedienung nicht auf dem neuesten Stand ist. Auf diese Weise wird sichergestellt, dass Sie die Remote-Kopie des Codes zusammenführen.
Chris Kooken

8
@garbagecollector Ich bin gegen Rebase (ich kann, werde aber nicht Rebase) Ich sehe keinen Grund, mit Rebase zu spielen. Es macht die Dinge nur unnötig komplex. Sie haben immer die Frage "Habe ich das auf Remote geschoben?" Nachdenken und es ist ein Schmerz, Neuankömmlingen zu erklären. Einige Leute sagen, dass es Zusammenführungs-Commits vermeidet. Aber ich möchte Merge-Commits haben. Sie sind keine Unordnung, sie dokumentieren, wenn Zweige zusammengeführt werden. Können wir also zum letzten Mal endlich aufhören, so zu handeln, als würden wir uns alle zum Meister verpflichten? Wenn Sie Merge-Commits im Protokoll nicht so sehr mögen, filtern Sie sie einfach mit --no-merges.
Nurettin

92

Zuerst auschecken, um zu meistern:

git checkout master

Nehmen Sie alle Änderungen, Hotfixes und Commits vor und drücken Sie Ihren Master.

Gehen Sie zurück zu Ihrem Zweig, 'aq', und führen Sie den Master darin zusammen:

git checkout aq
git merge master

Ihre Filiale wird mit dem Master auf dem neuesten Stand sein. Ein gutes und grundlegendes Beispiel für das Zusammenführen ist 3.2 Git Branching - Basic Branching and Merging .


25

Es gibt keine Garantie dafür, dass die Master-Fehlerkorrekturen nicht zu den anderen Commits gehören. Daher können Sie sie nicht einfach zusammenführen. Tun

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

Angenommen, diese Commits stellen die Fehlerkorrekturen dar.

Bewahren Sie Fehlerbehebungen von nun an in einem separaten Zweig auf. Sie werden in der Lage sein, nur

git merge hotfixes

wenn Sie sie alle in den regulären Entwicklungszweig rollen möchten.


17

Entweder cherry-pickdie relevanten Commits in Zweig aqoder Zweig masterin Zweig zusammenführen aq.


5
@Slee du hast dir selbst geantwortet ... es ist nicht die Lösung für diese Situation
mtet88

13

Füge es mit zusammen aq

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push

8

Einfacher Weg

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A

7

Für mich hatte ich bereits Änderungen vorgenommen und wollte das Neueste aus der Basisbranche. Ich konnte es nicht rebaseund cherry-pickhätte ewig gedauert, also tat ich Folgendes:

git fetch origin <base branch name>  
git merge FETCH_HEAD

also in diesem Fall:

git fetch origin master  
git merge FETCH_HEAD

7

Dies ( von hier ) hat bei mir funktioniert:

git checkout aq
git pull origin master
...
git push

Zitat:

git pull origin masterRuft den Inhalt des Hauptzweigs ab und führt ihn mit Ihrem Zweig zusammen und erstellt ein Zusammenführungs-Commit. Wenn es Zusammenführungskonflikte gibt, werden Sie zu diesem Zeitpunkt benachrichtigt und müssen die Zusammenführungs-Commits lösen, bevor Sie fortfahren können . Wenn Sie bereit sind, Ihre lokalen Commits, einschließlich Ihres neuen Merge-Commits, auf den Remote-Server zu übertragen, führen Sie sie aus git push.


Es ist wichtig zu beachten, dass diese Lösung perfekt ist, wenn eine Zusammenführung speziell erforderlich ist, dh wenn der Hauptzweig aus irgendeinem Grund nicht neu basiert werden kann.
Cudacoder

3

Sie haben ein paar Möglichkeiten. git rebase master aqauf den Zweig, der die Festschreibungsnamen behält, aber NICHT REBASE, wenn dies ein entfernter Zweig ist. Sie können, git merge master aqwenn Sie die Commit-Namen nicht behalten möchten. Wenn Sie die Commit-Namen behalten möchten und es sich um einen Remote-Zweig handelt, werden git cherry-pick <commit hash>die Commits auf Ihren Zweig übertragen.


0

Sie können dies auch tun, indem Sie eine einzelne Zeile ausführen.
git merge aq master

Dies entspricht

git checkout aq
git merge master

Dies tut nicht das, was Sie denken, dass es tut. git merge a bführt Zweige zusammen aund bin den aktuellen Zweig. Aber git merge awenn Sie auf einem Zweig sind, awerden Sie nichts tun (weshalb dies ein bisschen so aussieht, als würde es das tun, was Sie denken, dass es tut). (Siehe git-scm.com/docs/git-merge#Documentation/… .)
MikeBeaton

0

BEARBEITEN:

Meine Antwort unter Dokumenten eine Art und Weise zu verschmelzen masterin aq, wo , wenn Sie die Details der Zusammenführung sehen es die Änderungen auf Verzeichnisse aqvor der Zusammenführung, nicht die Änderungen auf master. Ich habe festgestellt, dass das wahrscheinlich nicht das ist, was du willst, auch wenn du denkst, dass es das ist!

Gerade:

git checkout aq
git merge master

ist gut.

Ja, diese einfache Zusammenführung zeigt, dass die Änderungen von masterzu aqdiesem Zeitpunkt vorgenommen wurden und nicht umgekehrt. aber das ist okay - da ist das passiert! Später, wenn Sie Ihren Zweig endgültig zusammenführen master, zeigt eine Zusammenführung schließlich alle Ihre vorgenommenen Änderungen an master(genau das, was Sie wollen, und ist das Commit, bei dem die Leute erwarten, dass sie diese Informationen sowieso finden).

Ich habe es überprüft und der folgende Ansatz zeigt auch genau die gleichen Änderungen (alle Änderungen, die aqseit der ursprünglichen Aufteilung zwischen aqund vorgenommen wurden master) wie der normale Ansatz oben, wenn Sie schließlich alles wieder zusammenführen master. Daher denke ich, dass der einzige wirkliche Nachteil (abgesehen davon, dass er zu komplex und nicht standardisiert ist ...: - /) darin besteht, dass, wenn Sie die letzten Änderungen mit zurückführen git reset --hard HEAD~<n>und dies über die Zusammenführung hinausgeht, die folgende Version die Liste zurückrollt 'falscher' Zweig, den Sie von Hand reparieren müssen (zB mit git reflog& git reset --hard [sha]).


[Also, was ich vorher dachte, war das:]

Es gibt ein Problem mit:

git checkout aq
git merge master

da die Änderungen, die im Merge-Commit angezeigt werden (z. B. wenn Sie jetzt oder später in Github, Bitbucket oder Ihrem bevorzugten lokalen Git-Verlaufs-Viewer suchen), die Änderungen sind, die am Master vorgenommen wurden und möglicherweise nicht Ihren Wünschen entsprechen.

Auf der anderen Seite

git checkout master
git merge aq

zeigt die in aq vorgenommenen Änderungen an, was wahrscheinlich das ist, was Sie wollen. (Oder zumindest ist es oft das, was ich will!) Aber die Zusammenführung mit den richtigen Änderungen befindet sich im falschen Zweig!

Wie zu bewältigen?!

Der vollständige Prozess, der mit einem Zusammenführungs-Commit endet, das die an aq vorgenommenen Änderungen anzeigt (gemäß der zweiten Zusammenführung oben), wobei sich die Zusammenführung jedoch auf den aq-Zweig auswirkt, lautet:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

Dies: führt aq mit dem Master zusammen, spult die gleiche Zusammenführung mit aq vor, macht sie auf dem Master rückgängig und bringt Sie wieder auf aq!

Ich habe das Gefühl, dass mir etwas fehlt - dies scheint etwas zu sein, das Sie offensichtlich wollen würden, und etwas, das schwer zu tun ist.

Rebase ist auch NICHT gleichwertig. Es verliert die Zeitstempel und die Identität der auf aq getätigten Commits, was ich auch nicht will.


0

Szenario:

  • Ich habe einen Zweig von Master Say Branch-1 erstellt und ihn zu meinem lokalen Standort gezogen.
  • Mein Freund hat einen Zweig vom Meister erstellt, sagen wir Zweig-2.
  • Er hat einige Codeänderungen an den Master übergeben.
  • Jetzt möchte ich diese Änderungen vom Hauptzweig in meinen lokalen Zweig übernehmen.

Lösung

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

Sie können Konflikte in Ihrer Datei finden, nachdem Sie "git stash apply" ausgeführt haben. Sie müssen es manuell reparieren und jetzt können Sie pushen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.