2014-07-14 21 views
66

Gibt es einen Weg, um Konflikte für alle Dateien zu lösen mit der Kasse --ours und --theirs? Ich weiß, dass Sie es für einzelne Dateien tun können, aber keinen Weg finden, es für alle zu tun.Git Entschlossenheit Konflikt mit --ours/- ihrem für alle Dateien

+4

Funktioniert 'git checkout --ours - .'? Das '.' bedeutet das aktuelle Verzeichnis, wenn es vom Arbeitsverzeichnisstamm aus angewendet wird, also im Grunde genommen das gesamte Arbeitsverzeichnis. Ich bin mir nicht sicher, ob das mit dem Flag "-ours" funktionieren wird, und ich bin mir nicht sicher, wie es mit gelöschten oder umbenannten Dateikonflikten umgehen wird. –

+0

@Cupcake Ich habe es erfolgreich verwendet. Vielleicht sollte das eine Antwort sein? –

Antwort

62

grep einfach durch das Arbeitsverzeichnis und die Ausgabe über den Befehl xargs senden:

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

oder

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

Wie das funktioniert: grep durch jede Datei im aktuellen Verzeichnis suchen (die .) und Unterverzeichnisse rekursiv (das Flag -r) nach Konfliktmarkern suchen (die Zeichenfolge '< < < < < < < ‚)

die -l oder --files-with-matches Flag verursacht grep nur den Dateinamen ausgibt, wenn die Zeichenfolge gefunden wurde. Der Scan stoppt nach der ersten Übereinstimmung, sodass jede übereinstimmende Datei nur einmal ausgegeben wird.

Die angepaßten Dateinamen werden dann zu pipedxargs, ein Dienstprogramm, das die verrohrt Eingabestrom in einzelne Argumente für git checkout --ours aufbricht oder --theirs

Weitere at this link.

Da es sehr unpraktisch wäre, dies jedes Mal an der Befehlszeile einzugeben, wenn Sie es häufig verwenden, ist es keine schlechte Idee, eine alias für Ihre Shell der Wahl zu erstellen: Bash ist das Übliche.

Diese Methode sollte 2.4.x

+9

Anstelle von grepping kann man auch ['git diff - nur -name --diff-filter = U'] verwenden (http://stackoverflow.com/a/10874862/559913). – Thai

+7

Auch 'git status | grep beide | awk '{print $ 3}' | xargs git checkout - [ihre | unsere] '. Schneller als Grepping, wenn Sie ein großes Projekt haben. – joshbodily

+1

@joshbodily Schön. Ich habe keine so großen Projekte, dass ich einen Unterschied bemerken würde, aber ich kann sehen, dass es viel schneller wäre, besonders wenn sich wenige Dateien im Vergleich zur Gesamtzahl im Verzeichnis geändert haben - was für normal sein sollte verpflichtet. – Dmitri

30

Sie mindestens Git-Versionen durch können -Xours oder -Xtheirs mit git merge auch. Also:

  1. Abbruch der aktuellen merge (zum Beispiel mit git reset --hard HEAD)
  2. merge mit der Strategie Sie bevorzugen (git merge -Xours oder git merge -Xtheirs)

HAFTUNGSAUSSCHLUSS: Natürlich können Sie nur eine Option wählen, entweder -Xours oder -Xtheirs, verwenden Sie andere Strategie sollten Sie natürlich Datei für Datei gehen.

Ich weiß nicht, ob es einen Weg für checkout gibt, aber ich glaube nicht, dass es wirklich nützlich ist: die Strategie mit dem Befehl checkout ist nützlich, wenn Sie verschiedene Lösungen für verschiedene Dateien wollen, sonst gehen Sie einfach für die Merge-Strategie-Ansatz.

+0

Danke, wusste nicht, dass sie "--ours" und "--theirs" für die Zusammenführung haben. Es scheint, dass sie für die Zusammenführung nicht Teil der Strategie "-s" sind, sondern Teil der rekursiven Optionen "-X". '-s' Version von uns ersetzt nur alle Dateien, ohne sie zu verschmelzen, und ihre existieren nicht. – exe163

+0

Es gibt keine '--Their' oder' --ours' Option, um v1.9.4 zu git. Ein Ansatz wäre 'git merge -s recursive -XTHIRS BRANCH'. – fbmd

+0

"--theirs" und "-ours" sind weder mit git '2.2.0' verfügbar. Entweder war meine Antwort nicht präzise oder sie waren in der älteren Git-Version verfügbar (diese Antwort ist ziemlich alt in der IT-Epoche). Der richtige Ansatz ist mit "-X". Ich aktualisiere entsprechend – ThanksForAllTheFish

21

git checkout --[ours/theirs] . wird tun, was Sie wollen, solange Sie an der Wurzel aller Konflikte sind. unsere/ihre betrifft nur nicht zusammengefügte Dateien, so dass Sie nicht speziell nach Konflikten zwischen grep/find/etc suchen müssen.

+4

Für mich scheint dies nicht in Unterverzeichnisse zu recrisen. –

1
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'd sein müssen, um dies zu erreichen.