Calvino Shaw Calvino Shaw - 11 months ago 277
Git Question

"refusing to merge unrelated histories" failure while pulling to recovered repository

I come up with a problem about git push.
It worked successfully before, but failed this time.
In the beginning, I am in my master

MINGW64 /d/javasoft/apache-tomcat-7.0.70/webapps/MyNote (master)

, and then,

  • I use
    git remote add origin
    to relate my romote origin, but it alerts that
    fatal: remote origin already exists.

  • then, I use
    git remote rm origin
    (Someone told me to), it's ok.

  • then, I use
    git remote add origin***/***.git
    again. It's ok.

  • then, I use
    git push -u origin master
    ( I tried
    git push origin master
    , but I lost my local whole
    for some reason before, so I guess it may be the first time to push, and I should add
    ). BUT, it alerts
    error: failed to push some refs to '***/***.git'

  • then, someone told me that I should use
    git pull origin master
    before I use
    , and I did as it. BUT, it alerted:
    fatal: refusing to merge unrelated histories

  • I found some answers in Git refusing to merge unrelated histories , but it seemed that it didn't work. In my issue, it alerted
    fatal: Couldn't find remote ref –allow-unrelated-histories

really don't know how to do...just want to push..

Answer Source

This cannot be answered shortly.

Warning: You should not use the –allow-unrelated-histories flag unless you know what is unrelated history and are sure you need it. The check was introduced just to prevent disasters when people merge unrelated projects by mistake.

As far as I understand, in your case has happened the following:

You have cloned a project at some point 1, and made some development to point 2. Meanwhile, project has evolved to some point 3.

enter image description here

Then you for some reason lost your local .git subdirectory - which contained all your history from 1 to 2. You managed to restore the current state though.

enter image description here

But now it does not have any history - it looks like the whole project has appeared out of nowhere. If you ask git to merge them it will not be able to say where is your changes, so it can add them to remote project, as far as I understand it will just report massive add/add conflicts.

What you should do now is to find back that commit 1 from the remote history where you have cloned the project (I assume you did not pull after that, if you did then you should instead look for the last commit you have pulled). Then you should modify your history so that is starts from that commit 1, then git will be able to merge correctly (with pull for example).

So, the steps (assuming you are now in your restored commit without history):

  • estimate where is the commit 1 you have cloned from as some 1?, based on commit time for example
  • run git diff _1?_..HEAD, and read carefully, make sure that the difference contains only edits which you have made. If it contains more then you should have picked a bit wrong 1? and need to adjust it and repeat this step
  • after you have found the commit 1, you should make it your parent, do git --reset --soft _1_, then git commit.

enter image description here

Now it looks like you have cloned from 1, then made one commit with all your changes. Your intermediate history is lost anyway with your older .git directory, but now you can run your git pull - it will merge correctly.