421 Stimmen

Git merge meldet "bereits aktuell", obwohl es einen Unterschied gibt

Ich habe ein Git-Repository mit 2 Zweigen: Master und Test.

Es gibt Unterschiede zwischen Master- und Testzweigen.

Beide Zweige haben alle Änderungen übertragen.

Wenn ich es tue:

git checkout master  
git diff test

Es erscheint ein Bildschirm voller Änderungen, der die Unterschiede anzeigt. Ich möchte die Änderungen im Testzweig zusammenführen und tue dies auch:

git merge test

Sie erhalten jedoch die Meldung "Bereits aktuell".

Die Untersuchung der Dateien in den einzelnen Zweigen zeigt jedoch deutliche Unterschiede.

Wo liegt das Problem und wie kann ich es lösen?

0 Stimmen

Haben Sie nicht bestätigten geänderten Code?

0 Stimmen

15voto

John Murphy Punkte 299

Achten Sie darauf, dass Sie den Zweig, den Sie zusammenführen wollen, zuerst auschecken und dann ziehen (damit Ihre lokale Version mit der entfernten Version übereinstimmt).

Dann checken Sie zurück in den Zweig, in dem Sie die Zusammenführung durchführen wollen, und Ihre Git-Zusammenführung sollte funktionieren.

1 Stimmen

Das war's für mich - ich habe einen Pull in master gemacht; habe erfahren, dass ich neue Commits in "branch" bekommen habe. Versuchte, den "branch" in master zu mergen - "bereits auf dem neuesten Stand". Habe git checkout "branch" durchgeführt - bekam "Your branch is behind... and can be fast-forwarded.", was bedeutet, dass ich "branch" aktualisieren musste, indem ich git pull während in der "Filiale"

7voto

FoxDeploy Punkte 11261

Dies geschieht, weil Ihre lokale Kopie des Zweigs, den Sie zusammenführen wollen, nicht mehr aktuell ist. Ich habe meinen Zweig, genannt MyBranch und ich möchte es in ProjectMaster .

_>git status
On branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

nothing to commit, working tree clean

_>git merge ProjectMaster
Already up-to-date.

Pero Ich weiß dass es Änderungen gibt, die zusammengeführt werden müssen!

Die Sache ist die, wenn ich tippe git merge ProjectMaster sieht git nach meine lokale Kopie dieses Zweigs, die möglicherweise nicht aktuell ist . Um zu sehen, ob dies der Fall ist, sage ich Git zuerst, dass es prüfen soll, ob meine Zweige veraltet sind und hole alle Änderungen, falls dies der Fall ist, mit, äh, fetch . Dann springe ich in den Zweig, den ich zusammenführen möchte, um zu sehen, was dort passiert...

_>git fetch origin

_>git checkout ProjectMaster
Switched to branch ProjectMaster
**Your branch is behind 'origin/ProjectMaster' by 85 commits, and can be fast-forwarded.**
  (use "git pull" to update your local branch)

Ah-ha! Meine lokale Kopie ist um 85 Übertragungen veraltet, das erklärt alles! Nun, ich Pull die Änderungen, die ich vermisse, und gehen Sie dann zu MyBranch und versuchen Sie die Zusammenführung erneut.

_>git pull
Updating 669f825..5b49912
Fast-forward

_>git checkout MyBranch-Issue2
Switched to branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

_>git merge ProjectMaster
Auto-merging Runbooks/File1.ps1
CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1

Automatic merge failed; fix conflicts and then commit the result.

Und jetzt habe ich ein weiteres Problem zu lösen...

6voto

VonC Punkte 1117238

Eine Zusammenführung erfolgt immer zwischen dem aktuellen HEAD und einem oder mehreren Commits (normalerweise Branch Head oder Tag),
und die Indexdatei muss mit dem Baum von HEAD commit (d.h. dem Inhalt des letzten Commits) übereinstimmen, wenn sie beginnt.
Mit anderen Worten, git diff --cached HEAD müssen keine Änderungen melden.

Die zusammengeführte Übertragung ist bereits in HEAD . Dies ist der einfachste Fall, der als "bereits aktuell" bezeichnet wird.

Das sollte bedeuten, dass die Commits in test bereits in master zusammengeführt werden, aber da andere Commits auf master gemacht werden, git diff test würde noch einige Unterschiede ergeben.

6voto

bubjavier Punkte 942

Ist mir passiert und ich wurde auf diese Seite weitergeleitet. Ich bin mir nicht sicher, ob ich das gleiche Szenario hatte, aber bei mir war es so, dass ich versucht habe, den "Testzweig" wieder zusammenzuführen.

So habe ich zuvor zusammengeführt, aber ich absichtlich ausschließen einige spezifische Änderungen während dieser Zusammenführung, so dass es eindeutig einige Unterschiede zwischen Zweigen hat. Ich habe dann versucht, es erneut zusammenzuführen, weil ich merke/vergesse, dass ich eine bestimmte Änderung/Datei hinzufügen sollte und wollte, die ich zuvor ausgeschlossen hatte, und ich hoffte, dass bei einer erneuten Zusammenführung alle Änderungen angezeigt würden, die ich zuvor ausgeschlossen hatte, aber ich habe mich geirrt und bekomme stattdessen die Meldung "Bereits aktuell".

Nach der Lektüre von @Bombes Kommentar/Antwort hat er Recht, und Git verhält sich meiner Meinung nach so, also habe ich ein hartes Backup der Dateien im Testzweig gemacht, dann den Masterzweig ausgecheckt und die Dateien manuell eingefügt und so übertragen, als ob es neue Änderungen wären.

Ich bin mir nicht sicher, ob dies der richtige Weg ist oder anderen, die dasselbe Problem haben, helfen könnte, aber es hat eine Lösung für meinen speziellen Fall gebracht.

0 Stimmen

Dieselbe Situation hier. Das Szenario ist, dass ich eine "Integration" Zweig zurück zu mehreren "Feature" Zweig aufgeteilt werden soll.

5 Stimmen

Anstelle des manuellen Einfügens können Sie Dateien direkt aus einem Zweig in den aktuellen Zweig auschecken: git checkout srcBranch -- path/to/file . Kann auch Dateiglobs verwenden.

1 Stimmen

Danke, ich habe Ihre Zahlungsmethode verwendet, aber ich habe checkout srcBranch -- * und schaute dann auf meine Diffs

5voto

cdupont Punkte 51

Das ist mir passiert, weil GIT seltsamerweise dachte, dass der lokale Zweig sich vom entfernten Zweig unterscheidet. Dies war im Zweigdiagramm sichtbar: Es zeigte zwei verschiedene Zweige an: remotes/origin/branch_name und branch_name.

Die Lösung bestand einfach darin, das lokale Repository zu entfernen und es aus der Ferne neu zu klonen. Auf diese Weise würde GIT verstehen, dass remotes/origin/branch_name> und branch_name tatsächlich dasselbe sind, und ich könnte die git merge branch_name .

rm <my_repo>
git clone <my_repo>
cd <my_repo>
git checkout <branch_name>
git pull
git checkout master
git merge <branch_name>

0 Stimmen

Ist das nicht genau die gleiche Antwort wie die von Acarter?

0 Stimmen

Ich glaube, Acarter hat den Punkt nicht verstanden - es gab keine Änderungen an der Fernbedienung - das war überhaupt nicht das Problem. Ich musste "git checkout master" und dann "git merge <branch_name>" ausführen, um die Zusammenführung im Schnelldurchlauf zu erzwingen. Andersherum hat es nichts gebracht, da der Zweig vor dem Master war. Die Antwort von Bombe ist eine nette Erklärung, beantwortet aber nicht den Teil der Frage "wie löse ich das Problem".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X