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.
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.
Sie können auch -Xours
oder -Xtheirs
mit git merge
. So:
git reset --hard HEAD
)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.
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.
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.
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"?
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