Essayer d'extraire des fichiers de mon référentiel Github: "Refuser de fusionner des historiques non liés"

151

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

Auparavant (il y a longtemps), j'ai créé un référentiel public sur Github, avec quelques fichiers. Maintenant, j'ai configuré un référentiel Git local sur mon ordinateur actuel et j'ai validé certains fichiers. Ensuite, j'ai ajouté une télécommande pointant vers ma page Github:

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

Cela semblait ê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 souhaite maintenant télécharger les fichiers de mon dépôt Github sur mon ordinateur. J'ai fait ça:

[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 aucun nouveau fichier dans mon répertoire local. Comment puis-je les obtenir?

J'ai également essayé de faire ceci:

[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 principale (il n'y a pas d'autres branches):

[root@osboxes c]# git status
On branch master
nothing to commit, working directory clean
MichaelSB
la source
4
Lorsque vous avez configuré votre dépôt local, avez-vous cloné votre dépôt Github ou l'avez-vous simplement fait git init? Dans ce dernier cas, ces dépôts ne sont pas liés (n'ont pas de commits communs) et vous ne pouvez pas les fusionner (pull is fetch + merge).
Paul
J'ai fait git init. Alors, dois-je cloner mon dépôt Github pour résoudre ce problème?
MichaelSB
1
Vous pouvez cloner votre dépôt Github et continuer à travailler avec lui, mais ce sera toujours un dépôt séparé. Voulez-vous fusionner deux histoires non liées ensemble?
Paul
Je suppose que je veux fusionner les historiques, mais vraiment je veux juste combiner des fichiers à la fois localement et sur github. Je veux dire que je ne me soucie pas vraiment de l'historique des anciens fichiers que j'ai sur Github.
MichaelSB

Réponses:

315

Essayer --allow-unrelated-histories

Comme max630 commenté, ou comme expliqué ici, Git refuse de fusionner des historiques non liés

Plus jamais
la source
1
comme indiqué sur les notes de version de github
systemaddict
Pourquoi n'y a-t-il pas d'option de configuration pour toujours définir cela? Chaque fois que je dois traquer cette option; Je travaille avec git depuis 2k8 et je suis totalement agacé par ce baby-sitting. L'option stupide n'était pas toujours là. Au moins, le message de refus doit inclure le remplacement à utiliser.
nyov
98
git checkout master
git merge origin/master --allow-unrelated-histories

Résolvez le conflit, puis

git add -A .
git commit -m "Upload"
git push
Do Nhu Vy
la source
1
Merci d'avoir élaboré la solution ci-dessus.
Rahul Raj
39

Bien que je sois tout à fait pour débloquer les problèmes de travail des gens, je ne pense pas que "push --force" ou "--allow_unrelated_histories" devrait être enseigné aux nouveaux utilisateurs comme des solutions générales car ils peuvent causer de véritables ravages dans un référentiel lorsque l'on les utilise sans comprendre pourquoi les choses ne fonctionnent pas en premier lieu.

Lorsque vous avez une situation comme celle-ci où vous avez commencé avec un référentiel local et que vous souhaitez créer une télécommande sur GitHub avec laquelle partager votre travail, il y a quelque chose à surveiller.

Lorsque vous créez le nouveau référentiel en ligne, il existe une option "Initialiser ce référentiel avec un README". Si vous lisez les petits caractères, il est dit "Ignorez 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 effectué un ajout / une validation en ligne avant de tenter une première diffusion. 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'allocation spéciale mentionnée dans la réponse de Nevermore (car git ne veut pas que vous fonctionniez 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 souhaitez lier des fichiers locaux à une toute nouvelle télécommande; garder la télécommande propre pour cette poussée initiale.

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

BigJMoney
la source
12

S'il n'y a pas d'historique substantiel à une extrémité (c'est-à-dire s'il ne s'agit que d'un seul commit readme à l'extrémité github), je trouve souvent plus facile de copier manuellement le readme dans mon dépôt local et git push -fde faire de ma version le nouveau commit root .

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

captncraig
la source
11

Sur votre branche - dites maître, tirez et autorisez des histoires sans rapport

git pull origin master --allow-unrelated-histories

A travaillé pour moi.

Edgar256
la source
1
Cette commande est celle dont vous avez besoin pour accepter d'ajouter une licence ou un fichier Lisez-moi lors de la création d'un dépôt d'origine dans Github.
F1Linux
4

Exécutez la commande suivante:

git pull origin master --allow-unrelated-histories

Un vim de fusion s'ouvrira. Ajoutez un message de fusion et:

  1. Appuyez sur ESC
  2. Appuyez sur Maj + ';'
  3. Appuyez sur «w», puis sur «q».

Et vous êtes prêt à partir.

KayV
la source
3

Quand je l'ai utilisé --allow-unrelated-histories, cette commande a généré trop de conflits. Il y avait des conflits dans des fichiers sur lesquels je n'ai même pas travaillé. Pour surmonter l'erreur " Refusing to merge unrelated histories", j'ai utilisé la commande rebase suivante:

git pull --rebase=preserve --allow-unrelated-histories

Après cela, validez les modifications non validées avec un message de validation. Enfin, exécutez la commande suivante:

git rebase --continue

Après cela, ma copie de travail était à jour avec la copie distante et j'ai pu pousser mes modifications comme avant. Plus d'erreur d'histoires sans rapport lors du tirage.

Tasnim Fabiha
la source
1
Version actuelle: git pull --rebase=merge --allow-unrelated-historiestelle qu'elle --rebase=preserveest obsolète git-scm.com/docs/git-pull#Documentation
...
0

Dans mon cas, je faisais face au même problème, en particulier la première demande d'extraction après avoir ajouté à distance un dépôt Git. L'erreur suivante faisait face.

fatal: refusing to merge unrelated histories on every try

Utilisez la commande --allow-unrelated-histories. Cela fonctionne parfaitement.

git pull origin branchname --allow-unrelated-histories
Jitendra Rathor
la source