前言:继上篇文章《git使用进阶(一)》,本文继续梳理git在使用过程中经常出现的一些问题的解决方案。
目录
Q1:There is no tracking information for the current branch
Q2:fatal:refusing to merge unrelated histories
当第一次提交代码到remote时,如果只用了git push或git pull可能就是提示这个错误,因为本地没有可追溯的remote主机或分支,需要提交者明确远程主机或分支。
将git push或者git pull后面加上提交的远程主机名及分支:如git push origin master:master,将本地的master分支提交到远程的master分支。
使用git pull提交代码时无法关联到历史版本,网上看到他人的解决方案,问题原因是本地仓库虽然与远程仓库建立了连接,但他们仍然是两个独立的仓库。而出现这种问题的原因之一是本地仓库之前已经同一个远程仓库建立了连接,然后取消了该链接,又重新与新的远程仓库建立了连接,然后再git pull时就会出现这个问题(当然这不是唯一的原因)。
在git pull后加"--allow-unrelated-histories"后,很有可能出现冲突现象,这与SVN的冲突其实原因是一样的。
git pull命令用于从另一个存储库或本地分支获取并集成(整合)。git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。
详细说明:将远程存储库中的更改合并到当前分支中。在默认模式下,git pull是git fetch后跟git merge FETCH_HEAD的缩写。
更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。使用--rebase,它运行git rebase而不是git merge。
完整的命令:
git pull <远程主机名> <远程分支名>:<本地分支名>
注:此处的远程分支与本地分支的顺序不能写反,这与git push是相反的,在《git使用进阶(一)》中有清楚的说明。
比如,要取回origin主机的next分支,与本地的master分支合并,需要写成下面这样
git pull origin next:master
如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。上面命令可以简写为:
git pull origin next
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再执行git merge
- git fetch origin
- git merge origin/next
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。
Git也允许手动建立追踪关系。
git branch --set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
git pull origin
上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略。
git pull
上面命令表示,当前分支自动与唯一一个追踪分支进行合并。
如果合并需要采用rebase模式,可以使用–rebase选项。
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
remote与本地建立连接保险方式是在remote端先建立仓库,再使用
git clone [repository url]
在本地建立连接,此方式会在本地建立一个与remote仓库相同名称的文件夹,注意本地与remote仓库目录级别是否一致。
git clone [repository url]结束后需关闭git bash终端,然后打开刚刚clone到的仓库,在仓库名称下再打开git bash终端,使用命名git branch -r即可查看到remote端的所有分支了,此时已成功建立连接,可以push和pull了,而且针对remote端与本地的相同分支已建立好了trace,并且这种方式不会出现像“refusing to merge unrelated histories”的错误。与 《git使用进阶(一)》中的建立连接方式相比,此种方式更加稳妥。
参考文献:《git pull命令 -Git教程》