19.4 PUSH和PULL操作与远程版本库
Git分支一章已经介绍过对于新建立的本地分支(没有建立和远程分支的追踪),执行git push命令是不会被推送到远程版本库中的,这样的设置是非常安全的,避免了因为误操作将本地分支创建到远程版本库中。当不带任何参数执行git push命令时,实际的执行过程是:
如果为当前分支设置了<remote>,即由配置branch.<branchname>.remote给出了远程版本库代号,则不带参数执行git push相当于执行了git push<remote>。
如果没有为当前分支设置<remote>,则不带参数执行git push相当于执行了git push origin。
要推送的远程版本库的URL地址由remote.<remote>.pushurl给出。如果没有配置,则使用remote.<remote>.url配置的URL地址。
如果为注册的远程版本库设置了push参数,即通过remote.<remote>.push配置了一个引用表达式,则使用该引用表达式执行推送。
否则使用“:”作为引用表达式。该表达式的含义是同名分支推送,即对所有在远程版本库中有同名分支的本地分支执行推送。
这也就是为什么在一个本地新建分支中执行git push推送操作不会推送也不会报错的原因,因为远程不存在同名分支,所以根本就没有对该分支执行推送。而如果本地其他分支在远程版本库有同名分支且本地包含更新的话,会对这些分支进行推送。
在Git分支一章中就已经知道,如果需要在远程版本库中创建分支,则执行命令:git push<remote><new_branch>。即通过将本地分支推送到远程版本库的方式在远程版本库中创建分支。但是在接下来的使用中会遇到麻烦:不能执行git pull操作(不带参数)将远程版本库中其他人推送的提交获取到本地。这是因为没有建立本地分支和远程分支的追踪,即没有设置branch.<branchname>.remote的值和branch.<branchname>.merge的值。
关于不带参数执行git pull命令的解释如下:
如果为当前分支设置了<remote>,即由配置branch.<branchname>.remote出了远程版本库代号,则不带参数执行git pull相当于执行了git pull<remote>。
如果没有为当前分支设置<remote>,则不带参数执行git pull相当于执行了git pull origin。
要获取的远程版本库的URL地址由remote.<remote>.url给出。
如果为注册的远程版本库设置了fetch参数,即通过remote.<remote>.fetch配置了一个引用表达式,则使用该引用表达式执行获取操作。
接下来要确定合并的分支。如果设定了branch.<branchname>.merge,则对其设定的分支执行合并,否则报错退出。
在执行git pull操作的时候可以通过参数—rebase设置使用变基而非合并操作,将本地分支的改动变基到跟踪分支上。为了避免因为忘记使用—rebase参数导致分支的合并,可以执行如下命令进行设置。注意将<branchname>替换为对应的分支名称。
$git config branch.<branchname>.rebase true
有了这个设置之后,如果是在<branchname>工作分支中执行git pull命令,在遇到本地分支和远程分支出现偏离的情况时,会采用变基操作,而不是默认的合并操作。
如果为本地版本库设置参数branch.autosetuprebase,值为true,则在基于远程分支建立本地追踪分支时,会自动配置branch.<branchname>.rebase参数,在执行git pull命令时使用变基操作取代默认的合并操作。