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 bonne et que la mienne est mauvaise, donc toutes mes modifications doivent être abandonnées. Comment puis-je faire ceci?
git
version-control
git-merge
git-merge-conflict
Gwyn Morfey
la source
la source
[rejected] gh-pages -> gh-pages (non-fast-forward)
Réponses:
Étant donné que votre
pull
échec a étéHEAD
(pasHEAD^
) le dernier commit "valide" sur votre branche:L'autre élément que vous souhaitez est de laisser leurs modifications l'emporter sur vos modifications.
Les versions plus anciennes de git vous permettaient d'utiliser la stratégie de fusion "leur":
Mais cela a depuis été supprimé, comme expliqué dans ce message par Junio Hamano (le responsable de Git). Comme indiqué dans le lien , vous feriez plutôt ceci:
la source
git fetch origin
->git reset origin (soft reset, your changes are still present)
->git checkout file_to_use_their_version_of another_file (steamroll your own changes back to match the origin)
Je n'utilise plus git pull. Puisque dans un combat entre mon dernier code et l'origine, l'origine devrait toujours gagner, moi toujoursgit fetch
etgit rebase origin
. Cela rend en fait mes fusions et mes conflits rares.git log ..@{upstream}
ougit diff ..@{upstream}
). Après ça, comme vous, je vais rebaser mon travail.git merge -X theirs remote_branch
au lieu degit pull --strategy=theirs remote_branch
commetheirs
ressemble à une option derecursive
git merge --abort
est de loin préférable.Si votre version git est> = 1.6.1, vous pouvez utiliser
git reset --merge
.De plus, comme @Michael Johnson le mentionne, si votre version git est> = 1.7.4, vous pouvez également utiliser
git merge --abort
.Comme toujours, assurez-vous de n'avoir aucune modification non validée avant de démarrer une fusion.
Depuis la page de manuel de git merge
git merge --abort
est équivalent àgit reset --merge
quandMERGE_HEAD
est présent.MERGE_HEAD
est présent lorsqu'une fusion est en cours.En outre, concernant les modifications non validées lors du démarrage d'une fusion:
Si vous avez des modifications que vous ne souhaitez pas valider avant de commencer une fusion, juste
git stash
avant la fusion etgit stash pop
après avoir terminé ou abandonné la fusion.la source
<commit>
? #GitMoment: -ogit merge --abort
juste un synonyme degit reset --merge
? Le nom a certainement plus de sens, mais a-t-il la même fonctionnalité?http://www.git-scm.com/docs/git-merge
la source
C'est tellement simple.
Git lui-même vous montre la solution lorsque vous rencontrez ce type de problème et exécutez la commande git status.
J'espère que cela aidera les gens.
la source
Je pense que c'est
git reset
ce dont vous avez besoin.Attention, cela
git revert
signifie quelque chose de très différent de, disons,svn revert
- dans Subversion, le retour annulera vos modifications (non validées), en renvoyant le fichier à la version actuelle depuis le référentiel, tandis quegit revert
"annule" un commit.git reset
devrait faire l'équivalent desvn revert
, c'est-à-dire rejeter vos modifications indésirables.la source
Dans ce cas d'utilisation particulier, vous ne voulez pas vraiment abandonner la fusion, mais simplement 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 ne concerne que ce fichier.
Pour un fichier non fusionné dans un conflit, git met à disposition les versions de base commune, locale et distante du fichier dans l'index. (C'est là qu'ils sont lus pour être utilisés dans un outil de différenciation à 3 voies par
git mergetool
.) Vous pouvez les utilisergit show
pour les visualiser.La manière la plus simple de résoudre le conflit pour utiliser la version distante textuellement est:
Ou, avec git> = 1.6.1:
la source
git 1.6.1
commande a beaucoup de sens et est bonne. C'est exactement ce que j'aurais voulu. Je pense que la solution pré-1.6.1 est inélégante et nécessite des connaissances sur d'autres parties de git qui devraient être séparées du processus de résolution de fusion. Mais la nouvelle version est géniale!Pour le scénario comme je l'ai fait
git fetch
etgit pull
, puis se rendit compte que la branche amont n'a pas été branche principale, ce qui a donné lieu à des conflits indésirables.Cela est revenu en arrière sans réinitialiser mes modifications locales.
la source
Les commentaires suggèrent qu'il
git reset --merge
s'agit d'un alias pourgit merge --abort
. Il convient de noter que celagit merge --abort
n'est équivalent qu'àgit reset --merge
étant donné que aMERGE_HEAD
est présent. Cela peut être lu dans la commande git help for merge.Après une fusion qui a échoué, quand il n'y en a pas
MERGE_HEAD
, la fusion qui a échoué peut être annulée avecgit reset --merge
, mais pas nécessairement avecgit merge --abort
. Ce ne sont pas seulement d'anciennes et de nouvelles syntaxes pour la même chose .Personnellement, je trouve
git reset --merge
beaucoup plus puissant pour des scénarios similaires à celui décrit, et les fusions échouées en général.la source
git stash apply
provoqué un conflit de fusion pour moi maisgit merge --abort
n'a pas aidé pendantgit reset --merge
ce temps.Si vous vous retrouvez avec un conflit de fusion et que vous n'avez rien à valider, mais une erreur de fusion s'affiche toujours. Après avoir appliqué toutes les commandes mentionnées ci-dessous,
S'il vous plaît retirer
Fichier [couper coller à un autre emplacement en cas de récupération], puis entrez l'une des commandes ci-dessous selon la version que vous souhaitez.
J'espère que cela pourra aider!!!
la source
Une alternative, qui préserve l'état de la copie de travail, est:
Je déconseille généralement cela, car cela revient à fusionner dans Subversion car il supprime les relations de branche dans le commit suivant.
la source
Depuis Git 1.6.1.3
git checkout
a été en mesure de passer à la caisse de chaque côté d'une fusion:la source
J'ai trouvé que ce qui suit fonctionnait pour moi (rétablir un seul fichier à l'état de pré-fusion):
la source
Sourcetree
Parce que vous ne validez pas votre fusion, il vous suffit de double-cliquer sur une autre branche (ce qui signifie la vérifier) et lorsque sourcetree vous demande de rejeter toutes les modifications, alors acceptez :)
la source