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.
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.
Antworten:
Es gibt einen viel einfacheren Weg:
git merge --no-commit merge_branch
Wie der Mensch sagt:
Mit
--no-commit
der 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.
--no-ff
der Schnellvorlauf deaktiviert, was passiert, wenn keine Konflikte vorliegen.
git mergetool
wenn es Konflikte gibt.
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
pull
ist nur die Kombination von fetch
und merge
zuerst anrufen, git fetch merge_branch
dann letztere tunmerge
--no-commit --no-ff
ist wie eine .gitattributes
Datei im Stammverzeichnis zu haben, die es enthält * -merge
, aber mit der merge
Wahl, ob Sie es verwenden möchten oder nicht
Automatic merge went well; stopped before committing as requested
verstehe das. Wenn ich versuche zu laufen git mergetool
, heißt es No files need merging
.
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.
git merge
Antworten vergleicht, um die Dinge für alle anderen zu klären, die auf diese Seite stoßen.
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.
Für alle, die hierher gekommen sind und sich jetzt über den Unterschied zwischen der Antwort von @ True git difftool
und 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.tool
Gerä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.*.cmd
Eintrag 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 difftool
noch mergetool
other_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.
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 mergefrom
Zweig 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 y
und <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 n
oder 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 e
und 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 s
Option 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.
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.