Ich möchte kein visuelles Zusammenführungswerkzeug, und ich möchte auch nicht die in Konflikt stehende Datei vi und manuell zwischen HEAD (meins) und der importierten Änderung (ihrer) auswählen müssen. Die meiste Zeit möchte ich entweder alle ihre Änderungen oder alle meine. In der Regel liegt dies daran, dass meine Änderung das Tempo erhöht hat und durch einen Zug zu mir zurückkehrt, aber an verschiedenen Stellen leicht modifiziert werden kann.
Gibt es ein Kommandozeilen-Tool, mit dem die Konfliktmarkierungen entfernt und je nach meiner Wahl auf die eine oder andere Weise ausgewählt werden können? Oder eine Reihe von Git-Befehlen, die ich selbst als Alias verwenden kann, um jeden einzelnen auszuführen.
# accept mine
alias am="some_sequence;of;commands"
alias at="some_other_sequence;of;commands"
Das zu tun ist ziemlich nervig. Für 'akzeptiere meine' habe ich versucht:
randy@sabotage ~/linus $ git merge test-branch
Auto-merging Makefile
CONFLICT (content): Merge conflict in Makefile
Automatic merge failed; fix conflicts and then commit the result.
randy@sabotage ~/linus $ git checkout Makefile
error: path 'Makefile' is unmerged
andy@sabotage ~/linus $ git reset --hard HEAD Makefile
fatal: Cannot do hard reset with paths.
Wie soll ich diese Änderungsmarker loswerden?
Ich kann:
git reset HEAD Makefile; rm Makefile; git checkout Makefile
Aber das scheint ziemlich rund zu sein, es muss einen besseren Weg geben. Und zu diesem Zeitpunkt bin ich mir nicht sicher, ob Git überhaupt glaubt, dass die Zusammenführung stattgefunden hat, also denke ich nicht, dass dies unbedingt überhaupt funktioniert.
In die andere Richtung zu gehen und ihre zu akzeptieren, ist ebenso chaotisch. Der einzige Weg, wie ich es herausfinden kann, ist:
git show test-branch:Makefile > Makefile; git add Makefile;
Dies gibt mir auch eine durcheinandergebrachte Commit-Nachricht, die zweimal Conflicts: Makefile enthält.
Kann jemand bitte darauf hinweisen, wie die beiden oben genannten Aktionen auf einfachere Weise ausgeführt werden können? Vielen Dank
Antworten:
Die Lösung ist sehr einfach.
git checkout <filename>
versucht, die Datei aus dem Index auszuchecken , und schlägt daher beim Zusammenführen fehl.Was Sie tun müssen, ist (dh ein Commit auschecken ):
Zum Auschecken Ihrer eigenen Version können Sie eine der folgenden Optionen verwenden :
oder
oder
Zum Auschecken der anderen Version können Sie eine der folgenden Optionen verwenden :
oder
oder
Sie müssten auch 'add' ausführen, um es als gelöst zu markieren:
quelle
--ours
und--theirs
genau das Gegenteil von dem bedeutet, was ich intuitiv gedacht habe, als ich diesen Befehl ausprobiert habe ...git show
- dies überspringt die Normalisierung von Zeilenumbrüchen.--
wird von Git verwendet, um Revisionen ( Zweignamen usw.) von Pfadnamen (Dateinamen, Verzeichnisse) zu trennen. Es ist wichtig, wenn Git nicht entscheiden kann, ob ein Name der Name des Zweigs oder der Name der Datei ist. Dies folgt der POSIX- (oder GNU-) Konvention, doppelte Striche zu verwenden, um Optionen von Argumenten (Dateinamen) zu trennen.theirs
/ours
kann ausgetauscht erscheinen, wenn Sie Konflikte im Rahmen einer Rebase-Operation lösen. Da die Rebase durch Auschecken des Zielzweigs funktioniert und dann das Cherry-Picking von "Ihrem" Zweig auf das Ziel übertragen wird, stammt die eingehende Änderung ("ihre") von "Ihrem" Zweig, und der aktuelle Zweig ist der Zielzweig ("unser"). ).Versuche dies:
Um ihre Änderungen zu akzeptieren:
git merge --strategy-option theirs
Um deine zu akzeptieren:
git merge --strategy-option ours
quelle
Basierend auf Jakubs Antwort können Sie der Einfachheit halber die folgenden Git-Aliase konfigurieren:
Sie können optional einen oder mehrere Dateipfade zum Auflösen verwenden und standardmäßig alles im aktuellen Verzeichnis auflösen, wenn keine angegeben sind.
Fügen Sie sie dem
[alias]
Abschnitt Ihres~/.gitconfig
oder Ihres Laufs hinzuquelle
[alias]
Abschnitt in Ihrer~.gitconfig
oder Ihrer Verwendung hinzugit config --global accept-ours "..."
. Habe meine Antwort bearbeitet.~/.gitconfig
.!f() { git checkout --ours -- "${@:-.}" git add -u "${@:-.}; }; f
Basierend auf der Antwort von Kynan sind hier dieselben Aliase, die so geändert wurden, dass sie Leerzeichen und Anfangsstriche in Dateinamen verarbeiten können:
quelle
Die ideale Situation für die Lösung von Konflikten besteht darin, dass Sie im Voraus wissen, auf welche Weise Sie sie lösen möchten, und die Optionen für die
-Xours
oder die-Xtheirs
rekursive Zusammenführungsstrategie übergeben können. Draußen sehe ich drei szenische:Um diese drei Szenarien anzugehen, können Sie Ihrer
.gitconfig
Datei (oder einer gleichwertigen Zeile) die folgenden Zeilen hinzufügen :Das
get(ours|theirs)
Tool behält nur die jeweilige Version der Datei bei und wirft alle Änderungen der anderen Version weg (es erfolgt also keine Zusammenführung).Das
merge(ours|theirs)
Tool führt die Drei-Wege-Zusammenführung aus der lokalen, der Basis- und der Remote-Version der Datei erneut durch und wählt Konflikte in der angegebenen Richtung aus. Dies hat einige Einschränkungen, insbesondere: Es ignoriert die Diff-Optionen, die an den Merge-Befehl übergeben wurden (z. B. Algorithmus- und Whitespace-Behandlung). führt die Zusammenführung sauber aus den Originaldateien durch (daher werden alle manuellen Änderungen an der Datei verworfen, die gut oder schlecht sein können); und hat den Vorteil, dass es nicht durch Diff-Marker verwechselt werden kann, die in der Datei enthalten sein sollen.Das
keep(ours|theirs)
Tool bearbeitet einfach die Diff-Markierungen und eingeschlossenen Abschnitte und erkennt sie durch regulären Ausdruck. Dies hat den Vorteil, dass die Diff-Optionen aus dem Zusammenführungsbefehl beibehalten werden und Sie einige Konflikte von Hand lösen und den Rest automatisch lösen können. Es hat den Nachteil, dass andere Konfliktmarkierungen in der Datei verwirrt werden können.Diese werden alle verwendet, indem ausgeführt wird,
git mergetool -t (get|merge|keep)(ours|theirs) [<filename>]
wo, wenn<filename>
nicht angegeben, alle in Konflikt stehenden Dateien verarbeitet werden.Unter der Annahme, dass Sie wissen, dass es keine Diff-Marker gibt, die den regulären Ausdruck verwirren könnten, sind die
keep*
Varianten des Befehls im Allgemeinen die mächtigsten. Wenn Sie diemergetool.keepBackup
Option nicht gesetzt oder wahr lassen, können Sie die*.orig
Datei nach dem Zusammenführen anhand des Ergebnisses der Zusammenführung unterscheiden, um zu überprüfen, ob sie sinnvoll ist. Als Beispiel führe ich Folgendes ausmergetool
, um die Änderungen vor dem Festschreiben zu überprüfen:Hinweis : Wenn dies
merge.conflictstyle
nichtdiff3
der Fall ist, muss stattdessen das/^|||||||/
Muster in dersed
Regel verwendet werden/^=======/
.quelle