155 votes

J'essaie d'extraire des fichiers de mon dépôt Github : "refus de fusionner des historiques non liés"

J'apprends Git, et je suis le livre de la communauté Git.

Auparavant (il y a longtemps), j'ai créé un dépôt public sur Github, avec quelques fichiers. Maintenant, j'ai mis en place un dépôt Git local sur mon ordinateur actuel, et j'ai livré quelques fichiers. Ensuite, j'ai ajouté un pointage distant vers ma page Github :

[root@osboxes c]# git remote add learnc https://github.com/michaelklachko/Learning-C

Cela a semblé être un succès :

[root@osboxes c]# git remote show learnc
* remote learnc
  Fetch URL: https://github.com/michaelklachko/Learning-C
  Push  URL: https://github.com/michaelklachko/Learning-C
  HEAD branch: master
  Remote branch:
    master tracked
  Local ref configured for 'git push':
    master pushes to master (local out of date)

Je veux maintenant télécharger les fichiers de mon dépôt Github sur mon ordinateur. C'est ce que j'ai fait :

[root@osboxes c]# git fetch learnc
[root@osboxes c]# git merge learnc/master
warning: refname 'learnc/master' is ambiguous.
Already up-to-date.

Cependant, je ne vois pas de nouveaux fichiers dans mon répertoire local. Comment puis-je les obtenir ?

J'ai aussi essayé de le faire :

[root@osboxes c]# git pull learnc master
From https://github.com/michaelklachko/Learning-C
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories

BTW, localement je suis sur la branche master (il n'y a pas d'autres branches) :

[root@osboxes c]# git status
On branch master
nothing to commit, working directory clean

4 votes

Lorsque vous avez mis en place votre dépôt local, avez-vous cloné votre dépôt Github ou avez-vous simplement fait git init ? Dans ce dernier cas, ces dépôts ne sont pas liés (ils n'ont pas de commits communs) et vous ne pouvez pas les fusionner (pull est fetch+merge).

0 votes

J'ai fait git init. Dois-je donc cloner mon dépôt Github pour résoudre ce problème ?

1 votes

Vous pouvez cloner votre dépôt Github et continuer à travailler avec lui, mais il s'agira toujours d'un dépôt distinct. Vous voulez fusionner deux historiques sans rapport entre eux ?

321voto

Nevermore Points 3462

Essayez --allow-unrelated-histories

Comme max630 a commenté, ou comme expliqué ici Git refusant de fusionner des historiques sans rapport entre eux

1 votes

Comme indiqué sur le notes de publication github

0 votes

Pourquoi n'y a-t-il pas d'option de configuration pour régler toujours cela ? Je travaille avec git depuis 2k8 et je suis totalement ennuyé par ce baby-sitting. Cette option stupide n'a pas toujours été là. Au moins, le message de refus devrait inclure la dérogation à utiliser.

103voto

dovy Points 358
git checkout master
git merge origin/master --allow-unrelated-histories

Résoudre le conflit, puis

git add -A .
git commit -m "Upload"
git push

1 votes

Merci d'avoir élaboré la solution ci-dessus.

42voto

BigJMoney Points 299

Alors que je suis tout à fait d'accord pour débloquer les problèmes de travail des gens, je ne pense pas que "push --force" ou "--allow_unrelated_histories" devraient être enseignés aux nouveaux utilisateurs comme des solutions générales parce qu'ils peuvent causer de vrais ravages à un dépôt quand on les utilise sans comprendre pourquoi les choses ne fonctionnent pas en premier lieu.

Dans une situation comme celle-ci, lorsque vous avez commencé avec un dépôt local et que vous souhaitez créer un dépôt distant sur GitHub pour partager votre travail, il faut faire attention à quelque chose.

Lorsque vous créez le nouveau dépôt en ligne, il y a une option "Initialize this repository with a README". Si vous lisez les petits caractères, il est dit "Sauter cette étape si vous importez un référentiel existant".

Vous avez peut-être coché cette case. Ou, de la même manière, vous avez fait un ajout/commit en ligne avant de tenter un push initial. Ce qui se passe, c'est que vous créez un historique de commit unique à chaque endroit et ils ne peuvent pas être réconciliés sans l'autorisation spéciale mentionnée dans la réponse de Nevermore (parce que git ne veut pas que vous opériez de cette façon). Vous pouvez suivre certains des conseils mentionnés ici, ou plus simplement ne pas cocher cette option la prochaine fois que vous voudrez lier des fichiers locaux à un tout nouveau répertoire distant ; cela permet de garder le répertoire distant propre pour ce premier push.

Référence : ma première expérience avec git + hub a été de rencontrer ce même problème et de faire beaucoup d'apprentissage pour comprendre ce qui s'était passé et pourquoi.

13voto

Edgar256 Points 41

Sur votre branche - disons master, tirez et autorisez les histoires non liées.

git pull origin master --allow-unrelated-histories

Ça a marché pour moi.

1 votes

Cette commande est celle que vous devez accepter pour ajouter une Licence ou un ReadMe lors de la création d'un repo d'origine dans Github.

12voto

captncraig Points 4166

S'il n'y a pas d'historique substantiel d'un côté (c'est-à-dire s'il s'agit d'un simple commit readme du côté de github), je trouve souvent plus facile de copier manuellement le readme dans mon repo local et de faire un git push -f pour faire de ma version le nouveau commit Root.

Je trouve que c'est un peu moins compliqué, que cela ne nécessite pas de se souvenir d'un drapeau obscur et que l'histoire reste un peu plus propre.

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