542 votes

Outil simple pour ' accepter leurs ' ou ' accepte moi ' sur l’intégralité d’un fichier à l’aide de git

Je ne veux pas d'une fusion visuelle de l'outil, et je ne veux pas avoir à vi le fichier en conflit et de choisir manuellement le entre la TÊTE (la mienne) et de l'importation de changement (pour eux). La plupart du temps, soit je souhaite à tous de leurs modifications ou tous les miens. C'est en général parce que mon changement amont immédiat et est venue vers moi à travers un pull, mais peut être légèrement modifié en divers endroits.

Est-il un outil de ligne de commande qui permettra de se débarrasser des marqueurs de conflit et de choisir tous d'une façon ou d'une autre basée sur mon choix? Ou un ensemble de commandes git qui je peux alias moi-même à faire de chacun.

# accept mine
alias am="some_sequence;of;commands"
alias at="some_other_sequence;of;commands"

Le faire, c'est plutôt gênant. Pour " accepter la mienne, j'ai essayé:

randy@sabotage ~/linus $ git merge test-branch
Auto-merging Makefile
CONFLICT (content): Merge conflict in Makefile
Automatic merge failed; fix conflicts and then commit the result.

randy@sabotage ~/linus $ git checkout Makefile 
error: path 'Makefile' is unmerged

andy@sabotage ~/linus $ git reset --hard HEAD Makefile 
fatal: Cannot do hard reset with paths.

Comment suis-je censé se débarrasser de ces marqueurs?

Je peux faire:

git reset HEAD Makefile; rm Makefile; git checkout Makefile

Mais cela semble plutôt rond, il doit y avoir une meilleure façon. Et à ce point, je ne suis pas sûr si git pense même de la fusion qui s'est passé, donc je ne pense pas que ce nécessairement de même des œuvres.

Va dans l'autre sens, de faire "accepter les leurs", est tout aussi bordélique. La seule façon dont je peux le comprendre, c'est de faire:

git show test-branch:Makefile > Makefile; git add Makefile;

Cela me donne aussi une foiré message de commit qui a des Conflits: Makefile en deux fois.

Quelqu'un peut s'il vous plaît signaler la façon de faire ces deux actions dans un moyen plus simple? Merci

764voto

Jakub Narębski Points 87537

La solution est très simple. git checkout <filename> tente d'extraire le fichier à partir de l'index, et donc pas de fusion.

Ce que vous devez faire est (c'est à dire la caisse un commit):

À la caisse de votre propre version , vous pouvez utiliser l'un de:

git checkout HEAD -- <filename>

git checkout --ours -- <filename>

git show :2:<filename> > <filename> # (stage 2 is ours)

À la caisse de l'autre version , vous pouvez utiliser l'un de:

git checkout test-branch -- <filename>

git checkout --theirs -- <filename>

git show :3:<filename> > <filename> # (stage 3 is theirs)

Vous aussi, vous avez besoin pour exécuter 'ajouter' pour le marquer comme résolu:

git add <filename>

57voto

kynan Points 2334

Basé sur la réponse de Jakub, vous pouvez configurer les alias suivants de git pour plus de commodité :

Éventuellement, ils prennent un ou plusieurs chemins d’accès des dossiers à résoudre et de résoudre tout sous le répertoire en cours, si aucun ne reçoivent comme valeur par défaut.

Ajoutez-les à la section de votre ou exécuter

19voto

Dar Points 81

Basé sur la réponse de kynan, Voici les mêmes alias, modifiés de sorte qu’ils peuvent manipuler des espaces et des tirets initiaux dans les noms de fichiers :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X