Git lösen Konflikte mit --ours / - ihren für alle Dateien

110

Gibt es eine Möglichkeit, Konflikte für alle Dateien mithilfe von checkout --oursund zu lösen --theirs? Ich weiß, dass Sie es für einzelne Dateien tun können, aber keinen Weg finden, es für alle zu tun.

exe163
quelle
7
Funktioniert git checkout --ours -- .? Dies .bedeutet das aktuelle Verzeichnis, wenn es vom Arbeitsverzeichnisstamm angewendet wird, also im Grunde genommen das gesamte Arbeitsverzeichnis. --oursIch bin mir nicht sicher , ob das mit dem Flag funktioniert , und ich bin mir nicht sicher, wie es mit gelöschten oder umbenannten Dateikonflikten umgehen wird.
@ Cupcake Ich habe es erfolgreich verwendet. Vielleicht sollte das eine Antwort sein?
Pedro Gimeno

Antworten:

89

Durchsuchen Sie einfach das Arbeitsverzeichnis und senden Sie die Ausgabe über den Befehl xargs:

grep -lr '<<<<<<<' . | xargs git checkout --ours

oder

grep -lr '<<<<<<<' . | xargs git checkout --theirs

So funktioniert das: grepDurchsucht jede Datei im aktuellen Verzeichnis (the .) und in den Unterverzeichnissen rekursiv (das -rFlag) nach Konfliktmarkierungen (die Zeichenfolge '<<<<<<<').

Das Flag -loder --files-with-matchesbewirkt, dass grep nur den Dateinamen ausgibt, in dem die Zeichenfolge gefunden wurde. Der Scanvorgang wird nach dem ersten Abgleich beendet, sodass jede übereinstimmende Datei nur einmal ausgegeben wird.

Die angepaßten Dateinamen werden dann verrohrt zu Xargs , ein Dienstprogramm , das aufbricht der Eingangsstrom in einzelne Argumente für verrohrt git checkout --oursoder--theirs

Mehr unter diesem Link .

Da es sehr unpraktisch wäre, dies jedes Mal über die Befehlszeile eingeben zu müssen, ist es möglicherweise keine schlechte Idee, einen Alias für die Shell Ihrer Wahl zu erstellen, wenn Sie ihn häufig verwenden : Bash ist der übliche .

Diese Methode sollte mindestens Git-Versionen 2.4.x funktionieren

Dmitri
quelle
14
Anstatt zu greifen, denke ich, ist es auch möglich, zu verwenden git diff --name-only --diff-filter=U.
Thai
9
Auch git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]. Schneller als Grepping, wenn Sie ein großes Projekt haben.
Joshbodily
1
@ Joshbodily Schön. Ich habe keine Projekte, die so groß sind, dass ich einen Unterschied bemerken würde, aber ich kann sehen, wie viel schneller es wäre, insbesondere wenn sich nur wenige Dateien im Vergleich zur Gesamtzahl im Verzeichnis geändert haben ---- was für normal der Fall sein sollte begeht.
Dmitri
1
Beachten Sie, dass dies nicht für Umbenennungs- / Umbenennungskonflikte funktioniert, z. B.CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
Borek Bernard
1
Noch eine Option : git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours].
Zitrax
52

Sie können -Xoursoder auch -Xtheirsmit git merge. So:

  1. die aktuelle Zusammenführung abbrechen (zum Beispiel mit git reset --hard HEAD)
  2. Zusammenführen mit der Strategie, die Sie bevorzugen ( git merge -Xoursoder git merge -Xtheirs)

HAFTUNGSAUSSCHLUSS: Natürlich können Sie entweder nur eine Option auswählen -Xoursoder -Xtheirseine andere Strategie verwenden, die Sie natürlich Datei für Datei durchführen sollten.

Ich weiß nicht, ob es einen Weg dafür gibt checkout, aber ich halte es ehrlich gesagt nicht für schrecklich nützlich: Die Auswahl der Strategie mit dem Befehl checkout ist nützlich, wenn Sie unterschiedliche Lösungen für unterschiedliche Dateien wünschen, andernfalls wählen Sie einfach den Ansatz der Zusammenführungsstrategie.

ThanksForAllTheFish
quelle
Danke, ich wusste nicht, dass sie '--ours' und '--theirs' zum Zusammenführen haben. Es scheint, dass sie für die Zusammenführung nicht Teil der Strategie '-s' sind, sondern Teil der rekursiven Optionen '-X'. Die '-s'-Version von uns ersetzt eigentlich nur alle Dateien, ohne sie zusammenzuführen, und ihre existieren nicht.
exe163
Es gibt keine --theirsoder --ours-Option für Git v1.9.4. Ein Ansatz wäre git merge -s recursive -Xtheirs BRANCH.
fbmd
--theirsund --ourssind auch mit git nicht verfügbar 2.2.0. Entweder war meine Antwort nicht präzise oder sie waren in einer älteren Git-Version verfügbar (diese Antwort ist in der IT-Epoche ziemlich alt). Der richtige Ansatz ist mit -X. Ich aktualisiere entsprechend
ThanksForAllTheFish
Ab Version 2.4.0 - unsere und - ihre sind immer noch sehr gut verfügbar git-scm.com/docs/git-checkout
Dmitri
Versuchte dies und bekam "automatische Zusammenführung fehlgeschlagen, Konflikte beheben". Dieser Befehl funktioniert eindeutig nicht wie beabsichtigt, und ich empfehle, ihn zu vermeiden - zu fehlerhaft.
Adam
37

git checkout --[ours/theirs] .wird tun, was Sie wollen, solange Sie an der Wurzel aller Konflikte sind. Unsere / ihre betreffen nur nicht zusammengeführte Dateien, sodass Sie Konflikte nicht speziell erfassen / finden / etc müssen.

Cory Petosky
quelle
5
Für mich scheint dies nicht in Unterverzeichnisse zurückzukehren.
Daniel Baughman
5
Ich verstehe error: path 'foo/bar/blah' does not have our version.
Robin Green
Ich verwende Git Version 2.16.2.windows.1 und es funktioniert perfekt für mich. Vielen Dank!
Pankwood
30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

Scheint den Job zu machen. Beachten Sie, dass Sie in das Stammverzeichnis des Git-Repos cd'ed werden müssen, um dies zu erreichen.

Peter
quelle
3
Ich denke, dies ist eine bessere Antwort als die am besten gewählte, da (1) sie für alle Dateien gilt, nicht nur für das Arbeitsverzeichnis; und (2) es wird keine Sprödigkeit haben, nach Konfliktmarkern zu suchen. Der Befehl 'git diff' listet hier alle nicht zusammengeführten Pfade auf. Genau das möchten wir auschecken.
Bchurchill
Nett! Ich war immer besorgt über die Zuverlässigkeit der Konfliktmarker grep
00-BBB
2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

Ich habe diese Funktion in der .zshrc- Datei hinzugefügt .

Verwenden Sie sie folgendermaßen: gitcheckoutall theirsodergitcheckoutall ours

iWheelBuy
quelle