web-dev-qa-db-de.com

Git löst Konflikte mit --ours/- Ihren für alle Dateien

Gibt es eine Möglichkeit, Konflikte für alle Dateien mithilfe der Checkout-Codes --ours und --theirs zu lösen? Ich weiß, dass Sie es für einzelne Dateien tun können, aber keinen Weg finden konnte, dies für alle zu tun.

85
exe163

Grep einfach durch das Arbeitsverzeichnis und sende die Ausgabe mit dem Befehl xargs:

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

oder

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

Funktionsweise: grep durchsucht jede Datei im aktuellen Verzeichnis (den .) und die Unterverzeichnisse rekursiv (das -r-Flag) nach Konfliktmarken (die Zeichenfolge "<<<<<<<").

das Flag -l oder --files-with-matches bewirkt, dass grep nur den Dateinamen ausgibt, in dem die Zeichenfolge gefunden wurde. Der Scanvorgang wird nach dem ersten Treffer angehalten, sodass jede übereinstimmende Datei nur einmal ausgegeben wird.

Die übereinstimmenden Dateinamen sind dann piped bis xargs , ein Dienstprogramm, das den gepipsten Eingabestrom in einzelne Argumente für git checkout --ours oder --theirs aufteilt. 

Mehr unter diesem Link .

Da es sehr unpraktisch wäre, dies jedes Mal in der Befehlszeile eingeben zu müssen, wenn Sie es häufig verwenden, ist es möglicherweise keine schlechte Idee, ein alias für Ihre Shell der Wahl zu erstellen: Bash ist das übliche.

Diese Methode sollte mindestens die Git-Versionen 2.4.x durchlaufen.

72
Dmitri

Sie können auch -Xours oder -Xtheirs mit git merge. So:

  1. die aktuelle Zusammenführung abbrechen (zum Beispiel mit git reset --hard HEAD)
  2. zusammenführen mit der von Ihnen bevorzugten Strategie (git merge -Xours oder git merge -Xtheirs)

HAFTUNGSAUSSCHLUSS: Natürlich können Sie nur eine Option auswählen, entweder -Xours oder -Xtheirs.

Ich weiß nicht, ob es einen Weg für checkout gibt, aber ich denke nicht, dass es äußerst nützlich ist: Die Auswahl der Strategie mit dem Befehl checkout ist nützlich, wenn Sie unterschiedliche Lösungen für verschiedene Dateien wünschen.

39

git checkout --[ours/theirs] . wird tun, was Sie wollen, solange Sie an der Wurzel aller Konflikte sind. unsere/ihre-Dateien betreffen nur unverpackte Dateien, sodass Sie nicht unbedingt spezifische Konflikte zwischen grep/find/etc haben müssen.

28
Cory Petosky
git diff --name-only --diff-filter=U | xargs git checkout --theirs

Scheint den Job zu machen. Beachten Sie, dass Sie dazu im Root-Verzeichnis des Git-Repos cd gespeichert sein müssen.

12
Peter

Falls jemand anderes einfach alles von einem Zweig (zB Master) mit dem Inhalt eines anderen überschreiben möchte, gibt es einen einfacheren Weg:

git merge master --strategy=ours

Dank an https://stackoverflow.com/a/1295232/560114

Oder andersherum, siehe Gibt es eine "ihre" Version von "git merge -s ours"?

0
Matt Browne
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

Ich habe diese Funktion in .zshrc file hinzugefügt.

Verwenden Sie sie wie folgt: gitcheckoutall theirs oder gitcheckoutall ours

0
iWheelBuy