Git résout les conflits en utilisant --ours / - le leur pour tous les fichiers


113

Existe-t-il un moyen de résoudre les conflits pour tous les fichiers en utilisant l'extraction --ourset --theirs? Je sais que vous pouvez le faire pour des fichiers individuels mais que vous n'avez pas trouvé de moyen de le faire pour tous.


7
Ça git checkout --ours -- .marche? Le .signifie le répertoire courant, lorsqu'il est appliqué à partir de la racine du répertoire de travail, donc cela signifie essentiellement tout le répertoire de travail. Je ne sais pas si cela fonctionnera avec le --oursdrapeau, et je ne sais pas comment il gérera les conflits de fichiers supprimés ou renommés.

@Cupcake Je l'ai utilisé avec succès. Peut-être que cela devrait être une réponse?
Pedro Gimeno

Réponses:


90

Il suffit de grep dans le répertoire de travail et d'envoyer la sortie via la commande xargs:

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

ou

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

Comment cela fonctionne: greprecherchera dans tous les fichiers du répertoire courant (le .) et des sous-répertoires de manière récursive (le-r drapeau) à la recherche de marqueurs de conflit (la chaîne '<<<<<<<')

l' indicateur -lou --files-with-matchesoblige grep à afficher uniquement le nom de fichier où la chaîne a été trouvée. L'analyse s'arrête après la première correspondance, de sorte que chaque fichier correspondant n'est sorti qu'une seule fois.

Les noms de fichiers correspondants sont ensuite redirigés vers xargs , un utilitaire qui divise le flux d'entrée canalisé en arguments individuels pour git checkout --oursou--theirs

Plus sur ce lien .

Comme il serait très gênant de devoir taper ceci à chaque fois sur la ligne de commande, si vous vous retrouvez à l'utiliser beaucoup, ce n'est peut-être pas une mauvaise idée de créer un alias pour le shell de votre choix: Bash est celui habituel .

Cette méthode devrait fonctionner avec au moins les versions 2.4.x de Git


14
Au lieu de grepping, je pense qu'il est également possible de l'utiliser git diff --name-only --diff-filter=U.
Thai

10
Aussi git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]. Plus rapide que grepping si vous avez un gros projet.
joshbodily

1
@joshbodily Nice. Je n'ai pas de projets si énormes que je remarquerais une différence, mais je peux voir comment ce serait beaucoup plus rapide, surtout si peu de fichiers ont changé par rapport au nombre total dans le répertoire ---- ce qui devrait être le cas pour normal s'engage.
Dmitri

1
Notez que cela ne fonctionne pas pour les conflits de changement de nom / renommer, par exempleCONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
Borek Bernard

1
Une autre option: git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours].
Zitrax

52

Vous pouvez -Xoursou -Xtheirsavec git mergeaussi. Alors:

  1. abandonner la fusion en cours (par exemple avec git reset --hard HEAD)
  2. fusionner en utilisant la stratégie que vous préférez ( git merge -Xoursou git merge -Xtheirs)

AVERTISSEMENT: Bien sûr , vous pouvez choisir qu'une seule option, que ce soit -Xoursou -Xtheirs, ne pas utiliser autre stratégie que vous devez d'aller bien sûr fichier par fichier.

Je ne sais pas s'il existe un moyen pour checkout, mais je ne pense pas honnêtement que ce soit terriblement utile: la sélection de la stratégie avec la commande d'extraction est utile si vous voulez des solutions différentes pour différents fichiers, sinon optez simplement pour l'approche de la stratégie de fusion.


Merci, je ne savais pas qu'ils avaient «- notre» et «- leur» à fusionner. Il semble que pour la fusion, ils ne font pas partie de la stratégie «-s» mais font partie des options récursives «-X». La version '-s' de la nôtre remplace en fait tous les fichiers sans fusion et le leur n'existe pas.
exe163

Il n'y a pas --theirsou --ours-Option pour git v1.9.4. Une approche serait git merge -s recursive -Xtheirs BRANCH.
fbmd

--theirset --oursne sont pas disponibles non plus avec git 2.2.0. Soit ma réponse n'était pas précise, soit ils étaient disponibles dans une version plus ancienne de git (cette réponse est assez ancienne à l'époque informatique). La bonne approche est avec -X. Je mets à jour en conséquence
ThanksForAllTheFish

À partir de la version 2.4.0, --ours et --theirs sont toujours très disponibles git-scm.com/docs/git-checkout
Dmitri

J'ai essayé cela et j'ai obtenu "échec de la fusion automatique, résolution des conflits". Cette commande ne fonctionne clairement pas comme prévu, et je recommande de l'éviter - trop boguée.
Adam

37

git checkout --[ours/theirs] .fera ce que vous voulez, tant que vous êtes à l'origine de tous les conflits. le nôtre / le leur n'affecte que les fichiers non fusionnés donc vous ne devriez pas avoir à grep / find / etc conflits spécifiquement.


5
Pour moi, cela ne semble pas se répéter dans les sous-répertoires.
Daniel Baughman

5
Je reçois error: path 'foo/bar/blah' does not have our version.
Robin Green

J'utilise la version 2.16.2.windows.1 de git et cela fonctionne parfaitement pour moi. Merci!
Pankwood

30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

Semble faire le travail. Notez que vous devez être connecté au répertoire racine du dépôt git pour y parvenir.


3
Je pense que c'est une meilleure réponse que la réponse la plus votée car (1) elle s'applique à tous les fichiers, pas seulement au répertoire de travail; et (2) il n'y aura aucune fragilité autour de la recherche de marqueurs de conflit. La commande 'git diff' liste ici tous les chemins non fusionnés, ce qui est exactement ce que nous voulons vérifier.
bchurchill

Agréable! J'ai toujours été préoccupé par la fiabilité des marqueurs de conflit grep
00-BBB


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

J'ai ajouté cette fonction dans le fichier .zshrc .

Utilisez-les de cette façon: gitcheckoutall theirsougitcheckoutall ours

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.