Git refuse de fusionner des histoires non liées sur rebase


2153

Pendant git rebase origin/developmentle message d'erreur suivant est affiché depuis Git:

fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

Ma version Git est 2.9.0. Il fonctionnait bien dans la version précédente.

Comment puis-je continuer ce rebase en autorisant les historiques sans rapport avec le drapeau forcé introduit dans la nouvelle version?


12
@Shishya Avec tout le respect que je vous dois, la réponse la plus votée ne résout pas cette question de manière directe. La question demande une git-rebasesituation tandis que la réponse donne un drapeau pourgit-merge
Shubham Chaudhary

13
@AsifMohammed ce n'est pas à cela que sert une réponse acceptée . Les gens trouveront automatiquement la réponse avec le plus de votes en raison du tri par défaut par votes.
Glorfindel

2
Au cas où quelqu'un d'autre aurait fait la même erreur, j'ai eu cette erreur après avoir utilisé accidentellement git pull [repo URL]au lieu degit clone [repo URL]
rsoren


35
Un gâchis a été fait ici par le fait que le titre ne spécifie pas que c'est dans le contexte d'une rebase, donc votre question attire des Googleurs qui obtiennent cette erreur dans différents contextes et votent une réponse qui ne correspond pas réellement appliquer à la question que vous avez posée. Il ne peut pas être facilement nettoyé maintenant, de sorte que la paire de questions et réponses incohérentes restera sur le site et sera toujours dans les résultats de recherche Google. La morale de l'histoire est que les titres des questions comptent!
Mark Amery

Réponses:


2620

Le comportement par défaut a changé depuis Git 2.9:

"git merge" utilisé pour permettre la fusion de deux branches qui n'ont pas de base commune par défaut, ce qui a conduit à la création d'un tout nouvel historique d'un projet existant, puis a été tiré par un responsable sans méfiance, ce qui a permis la fusion d'un historique parallèle inutile dans le projet existant . La commande a appris à ne pas autoriser cela par défaut , avec une --allow-unrelated-historiesoption de hachure d'échappement à utiliser dans un événement rare qui fusionne les historiques de deux projets qui ont commencé leur vie indépendamment.

Voir le journal des modifications de Git pour plus d'informations.

Vous pouvez utiliser --allow-unrelated-historiespour forcer la fusion à se produire.


18
Connaître le changement de fusion mais cette option ne fonctionnera pas avec rebase
Shubham Chaudhary

3
Y a-t-il une option qui s'activera en --allow-unrelated-historiespermanence?
jmarceli

4
@jmarceli "Parce qu'une telle" fusion de deux projets "est un événement rare, aucune option de configuration permettant toujours une telle fusion n'est ajoutée.". Donc non.
blue112

2
J'ai essayé de fusionner une branche pour un référentiel différent de cette façon, mais cela a créé un nouveau commit sur ma branche actuelle et n'a pas conservé l'historique de l'autre référentiel. Ensuite, j'ai vérifié une branche locale de l'autre référentiel, puis je l'ai fusionnée et tout à coup, un commit de fusion normal est apparu. Bizarre.
mgol

13
Excellent, fonctionne git pullaussi avec . Était dans cet "événement rare qui fusionne les histoires de deux projets qui ont commencé leur vie indépendamment". git --work-tree="." pull --allow-unrelated-histories
Petru Zaharia,

1192

Dans mon cas, l'erreur était juste fatal: refusing to merge unrelated histories à chaque essai, en particulier la première demande d'extraction après avoir ajouté à distance un référentiel Git.

L'utilisation du --allow-unrelated-historiesdrapeau a fonctionné avec une demande de tirage de cette manière:

git pull origin branchname --allow-unrelated-histories

232
Je vois toujours cette erreur si lorsque je crée un nouveau référentiel Github avec un fichier README.md, puis le tire vers un référentiel local à la première fois. Si ennuyant.
Tien Do

29
Pour les nouveaux repos, premiers pulls, il est généralement préférable de commencer par a git clone.
Umbrella


2
Cela m'a arrêté pendant plusieurs heures, avant de réaliser qu'il devait y avoir une résolution évidente pour la fusion de fichiers comme celui-ci si cela se produit pour les fichiers par défaut - je suis heureux de ne pas être le seul à avoir au moins ce problème!
Zibbobz

3
Dans mon cas, cela s'est produit parce que j'ai ajouté un fichier de licence sur github. La commande mentionnée ci-dessus (et ci-dessous, ce sont les mêmes) a fonctionné.
uudaddy

582

Essayez la commande suivante:

git pull origin master --allow-unrelated-histories

Cela devrait résoudre votre problème.


266

J'ai eu cette erreur lorsque j'ai d'abord configuré un référentiel local. Ensuite, je suis allé sur GitHub et j'ai créé un nouveau référentiel. Puis j'ai couru

git remote add origin <repository url>

Quand j'ai essayé de pousser ou de tirer, j'ai toujours eu la même fatal: unrelated_historieserreur.

Voici comment je l'ai corrigé:

git pull origin master --allow-unrelated-histories
git merge origin origin/master
... add and commit here...
git push origin master

Je pense que nous étions dans le même bateau. Pour ajouter quelque chose: Mon problème était qu'il y avait déjà quelque chose sur le référentiel distant. Donc, dans mon dossier, il a supprimé le .gitdossier, a couru git initet a fait ce qu'Adithya a dit, à l'exception de la partie de fusion.
codepleb

1
Comment appuyer sur le bouton INSERT sur mac? En fait, je dois taper le message de validation et fusionner à partir de la ligne de commande, mais je ne sais pas comment le faire à partir de la ligne de commande.
Shajeel Afzal

Ouvre-t-il vim? Si c'est le cas, c'est juste SHIFT +:
Adithya Bhat

Même moi, j'avais créé le dépôt GitHub en premier et je passais par ces commandes d'ajout du dépôt.
M. Suryaa Jha

1
C'est une très bonne réponse. Le fait est que vous devez forcer l'extraction puis fusionner le référentiel local et distant.
alanwsx


136
git pull origin <branch> --allow-unrelated-histories

Vous serez dirigé vers une fenêtre d'édition de Vim:

  • Insérer un message de validation
  • Appuyez ensuite sur Esc(pour quitter le mode "Insertion"), puis sur :(deux-points), puis sur x(petit "x") et enfin appuyez Entersur pour sortir de Vim
  • git push --set-upstream origin <branch>

5
Ctrl + X ne vous fera pas sortir de Vim
Ruben

mais :x<Enter>sera
webKnjaZ

Merci d'avoir précisé comment sortir; J'étais complètement perdu et toutes les autres réponses semblent supposer que c'est évident!
Still_learning

101

J'ai eu le même problème. Essaye ça:

git pull origin master --allow-unrelated-histories 

git push origin master

47

Essayer git pull --rebase development


Cela a résolu mon problème. Voici comment le problème a commencé
Harlan Nelson

1
Cela devrait probablement être:git pull --rebase=preserve --allow-unrelated-histories development
Riccardo Murri

3
@RiccardoMurri Ayant juste essayé ça, je ne referais pas ça. Mon nouveau référentiel contenait quelques exemples de fichiers d'initialisation et mes mois de référentiel local valaient des commits. L'exécution de ceci (avec newOrigin branchplutôt que development) a ajouté la validation initiale au sommet de ma branche locale, supprimant ainsi pratiquement tout de celle-ci. Je voulais que le commit initial de la nouvelle télécommande soit en bas.
redOctober13

42

Pour Android Studio et IntelliJ:

Commencez par vous engager tout et résolvez les conflits.

Ouvrez ensuite le terminal par le bas d'IDE et entrez:

git pull origin master --allow-unrelated-histories

Vous pouvez maintenant pousser.


38

AVERTISSEMENT, CELA ÉCRASERA POTENTIELLEMENT LE DÉPOSITAIRE À DISTANCE

Cela a fonctionné pour moi:

git push origin master --force

1
Mais que se passe-t-il réellement avec les fichiers locaux et distants?
Prathamesh More

Selon ce que je sais et expérimenté, les fichiers locaux sont intacts. Les fichiers distants que vous souhaitez ajouter dans un dossier spécifique sont ajoutés.
Aniket Patil

5
Ne fais pas ça! Cela écrase tous les fichiers distants .
Finomnis

Il suffit d'inclure une clause de non-responsabilité selon laquelle cette commande remplace tous les fichiers de la branche principale . Ça a bien marché pour moi. Merci.
Flavio

1
Cela fonctionne mais est plutôt dur, les histoires --allow-unrelad - sont plus spécifiques et appropriées
bdulac

32

Étant donné que toutes les autres réponses ne répondent pas réellement à la question, voici une solution inspirée de cette réponse sur une question connexe.

Vous obtenez donc votre erreur en faisant git rebase:

$ git rebase origin/development
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

Cette erreur n'annule pas réellement le rebase, mais vous êtes maintenant au milieu:

$ git status
interactive rebase in progress; onto 4321beefdead
Last command done (1 command done):
   pick 1234deadbeef1234deadbeef test merge commit

Vous pouvez donc maintenant faire la fusion à la main. Découvrez les validations parentes du commit de fusion d'origine:

$ git log -1 1234deadbeef1234deadbeef
commit 1234deadbeef1234deadbeef
Merge: 111111111 222222222
Author: Hans Dampf
Date:   Wed Jun 6 18:04:35 2018 +0200

    test merge commit

Découvrez lequel des deux parents de fusion est celui qui a été fusionné dans celui actuel (probablement le second, vérifiez avec git log 222222222), puis effectuez la fusion à la main, en copiant le message de validation du commit de fusion d'origine:

$ git merge --allow-unrelated 222222222 --no-commit
Automatic merge went well; stopped before committing as requested
$ git commit -C 1234deadbeef1234deadbeef
[detached HEAD 909af09ec] test merge commit
 Date: Wed Jun 6 18:04:35 2018 +0200
$ git rebase --continue
Successfully rebased and updated refs/heads/test-branch.

28

J'ai eu le même problème. Le problème est que la télécommande avait quelque chose qui l'empêchait.

J'ai d'abord créé un référentiel local. J'ai ajouté un LICENSEet README.mddossier à mon local et engagé.

Ensuite, je voulais un référentiel distant alors j'en ai créé un sur GitHub. Ici, j'ai fait une erreur en cochant "Initialiser ce référentiel avec un fichier README" , ce qui a également créé un fichier README.md à distance.

Alors maintenant, quand j'ai couru

git push --set-upstream origin master

J'ai eu:

error: failed to push some refs to 'https://github.com/lokeshub/myTODs.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes
(e.g. hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Maintenant, pour surmonter cela, je l'ai fait

git pull origin master

Ce qui a entraîné l'erreur ci-dessous:

From https://github.com/lokeshub/myTODs
branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories**

J'ai essayé:

git pull origin master --allow-unrelated-histories

Résultat:

From https://github.com/lokeshub/myTODs
 * branch            master     -> FETCH_HEAD
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed;
fix conflicts and then commit the result.

Solution:

J'ai supprimé le référentiel distant et créé un nouveau (je pense que seule la suppression du fichier READMEaurait pu fonctionner) et après cela, le ci-dessous a fonctionné:

git remote rm origin
git remote add origin https://github.com/lokeshub/myTODOs.git
git push --set-upstream origin master

25
la création d'un nouveau référentiel n'est pas une solution
Zach

3
git pull origin master --allow-unrelated-histories a fonctionné pour moi .. Merci
SKalariya

git push --force ... serait une solution appropriée à l'étape 1 dans ce cas particulier
Konstantin Pelepelin

2
Ce n'est pas une solution. Si vous êtes débutant, vous pouvez le faire, mais si vous travaillez avec de vrais projets, vous devriez avoir à traiter correctement.
Prathamesh More

27

Cela se produit généralement lorsque vous vous engagez pour la première fois dans un référentiel distant. Comme l'erreur indique clairement "refus de fusionner des histoires non liées", nous devons utiliser l'indicateur --allow-unrelated-histories.

git pull origin master  --allow-unrelated-histories

Il y aurait maintenant des conflits que nous devons résoudre manuellement. Après cela, validez simplement le code et poussez-le.


Comme mentionné dans la question, j'essaie de faire un git-rebase et non un git-pull, git-rebase n'a pas le --allow-unrelated-historiesdrapeau.
Shubham Chaudhary

25

Deux possibilités lorsque cela peut se produire -

  1. Vous avez cloné un projet et, d'une manière ou d'une autre, le répertoire .git a été supprimé ou corrompu. Cela amène Git à ignorer votre historique local et, par conséquent, le fera lever cette erreur lorsque vous essayez de pousser ou de tirer du référentiel distant.

  2. Vous avez créé un nouveau référentiel, y avez ajouté quelques validations, et maintenant vous essayez de tirer à partir d'un référentiel distant qui a déjà ses propres validations. Git lancera également l'erreur dans ce cas, car il n'a aucune idée de la façon dont les deux projets sont liés.

SOLUTION

git pull origin master --allow-unrelated-histories

Réf - https://www.educative.io/edpresso/the-fatal-refusing-to-merge-unrelated-histories-git-error


12

J'ai également eu du mal avec cela, mais j'ai réussi à trouver une solution.

Lorsque vous rencontrez l'erreur ci-dessus, choisissez simplement le commit de fusion et continuez la rebase:

git cherry-pick -m 1 1234deadbeef1234deadbeef
git rebase --continue

3
En avion anglais s'il vous plait?
Agent Zebra

@AgentZebra Pour tout disque dans le plan complexe, l'intégrale d'un chemin fermé continu est 0.
Addem

12

Commencez par extraire les modifications à distance de votre section locale à l'aide de la commande suivante:

git pull origin branchname --allow-unrelated-histories

** le nom de la branche est maître dans mon cas.

Lorsque la commande Pull est terminée, un conflit se produit. Vous devez résoudre les conflits. J'utilise Android Studio pour résoudre des conflits. entrez la description de l'image ici

Lorsque les conflits sont résolus, la fusion est terminée!

Vous pouvez maintenant pousser en toute sécurité.


J'ai cherché le bouton Resolve Conflictdans AS. Parfois, le popup / ballon en bas à droite disparaît et je ne peux rien faire. Merci @oiyio
mochadwi


7

En faisant un git pull, j'ai reçu ce message fatal: refusing to merge unrelated histories pour un module de dépôt où je n'avais pas mis à jour la copie locale depuis un moment.

J'ai exécuté cette commande juste pour rafraîchir le local à partir de l'origine. Je voulais juste la dernière version de la télécommande et je n'avais pas besoin de changements locaux.

git reset --hard origin/master

Cela l'a corrigé dans mon cas.


12
AVERTISSEMENT: cela a supprimé TOUS mes fichiers. Soyez prudent si vous ne savez pas ce que vous faites!
Salvi Pascual

2
Cela supprimera toutes les modifications en attente!
Orestis P.


1

J'utilise le rebase depuis des années et je n'avais jamais rencontré un tel problème. Cependant, votre premier problème est que vous essayez de le faire directement sur la branche distante à developmentpartir du référentiel distant, appeléorigin . C'est littéralement faux parce que rebaser est une commande dangereuse, qui restructure l'historique git. Cela dit, vous devez d'abord essayer votre référentiel local et le pousser uniquement, si cela fonctionne pour vous comme prévu.

Ainsi, mon flux de travail de rebase habituel ressemble à ce qui suit (mais veuillez garder à l'esprit que vous ne devez pas utiliser rebase sur les branches, ce que vous n'êtes pas le seul comité. Pour ces branches, utilisez simplement fusionner et résoudre les conflits, le cas échéant):

  1. assurez-vous d'avoir un arbre de travail propre (pas de modifications non validées)
  2. extraire la branche sur laquelle vous souhaitez rebaser (par exemple, disons que c'est master; en tant que commande sur une ligne):git checkout master && git pull origin master && git checkout development
  3. Effectuez le rebasage réel: git rebase master
  4. Si c'est fait et que tout fonctionne comme prévu, poussez-le sur votre télécommande. Pour ce faire, vous devez le forcer, car l'hôte distant a déjà l'historique dans un autre ordre, la télécommande répondra sans rien pousser. Donc, nous devons dire "ma version locale de l'historique est correcte, écraser tout sur cette branche distante en utilisant ma version locale de l'historique":git push -f origin development

Comme je l'ai déjà mentionné, gardez à l'esprit que le rebase manipule l'histoire de Git, c'est généralement une mauvaise chose. Cependant, il est possible de le faire sur les succursales, où personne d'autre ne s'engage. Afin de garder la branche extractible pour les autres développeurs, utilisez une autre stratégie de fusion comme fusionner elle-même, squash ou cherrypick. Donc, en d'autres termes: Rebase ne devrait pas être votre outil de développement distribué. Cela fonctionne bien pour vous si vous êtes le seul à travailler sur ce référentiel.

Nous utilisons la stratégie de branche de fonctionnalité. En cela, j'utilise habituellement rebase afin d'obtenir les "mises à jour" des autres développeurs, ce qui s'est produit entre-temps sur la branche master. Ce faisant, il réduit la taille des validations visibles dans une demande d'extraction. Par conséquent, il est plus facile pour le réviseur de code de voir mes modifications apportées dans cette branche de fonctionnalité.


Dans ce cas, je voulais en fait continuer la rebase et la réponse ne répond pas à cela. Je connais les risques de rebasage et quand je devrais et ne devrais pas utiliser git-rebase. Il s'agit d'une directive générale (avec opinion) pour le flux de travail git et ne répond pas directement à la question. En ce qui concerne l'utilisation de rebase pendant des années, cette erreur particulière a été ajoutée dans la version 2.9.0 de git et le flux fonctionnait correctement avant cette version. Ce que vous avez publié dans cette réponse ici est déjà répondu dans des questions beaucoup plus anciennes comme stackoverflow.com/a/11566503/2670370 et git-scm.com/book/en/v2/Git-Branching-Rebasing
Shubham Chaudhary
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.