So testen Sie eine Zusammenführung, ohne sie zuvor zusammenzuführen

165

Gibt es eine Möglichkeit, einen git mergezwischen zwei Zweigen, dem aktuellen Arbeitszweig und dem Master, zu simulieren , ohne jedoch Änderungen vorzunehmen?

Ich habe oft Konflikte, wenn ich eine machen muss git merge. Gibt es eine Möglichkeit, die Zusammenführung zuerst zu simulieren?

Dole Doug
quelle
2
siehe auch stackoverflow.com/questions/501407/…
Andre Holzner
1
Mögliches Duplikat von Gibt es eine git-merge --dry-run Option?
Der Blechmann

Antworten:

131

Ich glaube nicht, dass es eine Möglichkeit gibt, zu simulieren, was passieren wird, bis Sie die Zusammenführung versuchen. Wenn Sie jedoch sicherstellen, dass die Ausgabe von git statusleer ist, bevor Sie die Zusammenführung durchführen, ist es ziemlich sicher, einfach fortzufahren und es zu versuchen. Wenn Sie Konflikte bekommen, können Sie sofort zu dem Zustand zurückkehren, in dem Sie zuvor waren:

git reset --merge

Seit Git 1.7.4 können Sie die Zusammenführung auch abbrechen, indem Sie Folgendes tun:

git merge --abort

(Wie in der Festschreibungsnachricht, die diese Option hinzugefügt hat, erläutert wird , wurde diese aus Gründen der Konsistenz git rebase --abortusw. hinzugefügt .)

Mark Longair
quelle
4
@ Bernsteins Antwort lautet genau die Frage, wie die Zusammenführung simuliert werden soll. Verwenden --no-commitist meiner Meinung nach viel einfacher
Samirahmed
14
@samirahmed: @Amber hat die Frage wörtlich beantwortet, sicher, obwohl --no-commitSie immer noch den Index und den Arbeitsbaum ändern, was nicht genau "ohne Änderungen" ist :) Mein Punkt ist, wenn Leute diese Art von Fragen stellen Frage, es ist im Allgemeinen, weil sie nicht wissen, dass der beste Weg, um zu sehen, wie eine Zusammenführung verlaufen würde, darin besteht, einfach die Zusammenführung zu versuchen , oft weil sie nicht wissen, wie einfach es ist, zu dem Zustand zurückzukehren, in dem sie sich zuvor befanden wenn sich herausstellte, dass es Probleme gab.
Mark Longair
2
Ich weiß nicht, ob dies in einer neueren Version von git hinzugefügt wurde, aber in den Dokumenten (1.8.4) heißt es " git merge --abortist gleichbedeutend mit dem git reset --mergeZeitpunkt, an dem MERGE_HEADes vorhanden ist", also was auch immer leichter zu merken ist :)
Samuel Meacham
@SamuelMeacham: Danke, dass Sie darauf hingewiesen haben - es wurde in 1.7.4 eingeführt. Ich habe die Antwort damit aktualisiert. Vielen Dank!
Mark Longair
Dieser Vorschlag hat auf git 1.9.4 nichts für mich getan.
Djangofan
137

Sie können verwenden git merge --no-commit, um zu verhindern, dass die Zusammenführung tatsächlich festgeschrieben wird. Wenn Ihnen die Funktionsweise der Zusammenführung nicht gefällt, setzen Sie sie einfach auf den ursprünglichen Kopf zurück.

Wenn Sie die Zusammenführung definitiv nicht abschließen möchten, auch wenn es sich um einen schnellen Vorlauf handelt (und somit per Definition keine Konflikte aufweist), können Sie dies ebenfalls hinzufügen --no-ff.

Bernstein
quelle
Ich glaube nicht, dass git merge --abortes das gibt - vielleicht meinst du das git reset --merge?
Mark Longair
Nein, ich habe nur vergessen, dass es im Gegensatz rebasedazu kein --abortFor gibt git merge.
Amber
7
Ich würde auch anziehen --no-ff. Damit es nicht zu einer Zusammenführung kommt.
Andy
1
@ Andy's --no-ffist hier so ziemlich obligatorisch, da --no-commitÄnderungen beim schnellen Vorlauf nicht aufhören.
Jackr
1
@Anant Anand Gupta - das ist ein guter Trick, aber es sollte sein: git config --global alias.tm "merge --no-commit --no-ff"
pasx
109

Wenn ich Änderungen an einem Themenzweig mit dem Master vergleichen möchte, finde ich es am einfachsten und sichersten, Folgendes zu tun:

git checkout master
git checkout -b trial_merge
git merge topic_branch

Nach Abschluss der Zusammenführung ist die konsolidierte Änderung vom Master leicht zu erkennen

git diff master

Wenn Sie fertig sind, löschen Sie einfach den Zweig trial_merge

git checkout master
git branch -D trial_merge

Auf diese Weise ändert sich der Hauptzweig nie.

Ian
quelle
4
Sie können auch git checkout --detachalles tun und testen, was Sie wollen. Wenn Sie Ihre Änderungen später beibehalten möchten, tun Sie dies git checkout -b new_branch. Und wenn Sie Ihre Änderungen wegwerfen möchten, checken Sie einen beliebigen Zweig aus ( git checkout master).
Shayan Toqraee
Wenn topic_branches riesig ist (wie es wahrscheinlich der Fall ist, wenn Sie sich überhaupt mit dieser Frage befassen), ist die diff masterAusgabe wahrscheinlich zu groß, als dass Sie sie in Augenschein nehmen könnten, wenn eine Zusammenführung zu Konflikten führen würde.
Crescent Fresh
Ich mag das definitiv sehr ... sicher und einfach.
Leo
4

Ich benutze :

git merge --ff-only

laut Dokumentation :

Verweigern Sie das Zusammenführen und Beenden mit einem Status ungleich Null, es sei denn, der aktuelle HEAD ist bereits auf dem neuesten Stand oder die Zusammenführung kann als schneller Vorlauf aufgelöst werden.

Es ist nicht wirklich eine Simulation, da es zu einem schnellen Vorlauf kommt, wenn keine Konflikte zwischen den beiden Zweigen auftreten. Im Falle von Konflikten werden Sie jedoch informiert und es passiert nichts.

Ortomala Lokni
quelle
4

Ich konnte in git merge --abortletzter Zeit verwenden. Dies kann jedoch nur verwendet werden, wenn ein Zusammenführungskonflikt vorliegt. Wenn Sie sicher sind, dass Sie kein Commit durchführen möchten, verwenden Sie die anderen oben genannten Methoden.

bean5
quelle
1
Welche anderen oben genannten Methoden? Sie alle erwähnen git merge --abort. Sie sollten Ihre Antwort in Zukunft prüfen, indem Sie angeben, wer die Antwort geschrieben hat, auf die Sie sich beziehen.
Michael Fulton
3

Warum nicht einfach einen Wegwerfzweig erstellen (git checkout -b) und dort eine Testzusammenführung durchführen?

Mohan S Nayaka
quelle
1
Was Sie vorschlagen, ist eigentlich die Antwort von Ian knapp ausgedrückt :)
tzot
0

Ich weiß nicht genau, ob es Ihr Fall ist , aber Ihre Frage erinnert mich daran, dass ich manchmal ein Feature starte, mich im Laufe der Tage verpflichte und die Entwicklung darauf viele Male zusammenführe.

In diesem Punkt verliere ich die Kontrolle über die genauen Dateien, die ich geändert habe, und ich werde es erst erfahren, wenn meine Funktion geschlossen wurde und mein Code entwickelt wird.

In diesem Fall können Sie anhand von Sourcetree feststellen, welche Änderungen Sie vorgenommen haben (nicht anders als bei den Zusammenführungen).

Sie müssen mit der rechten Maustaste auf den Basiszweig klicken und Folgendes auswählen Diff Against Current:

Sourcetrees Merkmal, um den Unterschied zwischen zwei Zweigen zu kennen

Dann zeigt Ihnen Sourcetree alle Änderungen, die zusammengeführt werden, wenn Sie Ihren Zweig in den Basiszweig zusammenführen.

Ergebnisse

Natürlich werden die Konflikte nicht angezeigt, aber es ist ein nützliches Werkzeug für Zusammenführungen.

Lucas Amorim Silva
quelle