Trying to pull files from my Github repository: "refusing to merge unrelated histories"

185,052

Solution 1

Try --allow-unrelated-histories

Like max630 commented, or as explained here Git refusing to merge unrelated histories

Solution 2

git checkout master
git merge origin/master --allow-unrelated-histories

Resolve conflict, then

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

Solution 3

While I'm all for unblocking people's work issues, I don't think "push --force" or "--allow_unrelated_histories" should be taught to new users as general solutions because they can cause real havoc to a repository when one uses them without understand why things aren't working in the first place.

When you have a situation like this where you started with a local repository, and want to make a remote on GitHub to share your work with, there is something to watch out for.

When you create the new online repository, there's an option "Initialize this repository with a README". If you read the fine print, it says "Skip this step if you’re importing an existing repository."

You may have checked that box. Or similarly, you made an add/commit online before you attempted an initial push. What happens is you create a unique commit history in each place and they can't be reconciled without the special allowance mentioned in Nevermore's answer (because git doesn't want you to operate that way). You can follow some of the advice mentioned here, or more simply just don't check that option next time you want to link some local files to a brand new remote; keeping the remote clean for that initial push.

Reference: my first experience with git + hub was to run into this same problem and do a lot of learning to understand what had happened and why.

Solution 4

On your branch - say master, pull and allow unrelated histories

git pull origin master --allow-unrelated-histories

Worked for me.

Solution 5

If there is not substantial history on one end (aka if it is just a single readme commit on the github end), I often find it easier to manually copy the readme to my local repo and do a git push -f to make my version the new root commit.

I find it is slightly less complicated, doesn't require remembering an obscure flag, and keeps the history a bit cleaner.

Share:
185,052

Related videos on Youtube

MichaelSB
Author by

MichaelSB

Computer Engineering student at UCSB

Updated on July 16, 2022

Comments

  • MichaelSB
    MichaelSB almost 2 years

    I'm learning git, and I'm following the Git community book.

    Previously (long time ago) I made a public repository on Github, with some files. Now I set up a local Git repository on my current computer, and committed some files. Then I added a remote pointing to my Github page:

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

    That seemed to be successful:

    [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)
    

    Now I want to download the files from my Github repo to my computer. I did this:

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

    However, I don't see any new files in my local directory. How can I get them?

    I also tried to do this:

    [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, locally I'm on master branch (there are no other branches):

    [root@osboxes c]# git status
    On branch master
    nothing to commit, working directory clean
    
    • Paul
      Paul almost 8 years
      When you set up your local repo, did you clone your Github repo or just did git init? In the latter case those repos are unrelated (have no common commits) and you can't merge them (pull is fetch+merge).
    • MichaelSB
      MichaelSB almost 8 years
      I did git init. So should I clone my Github repo to fix this?
    • Paul
      Paul almost 8 years
      You can clone your Github repo and continue work with it, but it'll still be separate repo. Do you want to merge two unrelated histories together?
    • MichaelSB
      MichaelSB almost 8 years
      I guess I want to merge histories, but really I just want to combine files both locally and on github. I mean I don't really care about history of the old files I have on Github.
    • Paul
      Paul almost 8 years
      If you really need local history (from fresh repo you created with git init) you may export it as a series of patches and then try to apply them to cloned repo. Otherwise just clone the repo, add missing files and commit them.
    • MichaelSB
      MichaelSB almost 8 years
      Great, that worked. However, now I want to update my Github repo with my local files. I did this: [root@osboxes c]# git push learnc fatal: The current branch master has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream learnc master What does it mean?
    • max630
      max630 almost 8 years
  • systemaddict
    systemaddict over 7 years
    as noted on the github release notes
  • nyov
    nyov almost 6 years
    Why is there no config option to alway set this? Every time I have to hunt down this option; I work with git since 2k8 and am totally annoyed by this baby-sitting. Stupid option wasn't always there. At least the refusal message should include the override to use.
  • Rahul Raj
    Rahul Raj almost 5 years
    Thanks for elaborating the above solution.
  • F1Linux
    F1Linux almost 5 years
    This command is the one you need agreeing to add a License or ReadMe when creating an origin repo in Github.
  • Luckylooke
    Luckylooke almost 4 years
    Actual version: git pull --rebase=merge --allow-unrelated-histories as --rebase=preserve is deprecated git-scm.com/docs/git-pull#Documentation/…