剧情:
就在刚刚,我新建了一个项目编写完代码,然后提交到GitHub仓库,一切正常。
然后,我突然记起来,我有个地方需要做一个小的修改,于是我修改了代码之后使用了git commit --amend
命令,对本地仓库的commit做了修改,没有生成新的commit。然后,我git status查看仓库状态,发现远程仓库有一个commit需要pull同步,于是,我自信的进行远程同步:git pull origin master
,悲剧发生了,git报错,合并失败:fatal: refusing to merge unrelated histories
开始我感觉应该是自动合并的问题,于是我进行手动合并:
git fetch origin
git merge remotes/origin/master
然后,悲剧持续,git报错,合并失败:fatal: refusing to merge unrelated histories
解决:
后通过查阅资料,大神指出用--allow-unrelated-histories
选项,可以合并两个不同的仓库。可以直接自动合并:git pull origin master --allow-unrelated-histories
,也可手动fetch 之后,使用merge --allow-unrelated-histories
。我已经手动fetch过了,于是我手动git merge --allow-unrelated-histories remotes/origin/master
,合并终于可以进行了,然后解决了conflicts,提交新的合并的commit,然后git push origin master
。问题平息了。
思考:
我唯一不解的是为什么我的远程仓库会被git判定有unrelated histories。
于是,我git log --graph
查看了下commit图,如下:
问题似乎很明显了。本地仓库的初次提交(first commit!)在
git commit --amend
之后hash变化了!这就导致了,git判定远程仓库和本地存在不相关的记录(unrelated histories)。原因简单,出现问题的情况也比较特殊,但是,从这个问题让我对git commit --amend
命令有了新的认识,它虽然不会生成新的commit,但是,hash会改变,这可能带来一些奇怪的问题,就比如我遇到的,如果是修改首次提交,就会判定远程仓库和本地存在不相关的记录,而无法正常的同步。
网友评论