Existe-t-il un moyen de résoudre les conflits pour tous les fichiers en utilisant l'extraction --ours
et --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.
113
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--ours
drapeau, et je ne sais pas comment il gérera les conflits de fichiers supprimés ou renommés.Réponses:
Il suffit de grep dans le répertoire de travail et d'envoyer la sortie via la commande xargs:
ou
Comment cela fonctionne:
grep
recherchera 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
-l
ou--files-with-matches
oblige 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 --ours
ou--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
la source
git diff --name-only --diff-filter=U
.git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]
. Plus rapide que grepping si vous avez un gros projet.CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
.Vous pouvez
-Xours
ou-Xtheirs
avecgit merge
aussi. Alors:git reset --hard HEAD
)git merge -Xours
ougit merge -Xtheirs
)AVERTISSEMENT: Bien sûr , vous pouvez choisir qu'une seule option, que ce soit
-Xours
ou-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.la source
--theirs
ou--ours
-Option pour git v1.9.4. Une approche seraitgit merge -s recursive -Xtheirs BRANCH
.--theirs
et--ours
ne sont pas disponibles non plus avec git2.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équencegit 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.la source
error: path 'foo/bar/blah' does not have our version
.Semble faire le travail. Notez que vous devez être connecté au répertoire racine du dépôt git pour y parvenir.
la source
Au cas où quelqu'un d'autre cherche simplement à écraser tout ce qui se trouve dans une branche (par exemple master) par le contenu d'une autre, il existe un moyen plus simple:
Merci à https://stackoverflow.com/a/1295232/560114
Ou pour l'inverse, voir Y a - t-il une version "leur" de "git merge -s nôtre"?
la source
J'ai ajouté cette fonction dans le fichier .zshrc .
Utilisez-les de cette façon:
gitcheckoutall theirs
ougitcheckoutall ours
la source