Ich habe ein Git-Repository mit 2 Zweigen: Master und Test.
Es gibt Unterschiede zwischen Master- und Testzweigen.
Beide Niederlassungen haben alle Änderungen festgeschrieben.
Wenn ich mache:
Git Checkout Master
Git Diff Test
Ein Bildschirm voller Änderungen zeigt die Unterschiede an. Ich möchte die Änderungen im Testzweig zusammenführen und Folgendes tun:
Git Merge Test
Aber erhalten Sie die Meldung "Bereits aktuell"
Das Untersuchen von Dateien unter den einzelnen Zweigen zeigt jedoch deutlich Unterschiede.
Was ist das Problem hier und wie löse ich es?
Antworten:
Die Meldung "Bereits aktuell" bedeutet, dass alle Änderungen aus dem Zweig, den Sie zusammenführen möchten, bereits mit dem Zweig zusammengeführt wurden, in dem Sie sich gerade befinden. Insbesondere bedeutet dies, dass der Zweig, den Sie zusammenführen möchten, ein übergeordneter Zweig Ihres aktuellen Zweigs ist . Herzlichen Glückwunsch, das ist die einfachste Zusammenführung, die Sie jemals machen werden. :) :)
Verwenden Sie
gitk
diese Option , um einen Blick auf Ihr Repository zu werfen. Das Etikett für den Zweig "Test" sollte sich irgendwo unter Ihrem Etikett für den Zweig "Master" befinden.Ihre Niederlassung ist in Bezug auf ihre Muttergesellschaft auf dem neuesten Stand. Laut Zusammenführung gibt es seit der letzten Zusammenführung keine neuen Änderungen im übergeordneten Element. Das bedeutet nicht, dass die Zweige gleich sind, da Sie in Ihrem Arbeitszweig viele Änderungen vornehmen können und es sich so anhört, als ob Sie dies tun.
Bearbeiten 10/12/2019:
Laut Charles Drake im Kommentar zu dieser Antwort lautet eine Lösung zur Behebung des Problems:
Dies bringt es zurück auf das "Test" -Niveau.
Dann mach:
um Änderungen zurück zum zentralen Repo zu erzwingen.
quelle
Dies passiert mir oft, wenn ich weiß, dass es Änderungen am Remote-Master gibt, und ich versuche, sie mithilfe von zusammenzuführen
git merge master
. Dies wird jedoch nicht mit dem Remote-Master, sondern mit Ihrem lokalen Master zusammengeführt.Also, bevor Sie die Zusammenführung durchführen, checken Sie den Master aus und dann
git pull
dort. Dann können Sie die neuen Änderungen in Ihrer Filiale zusammenführen.quelle
git fetch
würde den Hauptzweig aktualisieren, selbst wenn ich gerade auf einem anderen bin. Es stellt sich heraus, dass dies nicht der Fall ist. Vielen Dank! Ich bin mir ziemlich sicher, dass es eine Option gibtfetch
, mit der Sie angeben können, welchen Zweig Sie erhalten möchten.git fetch --all
, aber das holt nur die Zweige, es zieht sie nicht.git fetch --all && git merge origin/master
. Sie müssen Ihr lokalesmaster
System nicht aktualisieren , um Remote-Änderungen zusammenzuführen.git merge master
und 1 mitgit merge origin/master
. Ich hatte auch ausgechecktmaster
undgit pull
vor dem Update 2 Filialen. Obwohl sie denselben Inhalt hatten, wurden beim Erstellen einer PR zwischen den beiden Zweigen einige unterschiedliche Dateien angezeigt. Ich habe durchgit pull
den Zielzweig in den Feature-Zweig korrigiert, was zeigte:Already up to date! Merge made by the 'recursive' strategy.
Dies führte zu einem Zusammenführungs-Commit ohne Änderungen, entfernte aber die unerwarteten Diff-Dateien aus PR. Gibt es eine Idee, warum es einen Unterschied zwischen dem Zusammenführen "gleichwertiger" lokaler und entfernter Zweige gibt?Angenommen, Sie haben einen Zweig
master
mit dem folgenden Festschreibungsverlauf:Jetzt erstellen Sie einen Verzweigungstest, arbeiten daran und führen 4 Commits durch:
master
Der Kopf zeigt auf D undtest
der Kopf zeigt auf H.Die Meldung "Bereits aktuell" wird angezeigt, wenn der HEAD des Zweigs, in den Sie zusammenführen, ein übergeordnetes Element der Commit-Kette des Zweigs ist, den Sie zusammenführen möchten. Das ist hier der Fall:
D
ist ein Elternteil vonE
.Es gibt nichts zu Druck aus
test
zumaster
, da nichts geändert hatmaster
seitdem. Was Sie hier tun möchten, ist buchstäblich, Git zu sagen, dassmaster
der Kopf auf H zeigen soll, sodass der Master-Zweig die folgende Commit-Historie hat:Dies ist ein Job für den Git-Befehl
reset
. Sie möchten auch, dass das Arbeitsverzeichnis diese Änderung widerspiegelt, sodass Sie einen Hard- Reset durchführen:quelle
git reset --hard
ziemlich drastisch ist. Kann sie Commits verlieren? Gibt es eine sicherere Möglichkeit, diese Änderungen vorzunehmen, oder sind die Gefahren einergit reset --hard
Überbewertung?--hard
Option achten sollten, ist die Tatsache, dass sie Ihr Arbeitsverzeichnis tatsächlich ändert und Sie dadurch nicht festgeschriebene Änderungen verlieren. Persönlich führe ichgit status
vor und nach jedem manuell ausgeführten git-Befehl einen Befehl aus, um sicherzustellen, dass mein Repo sauber ist oder sich im erwarteten Zustand befindet.--hard
Option erforderlich ? Ich war jetzt ein paar Mal in dieser Situation und habe immer ohne zurückgesetzt--hard
. Es funktionierte einwandfrei, ohne das Risiko, nicht festgeschriebene Änderungen zu verlieren.Was für mich funktioniert, nehmen wir an, Sie haben branch1 und möchten es in branch2 zusammenführen.
Sie öffnen die git-Befehlszeile, gehen zum Stammordner von branch2 und geben Folgendes ein:
Wenn Sie Konflikte haben, müssen Sie keinen Git-Push ausführen, sondern zuerst die Konflikte lösen und dann drücken.
quelle
Das sollte bedeuten, dass die Commits im Test bereits im Master zusammengeführt sind, aber da andere Commits auf dem Master ausgeführt werden,
git diff test
würde dies immer noch einige Unterschiede ergeben.quelle
Dies liegt daran, dass Ihre lokale Kopie des Zweigs, den Sie zusammenführen möchten, veraltet ist. Ich habe meinen Zweig angerufen
MyBranch
und möchte ihn zusammenführenProjectMaster
.Aber ich weiß, dass es Änderungen gibt, die zusammengeführt werden müssen!
Wenn ich
git merge ProjectMaster
tippe, sieht sich git meine lokale Kopie dieses Zweigs an, die möglicherweise nicht aktuell ist . Um zu sehen, ob dies der Fall ist, fordere ich Git zunächst auf, zu überprüfen, ob meine Zweige veraltet sind, und Änderungen abzurufen, wenn dies der Fall istfetch
. Dann hüpfe ich in den Zweig, den ich zusammenführen möchte, um zu sehen, was dort passiert ...Ah-ha! Meine lokale Kopie ist um 85 Commits veraltet, das erklärt alles! Jetzt
Pull
schreibe ich die fehlenden Änderungen auf, gehe dann zuMyBranch
und versuche die Zusammenführung erneut.Und jetzt muss ich noch ein Problem beheben ...
quelle
Dies geschah mir, weil GIT seltsamerweise dachte, dass sich die lokale Niederlassung von der entfernten Niederlassung unterscheidet. Dies war im Zweigdiagramm sichtbar: Es wurden zwei verschiedene Zweige angezeigt: Fernbedienungen / Ursprung / Zweigname und Zweigname.
Die Lösung bestand einfach darin, das lokale Repo zu entfernen und es erneut von der Fernbedienung zu klonen. Auf diese Weise würde GIT verstehen, dass Remotes / origin / branch_name> und branch_name tatsächlich identisch sind, und ich könnte das ausgeben
git merge branch_name
.quelle
git merge origin/master
git merge master
arbeitete stattdessen für mich. Um den Master in den Feature-Zweig zu integrieren, können Sie Folgendes verwenden:quelle
Stellen Sie sicher, dass Sie den Zweig, den Sie zusammenführen möchten, zuerst auschecken und dann abrufen (damit Ihre lokale Version mit der Remote-Version übereinstimmt).
Gehen Sie dann zurück zu Ihrem Zweig, für den Sie die Zusammenführung durchführen möchten, und Ihre Git-Zusammenführung sollte funktionieren.
quelle
git pull
passierte mir und wurde auf diese Seite geschickt, nicht sicher, ob ich das gleiche Szenario hatte, aber ich versuchte, diesen "Test" -Zweig "wieder zusammenzuführen".
Ich habe es also zuvor zusammengeführt, aber ich habe absichtlich einige spezifische Änderungen während dieser Zusammenführung ausgeschlossen, sodass es eindeutig Unterschiede zwischen den Zweigen gibt. Ich habe dann versucht, es erneut zusammenzuführen, weil mir klar wurde / vergessen wurde, dass ich eine bestimmte Änderung / Datei hinzufügen sollte und wollte, die ich zuvor ausgeschlossen hatte, und ich hatte gehofft, wenn ich sie erneut zusammenführe, würden alle Änderungen angezeigt, die ich zuvor ausgeschlossen habe , aber ich habe mich geirrt und erhalte stattdessen die Meldung "Bereits aktuell".
Beim Lesen von @ Bombes Kommentar / Antwort hat er Recht, und ich denke, er verhält sich so. Ich habe also die Dateien im Testzweig hart gesichert, dann den Hauptzweig ausgecheckt und die Dateien manuell eingefügt und festgeschrieben es, als ob es neue Änderungen wären.
Ich bin mir nicht sicher, ob dies der richtige Weg ist oder anderen helfen könnte, die das gleiche Problem haben, aber es hat eine Lösung für meinen speziellen Fall geliefert.
quelle
git checkout srcBranch -- path/to/file
. Kann auch Dateiglob verwenden.checkout srcBranch -- *
meine Unterschiede gesetzt und dann angeschautWenn das Zusammenführen von Zweig A mit Zweig B "Bereits aktuell" meldet, ist die Umkehrung nicht immer der Fall. Es ist nur wahr, wenn Zweig B von Zweig A abstammt, andernfalls kann Zweig B einfach Änderungen haben, die nicht in A sind.
Beispiel:
Zu diesem Zeitpunkt meldet das Zusammenführen von A zu B "Bereits aktuell", aber die Zweige sind unterschiedlich, da Zweig B Aktualisierungen vom Master hat, Zweig A jedoch nicht.
quelle
Konfrontierte dieses Szenario mit Git Bash.
Unser Repository verfügt über mehrere Zweige, und jeder Zweig hat einen anderen Festschreibungszyklus, und die Zusammenführung erfolgt gelegentlich. Old_Branch wurde als übergeordnetes Element für New_Branch verwendet
Old_Branch wurde mit einigen Änderungen aktualisiert, die mit New_Branch zusammengeführt werden mussten
Verwenden Sie den folgenden Pull-Befehl ohne Verzweigung, um alle Quellen aus allen Verzweigungen abzurufen.
Seltsamerweise zieht dies nicht alle Commits aus allen Zweigen. Hatte es so gedacht, da das angegebene fast alle Zweige und Tags zeigt.
Um dies zu beheben, hatte die Old_Branch die neueste Verwendung gezogen
Jetzt ausgecheckt New_Branch
Zog es, um sicher zu sein
Und Viola bekam Konflikte von Old_Branch zu New_Branch :), die erwartet wurden
quelle
Das gleiche ist mir passiert. Aber das Szenario war etwas anders, ich hatte einen Hauptzweig und ich habe release_1 (sagen wir) daraus herausgearbeitet. Im Zweig release_1 wurden einige Änderungen vorgenommen und mit dem Ursprung zusammengeführt. dann habe ich ssh gemacht und auf dem remote server habe ich release_1 wieder mit dem befehl git checkout -b release_1 ausgecheckt - der tatsächlich einen neuen branch release_ herausarbeitet! vom Master, anstatt den bereits vorhandenen Zweig release_1 vom Ursprung auszuchecken. Das Problem wurde durch Entfernen des Schalters "-b" behoben
quelle
Ich hatte das gleiche Problem. Ich hatte Änderungen an der Fernbedienung und es wurde immer noch "Bereits auf dem neuesten Stand" angezeigt. Das erneute Klonen des Repositorys hat das Problem für mich behoben.
quelle
Dumm, aber es könnte passieren. Angenommen, Ihrem Filialnamen wird beispielsweise eine Problemreferenz vorangestellt
#91-fix-html-markup
, wenn Sie diese Zusammenführung durchführen:es wird nicht wie beabsichtigt funktionieren, weil alles nach dem
#
ignoriert wird, weil#
ein Inline-Kommentar startet.In diesem Fall können Sie den Zweig ohne
#
Namen umbenennen oder den Namen des Zweigs in einfache Anführungszeichen setzen :git merge '#91-fix-html-markup'
.quelle