Wie füge ich alle Dateien manuell in Git zusammen?

78

Ich möchte alle Dateien manuell mit meld oder einem anderen Diff-Tool zusammenführen. Wie kann ich das mit Git machen?
Wenn ich renne git mergetool , heißt es no files need merging. Ich kann es also nur tun, wenn ich Konflikte habe.

Gennad
quelle
Bitte geben Sie uns einen Kontext darüber, was Sie zusammenführen möchten und warum dies nicht automatisch erfolgen soll.
Johnsyweb
3
Ich möchte Textdateien zusammenführen :) Ich habe das manuelle Zusammenführen von mercurial verwendet und möchte 3 Dateien gleichzeitig sehen. Wenn etwas schief geht, kann ich sie immer alle selbst bearbeiten
gennad
6
Ja, ich möchte in einigen Fällen manuell zusammenführen, weil ich in solchen Situationen weiß, dass alles so
läuft,
1
Was ist mit dem automatischen Zusammenführen und dem Beheben von Problemen, wenn dies passiert?
Tomasz Wysocki
1
@TomaszWysocki, weil ich nicht wissen kann, ob ein "vom Menschen als problematisch erachtetes Problem" aufgetreten ist. Es gibt nur eine Möglichkeit für mich zu wissen, ob ein "Problem, das von Git als problematisch angesehen wird" aufgetreten ist. Git führt Dateien automatisch zusammen und ich kann nicht alle automatischen Entscheidungsergebnisse von git markieren. Es kann sich entscheiden, eine bestimmte Änderung vorzunehmen, die mir nicht gefällt. Ich möchte alle Änderungen genehmigen, bevor sie vorgenommen werden.
Kuchen

Antworten:

108

Es gibt einen viel einfacheren Weg:

git merge --no-commit merge_branch

Wie der Mensch sagt:

Mit --no-commitder Zusammenführung durchführen , aber die Zusammenführung fehlgeschlagen vorgeben und sie Autocommit nicht, dem Benutzer die Möglichkeit zu geben , zu prüfen und weiter das Merge Ergebnis zu optimieren , bevor ich.

Skywinder
quelle
7
Vielen Dank. Gibt es vielleicht eine Möglichkeit, mergetool / meld zu verwenden, um die Änderungen stückweise zu überprüfen und mit einer schönen Drei-Wege-Oberfläche zusammenzuführen?
James
16
Durch Hinzufügen wird --no-ffder Schnellvorlauf deaktiviert, was passiert, wenn keine Konflikte vorliegen.
Løiten
Und natürlich verwenden, git mergetoolwenn es Konflikte gibt.
Pluto
5
Dies ist immer noch eine automatische Zusammenführung, daher wird die Ursprungsfrage nicht beantwortet.
ThomasMcLeod
61

Ich hatte ein Szenario, in dem:

git merge --no-commit merge_branch 

habe gerade einen schnellen Vorlauf verursacht.

In diesem Fall können Sie Folgendes verwenden:

git merge --no-commit --no-ff merge_branch

und dann können Sie Ihre Änderungen überprüfen

NSjonas
quelle
1
Ist es möglich, es auf die gleiche Weise zu ziehen? Ich muss ALLE Konflikte manuell überprüfen, wenn ein schneller Vorlauf nicht möglich ist.
Maxim
1
@ Maxim nein, aber da pullist nur die Kombination von fetchund mergezuerst anrufen, git fetch merge_branchdann letztere tunmerge
Top-Master
Beides zu verwenden --no-commit --no-ffist wie eine .gitattributesDatei im Stammverzeichnis zu haben, die es enthält * -merge, aber mit der mergeWahl, ob Sie es verwenden möchten oder nicht
Top-Master
Ich Automatic merge went well; stopped before committing as requestedverstehe das. Wenn ich versuche zu laufen git mergetool, heißt es No files need merging.
Unknow0059
23

Eine ähnliche Frage ist, wie man ein Automerge mit Git verhindert.

FractalSpace gab eine Antwort, die ich für nützlich halte:

$ git checkout master
$ git difftool -t kdiff3 local-branch HEAD

Die Idee ist, Difftools anstelle von Tools zum automatischen Zusammenführen zu verwenden, um manuell auszuwählen, was Sie benötigen, und neue Dateien zu erstellen.

Wahr
quelle
Ich habe eine Antwort hinzugefügt, die diese Antwort mit den git mergeAntworten vergleicht, um die Dinge für alle anderen zu klären, die auf diese Seite stoßen.
Stevegt
7

Hinweis: Wenn Sie darauf bestehen, manuell zusammengeführt zu werden (möglicherweise für eine bestimmte Klasse von Dateien), können Sie dennoch einen Zusammenführungstreiber definieren .
Sie haben ein konkretes Beispiel in " Git - wie man einen Zusammenführungskonflikt und eine manuelle Zusammenführung für eine ausgewählte Datei erzwingt ".

Auf diese Weise kann Ihr Merge-Treiberskript jedes gewünschte Merge-Tool aufrufen.

VonC
quelle
6

Für alle, die hierher gekommen sind und sich jetzt über den Unterschied zwischen der Antwort von @ True git difftoolund den anderen Antworten, die verwendet werden git merge, wundern , siehe Git mergetool vs difftool .

Kurz gesagt, wenn Sie git für die Verwendung eines modernen diff.toolGeräts wie kdiff3, meld oder vimdiff konfiguriert haben, können Sie mit diesem Diff-Tool manuell zusammenführen, und die Befehlszeile kann einfach sein:

git difftool other_branch

... können Sie so eine manuelle Zwei-Wege-Zusammenführung zwischen Ihrer aktuellen Niederlassung und other_branch durchführen (beschrieben als $ LOCAL und $ REMOTE in man git-config).

Der "richtige" Weg, den die anderen Antworten diskutieren, wäre, stattdessen git so zu konfigurieren, dass zB kdiff3 oder vimdiff als Ihr verwendet werden merge.tool, und Folgendes zu verwenden:

git merge --no-commit --no-ff other_branch
git mergetool

... dieser Befehl kann eine manuelle N-Wege-Zusammenführung zwischen $ BASE, $ LOCAL und $ REMOTE zu $ ​​MERGED durchführen. Ein Beispiel für die Konfiguration von git finden Sie unter https://stackoverflow.com/a/2235841/1264797 . Sie müssen den mergetool.*.cmdEintrag oft gar nicht konfigurieren, wenn Sie eines der Tools verwenden, die git bereits kennt. (Meld kann nur drei Fenster anzeigen. Wenn Sie also Meld mit den Standardeinstellungen verwenden, wird $ BASE nicht angezeigt.)

Jemand könnte einspringen, um mich zu korrigieren, aber abgesehen von der N-Wege-Zusammenführungsfähigkeit scheinen die beiden Methoden das gleiche Ergebnis zu erzielen. Weder difftoolnoch mergetoolother_branch als übergeordnetes Element für das neue Commit hinzugefügt, daher ist in beiden Fällen die Zusammenführung in z. B. gitk nicht offensichtlich und müsste in der Commit-Nachricht beschrieben (und später bemerkt) werden.

stevegt
quelle
3

Ich fand die anderen Antworten unbefriedigend und wurde frustriert, als ich nach einer Antwort suchte. Eine Lösung für diese Frage habe ich endlich hier gefunden: https://stackoverflow.com/a/11593308/1351182

git checkout branchToMergeTo
git checkout --patch branchToMergeFrom [file]

Sie werden dann aufgefordert (Datei für Datei, wenn Sie nicht angegeben haben file), welche "Hunks" Sie zusammenführen möchten. Auf diese Weise werden Sie durch jeden Teil des automatischen Zusammenführungsprozesses geführt und stattdessen nach einer manuellen Arbitrierung gefragt, welche Teile Sie aus dem mergefromZweig akzeptieren möchten . Hier ist ein Beispiel dafür, wie es in meinem Projekt aussah:

@@ -249,7 +251,8 @@ def draw_everything():
  
     draw_bg()
     draw_balls(ax)
-    plt.show(block=False)
+    if show:
+        plt.show(block=False)
 
 def advance(ms, accel_fun, collision_matrix_fun):
     global balls
(3/6) Apply this hunk to index and worktree [y,n,q,a,d,K,j,J,g,/,e,?]?

Nach der Eingabe von yund <Enter>wurde mir das nächste Stück (4/6)für diese Datei angezeigt . Mit dieser Eingabeaufforderung unten können Sie einfach die Zusammenführung "Hunk" mit akzeptieren y, ablehnen noder sogar manuell bearbeiten. Hier sind die Optionen:

y - apply this hunk to index and worktree
n - do not apply this hunk to index and worktree
q - quit; do not apply this hunk or any of the remaining ones
a - apply this hunk and all later hunks in the file
d - do not apply this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

Ich wollte einen Teil manuell bearbeiten, da ich die Zusammenführung nicht genau so akzeptieren oder ablehnen wollte, wie sie gestellt wurde. Also entschied ich mich eund bekam eine Datei zum Bearbeiten. Ich war erfreut, als ich bemerkte, dass es unten sogar Anweisungen gab, wie man das Stück richtig bearbeitet. Mit der oben beschriebenen sOption können Sie sogar Teile in kleinere Teile aufteilen .

Ich würde diesen Prozess empfehlen, wenn Sie eine manuelle Zusammenführung wünschen, bei der Sie den automatischen Prozess dennoch so weit wie möglich nutzen. Der Unterschied besteht darin, dass Sie jeden Zusammenführungs-Hunk überwachen und nach Belieben bearbeiten können. Ich hoffe das hilft zukünftigen Lesern.


Die Lösung, die ich mir vorgestellt hatte (aber nicht gefunden hatte), bestand im Grunde darin, jedes Zusammenführungsstück als Konflikt zu behandeln und die Konflikte manuell zu lösen. Jemand könnte wissen, wie dieser Ansatz funktioniert, zum Beispiel wenn es eine Zusammenführungsstrategie gibt, die jede Änderung als Konflikt behandelt! Bitte kommentieren Sie, wenn Sie einen Weg finden, dies zu tun. Es wäre langweiliger, aber vielleicht besser für manche Leute geeignet.

Myridium
quelle
1

Ich wähle unsere Strategie aus (sie existiert auch als Auswahl in TortoiseGit), nachdem ich einen manuellen Diff durchgeführt habe, bei dem Sie die gewünschten Änderungen manuell vorgenommen haben.

Von: https://git-scm.com/docs/merge-strategies

Der Zusammenführungsmechanismus (Git-Merge- und Git-Pull-Befehle) ermöglicht die Auswahl der Backend-Zusammenführungsstrategien mit der Option -s. Einige Strategien können auch ihre eigenen Optionen verwenden, die durch Angabe von -X-Argumenten für Git Merge und / oder Git Pull übergeben werden können.

unsere

Dies löst eine beliebige Anzahl von Köpfen auf, aber der resultierende Baum der Zusammenführung ist immer der des aktuellen Zweigkopfs, wodurch alle Änderungen von allen anderen Zweigen effektiv ignoriert werden. Es soll verwendet werden, um die alte Entwicklungsgeschichte der Seitenzweige zu ersetzen. Beachten Sie, dass dies von der Option -Xours zur rekursiven Zusammenführungsstrategie abweicht.

Was Bitbucket später jedoch sieht, ist mir ein Rätsel. Es erkennt das Commit als Zusammenführen, kann aber den Zweig nicht zusammenführen (löst keine Pull-Anfrage) - wahrscheinlich könnte der Bitbucket-Guru in dieser Angelegenheit helfen, ich kann Ihnen nicht einmal etwas geben Protokolle / Fehlermeldungen, da ich diese Sichtbarkeit nicht habe - git / TortoiseGit beschwert sich jedoch überhaupt nicht.

Tomasz Janicki
quelle