J'ai couru dans un conflit de fusion. Comment puis-je annuler la fusion?

j'ai utilisé git pull et j'ai eu un conflit de fusion:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

je sais que l'autre version du fichier est bon et que le mien est mauvais, donc toutes mes modifications devraient être abandonnés. Comment puis-je faire cela?

1973
demandé sur Rann Lifshitz 2008-09-19 17:21:00
la source

10 ответов

puisque votre pull a été infructueux alors HEAD (pas HEAD^ ) est le dernier" valide "commit sur votre branche:

git reset --hard HEAD

l'autre pièce que vous voulez est de laisser leurs changements over-ride vos changements.

les anciennes versions de git vous ont permis d'utiliser la stratégie de fusion "la leur":

git pull --strategy=theirs remote_branch

mais cela a été supprimé depuis, comme expliqué dans ce message de Junio Hamano (Git responsable). Comme indiqué dans le lien , au lieu de cela vous feriez ceci:

git fetch origin
git reset --hard origin
1774
répondu Pat Notz 2017-06-28 22:46:31
la source

si votre version git est >= 1.6.1, vous pouvez utiliser git reset --merge .

aussi, comme @Michael Johnson le mentionne, si votre version git est >= 1.7.4, vous pouvez aussi utiliser git merge --abort .

comme toujours, assurez-vous d'avoir aucun changement non engagé avant de lancer une fusion.

De la git merge page de manuel de

git merge --abort est équivalent à git reset --merge lorsque MERGE_HEAD est présent.

MERGE_HEAD est présent lorsqu'une fusion est en cours.

également, concernant les changements non engagés lors du démarrage d'une fusion:

si vous avez des modifications que vous ne voulez pas commettre avant de lancer une fusion, juste git stash les avant la fusion et git stash pop après avoir terminé la fusion ou l'annulation.

1628
répondu Carl 2016-01-20 02:31:48
la source
git merge --abort

avorter le processus actuel de résolution des conflits, et essayer de reconstruire le pré-état de fusion.

S'il y avait des changements non engagés De worktree présents lors de la fusion git merge --abort sera dans certains cas incapable de reconstruire ces changements. Il est donc recommandé de toujours commettre ou ranger vos modifications avant de lancer git merge.

git merge --abort est équivalent à git reset --merge lorsque MERGE_HEAD est présent.

http://www.git-scm.com/docs/git-merge

391
répondu ignis 2015-07-16 18:05:58
la source

dans ce cas particulier d'utilisation, vous ne voulez pas vraiment annuler la fusion, il suffit de résoudre le conflit d'une manière particulière.

il n'est pas non plus nécessaire de réinitialiser et d'effectuer une fusion avec une stratégie différente. Les conflits ont été correctement mis en évidence par git et l'exigence d'accepter les modifications des autres côtés n'est que pour ce seul fichier.

pour un fichier non fusionné dans un conflit git rend disponible la base commune, locale et distance versions du fichier dans l'index. (C'est ici qu'ils sont lus pour une utilisation dans un outil 3-way diff par git mergetool .) Vous pouvez utiliser git show pour les voir.

# common base:
git show :1:_widget.html.erb

# 'ours'
git show :2:_widget.html.erb

# 'theirs'
git show :3:_widget.html.erb

la façon la plus simple de résoudre le conflit pour utiliser la version distante mot à mot est:

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

ou, avec git >= 1.6.1:

git checkout --theirs _widget.html.erb
73
répondu CB Bailey 2010-03-25 14:54:09
la source

je pense que c'est git reset dont vous avez besoin.

attention à ce que git revert signifie quelque chose de très différent de, disons, svn revert - dans Subversion, le revert rejettera vos changements (non engagés), retournant le fichier à la version actuelle à partir du dépôt, alors que git revert " annule " une propagation.

git reset devrait faire l'équivalent de svn revert , c'est-à-dire se débarrasser de vos changements indésirables.

72
répondu David Precious 2011-05-30 19:47:21
la source

puisque les commentaires suggèrent que git reset --merge est un alias pour git merge --abort , il est intéressant de noter que git merge --abort est seulement équivalent à git reset --merge étant donné qu'un MERGE_HEAD est présent. Cela peut être lu dans l'aide git pour la commande merge.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

après une fusion ratée, quand il n'y a pas de MERGE_HEAD , la fusion ratée peut être annulée avec git reset --merge mais pas nécessairement avec git merge --abort , de sorte qu'ils ne sont pas seulement ancienne et nouvelle syntaxe pour la même chose .

personnellement, je trouve git reset --merge beaucoup plus puissant pour les scénarios similaires à celui décrit, et les fusions ratées en général.

29
répondu Martin G 2015-04-02 15:16:45
la source

depuis Git 1.6.1.3 git checkout a été en mesure de vérifier de chaque côté d'une fusion:

git checkout --theirs _widget.html.erb
16
répondu Alain O'Dea 2014-07-23 21:45:31
la source

une alternative qui préserve l'état de la copie de travail est:

git stash
git merge --abort
git stash pop

je déconseille Généralement cela, parce que c'est effectivement comme fusionner dans Subversion car cela jette les relations de branches dans la propagation suivante.

14
répondu Alain O'Dea 2010-07-13 22:57:42
la source

et si vous vous retrouvez avec le conflit de fusion et n'a aucune chose à commettre, mais l'erreur de fusion est encore affichée après avoir appliqué toutes les commandes mentionnées ci-dessous,

git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin

s'il vous plaît supprimer

.git\index.serrure

fichier [couper la pâte à un autre endroit en cas de récupération] et puis entrer n'importe laquelle des commandes ci-dessous en fonction sur quelle version vous voulez.

git reset --hard HEAD
git reset --hard origin

Espère que ça aide!!!

12
répondu Nirav Mehta 2018-04-27 21:31:27
la source

j'ai trouvé que ce qui suit a fonctionné pour moi (revenir à un fichier unique à l'état pré-fusion):

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
1
répondu Malcolm Boekhoff 2017-10-31 03:56:24
la source