前言
分析git remote add <shortname> <url>命令的作用。
一、使用gitee
使用GitHub时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况(原因你懂的)。
如果我们希望体验Git飞一般的速度,可以使用国内的Git托管服务——Gitee(gitee.com)。
和GitHub相比,Gitee也提供免费的Git仓库。此外,还集成了代码质量检测、项目演示等功能。对于团队协作开发,Gitee还提供了项目管理、代码托管、文档管理的服务,5人以下小团队免费。
Gitee的免费版本也提供私有库功能,只是有5人的成员上限。
使用Gitee和使用GitHub类似,我们在Gitee上注册账号并登录后,需要先上传自己的SSH公钥。选择右上角用户头像 -> 菜单“修改资料”,然后选择“SSH公钥”,填写一个便于识别的标题,然后把用户主目录下的.ssh/id_rsa.pub
文件的内容粘贴进去:
点击“确定”即可完成并看到刚才添加的Key:
如果我们已经有了一个本地的git仓库(例如,一个名为learngit的本地库),如何把它关联到Gitee的远程库上呢?
首先,我们在Gitee上创建一个新的项目,选择右上角用户头像 -> 菜单“控制面板”,然后点击“创建项目”:
项目名称最好与本地库保持一致:
然后,我们在本地库上使用命令git remote add
把它和Gitee的远程库关联:
git remote add origin git@gitee.com:liaoxuefeng/learngit.git
之后,就可以正常地用git push
和git pull
推送了!
如果在使用命令git remote add
时报错:
git remote add origin git@gitee.com:liaoxuefeng/learngit.git
fatal: remote origin already exists.
这说明本地库已经关联了一个名叫origin
的远程库,此时,可以先用git remote -v
查看远程库信息:
git remote -v origin git@github.com:michaelliao/learngit.git (fetch) origin git@github.com:michaelliao/learngit.git (push)
可以看到,本地库已经关联了origin
的远程库,并且,该远程库指向GitHub。
我们可以删除已有的GitHub远程库:
git remote rm origin
再关联Gitee的远程库(注意路径中需要填写正确的用户名):
git remote add origin git@gitee.com:liaoxuefeng/learngit.git
此时,我们再查看远程库信息:
git remote -v origin git@gitee.com:liaoxuefeng/learngit.git (fetch) origin git@gitee.com:liaoxuefeng/learngit.git (push)
现在可以看到,origin已经被关联到Gitee的远程库了。通过git push
命令就可以把本地库推送到Gitee上。
有的小伙伴又要问了,一个本地库能不能既关联GitHub,又关联Gitee呢?
答案是肯定的,因为git本身是分布式版本控制系统,可以同步到另外一个远程库,当然也可以同步到另外两个远程库。
使用多个远程库时,我们要注意,git给远程库起的默认名称是origin
,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。
仍然以learngit
本地库为例,我们先删除已关联的名为origin
的远程库:
git remote rm origin
然后,先关联GitHub的远程库:
git remote add github git@github.com:michaelliao/learngit.git
注意,远程库的名称叫github
,不叫origin
了。
接着,再关联Gitee的远程库:
git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
同样注意,远程库的名称叫gitee
,不叫origin
。
现在,我们用git remote -v
查看远程库信息,可以看到两个远程库:
git remote -v gitee git@gitee.com:liaoxuefeng/learngit.git (fetch) gitee git@gitee.com:liaoxuefeng/learngit.git (push) github git@github.com:michaelliao/learngit.git (fetch) github git@github.com:michaelliao/learngit.git (push)
如果要推送到GitHub,使用命令:
git push github master
如果要推送到Gitee,使用命令:
git push gitee master
这样一来,我们的本地库就可以同时与多个远程库互相同步:
Gitee也同样提供了Pull request功能,可以让其他小伙伴参与到开源项目中来。你可以通过Fork我的仓库:https://gitee.com/liaoxuefeng/learngit,创建一个your-gitee-id.txt
的文本文件, 写点自己学习Git的心得,然后推送一个pull request给我,这个仓库会在Gitee和GitHub做双向同步。
二、git remote add <shortname> <url>
命令具体解析
2.1命令+选项+参数-解析
1、命令git remote add <shortname> <url>:将远程仓库唯一的URL<url> 映射成为 在本地仓库中对远程仓库起的别名<shortname>。(注意:git remote add <shortname> <url>只负责映射!它不会产生下载或上传的流量!只有git clone,git fetch,git pull等才产生下载或上传的流量!)
2、参数<shortname>:在本地仓库中对远程仓库起的别名。而我们按照Git官方教程,一般会把参数<shortname>设置为origin。
为什么要强调在本地仓库中?因为我们要知道git remote add <shortname> <url>是在我们自己的本地仓库对远程仓库起的别名,这个别名只能在我们自己的本地仓库使用,在真正的远程仓库那边,远程仓库的名字是一个绝对唯一的URL(比如:git@github.com:michaelliao/learngit.git),而不是origin。甚至我们的开发团队成员也可以自定义这个开发团队成员他个人的本地仓库中对远程仓库起的别名,比如官方教程2.5 Git 基础 - 远程仓库的使用中的参考命令git remote add pb https://github.com/paulboone/ticgit,官方给参数<shortname>设置为pb而不是origin了。
3、参数<url>
:远程仓库在互联网上唯一的URL。比如廖雪峰的Git仓库的SSH地址:git@github.com:michaelliao/learngit.git
。
2.2命令实例解析-git remote add origin git@github.com:michaelliao/learngit.git
在Git官方教程2.5 Git 基础 - 远程仓库的使用中,它对git remote add <shortname> <url>
的解释是:
运行 git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写:
在廖雪峰Git教程添加远程库中,把一个已有的本地仓库与远程仓库关联,也用到了以下命令:
$ git remote add origin git@github.com:michaelliao/learngit.git
我们值得注意的是,上面的2份教程对该命令的解释都是:git remote add <shortname> <url>命令用于添加一个新的远程 Git 仓库或者把一个已有的本地仓库与远程仓库关联。其实这些都不准确。
git remote add <shortname> <url>命令真实的用途是:将远程仓库唯一的URL<url> 映射成为 在本地仓库中对远程仓库起的别名<shortname>。这是因为 远程仓库唯一的URL<url> 实在是太长了,比如git remote add origin git@github.com:michaelliao/learngit.git命令中的git@github.com:michaelliao/learngit.git,Git使用者每次使用涉及远程仓库的命令都要加这么长的名字作为参数实在太麻烦了,所以将远程仓库唯一的URL<url> 映射成为 <shortname>,这样使用涉及远程仓库的命令只需要写 本地仓库中对远程仓库起的别名<shortname>就可以啦,比如廖雪峰Git教程添加远程库中的两条命令连用:
上面第一个红框中已经将origin映射为git@github.com:michaelliao/learngit.git。那么第二个红框中想要push本地仓库到远程仓库的命令中的远程仓库参数,甚至本仓库中涉及远程仓库的所有命令的远程仓库参数,都可以使用origin这个超短字符代替,这样是不是超级方便Git使用者操作远程仓库了?
所以这才是git remote add <shortname> <url>命令真实的用途是:将远程仓库唯一的URL<url> 映射成为 在本地仓库中对远程仓库起的别名<shortname>,使用字符更短更间接的本地仓库中对远程仓库起的别名<shortname>来帮助Git使用者简易编写涉及远程仓库的命令。
三、git push <远程仓库名> <本地分支名>:<远程分支名>
命令具体解析
3.1 命令+选项+参数-解析
git push <远程仓库名> <本地分支名>:<远程分支名>:将本地分支推送到远程仓库的远程分支。(注意:这里的远程仓库名依然是在本地仓库中对远程仓库起的别名)
<远程仓库名>:在本地仓库中对远程仓库起的别名,如上面设置的origin。
<本地分支名>:本地分支的名称,比如我们在项目开发,一般主分支(也是默认分支)叫做master,一些新功能开发的分支叫做develop或feature。这些我们在我们自己电脑本地用git branch创建的分支就是本地分支。
<远程分支名>:在远程仓库的普通分支,比如远程仓库上的master,自己在远程仓库创建的分支,以及自己推送到远程仓库上去的在远程仓库上的分支。
(注意:<远程分支名>与 <远程仓库名>的情况不同:
(i)<远程分支名>的取名由git push中的远程分支名决定,一般Git使用者会省略<远程分支名>这个参数,所以Git会默认把<本地分支名>设置为<远程分支名>;
(ii)<本地分支名>无论在远程仓库还是本地仓库就只有一个名字,不像<远程分支名>有一个绝对URL地址名字和一个在本地仓库中的别名。)
3.2 git push
如果当前分支曾经未被远程跟踪,那么GitBash会报错:
错误提示中的upstream branch
就是上游分支(别名:远程分支),就是因为当前分支曾经未被远程跟踪,那么Git也不知道我们省略的 远程仓库名+本地分支名+远程分支名
3个参数中必要填写远程仓库名+本地分支名。
git push的意义:当Git使用者将当前分支远程跟踪到远程仓库的远程分支后,可以直接用git push命令向远程仓库推送更新。这样,Git使用者再也不用每次输入此格式命令git push origin master来向远程仓库推送更新,因为这个命令太长了导致Git使用者体验不佳。
3.3git push <远程仓库名> <本地分支名>
举例:git push origin master
git push <远程仓库名> <本地分支名>是第一次Push分支时必须使用的命令(因为第一次Push分支必须指定<远程仓库名> <本地分支名>),它省略了远程分支名,但是根据Git官方教程介绍,如果Git使用者没有填写<远程分支名>,Git会用已经填写的<本地分支名>来填
补缺省的<远程分支名>。
Git官方教程-3.5 Git 分支 - 远程分支是这么描述的:
如果希望和别人一起在名为 serverfix 的分支上工作,你可以像推送第一个分支那样推送它。 运行 git push (远程仓库名) (远程分支名):
$ git push origin serverfix
这里有些工作被简化了。 Git 自动将 serverfix 分支名字展开为 refs/heads/serverfix:refs/heads/serverfix,那意味着,“推送本地的 serverfix 分支来更新远程仓库上的 serverfix 分支。” 我们将会详细学习 Git 内部原理 的 refs/heads/ 部分,但是现在可以先把它放在
儿。 你也可以运行 git push origin serverfix:serverfix,它会做同样的事 - 相当于“推送本地的 serverfix 分支,将其作为远程仓库的 serverfix 分支”。
注意:git push <远程仓库名> <本地分支名>并未使用短选项-u或长选项--set-upstream,所以它并未使得当前分支远程跟踪了远程分支,所以往后再次Push当前分支时依然要使用git push <远程仓库名> <本地分支名>命令,不可以缩短为git push或者git push <远程
仓库名>。
3.4git push -u <远程仓库名> <本地分支名>
举例:git push -u origin master
短选项-u用于指定git push命令中的<远程仓库名>的<远程分支名>为<本地分支名>所跟踪的上游分支。
相比于git push <远程仓库名> <本地分支名>,因为git push -u <远程仓库名> <本地分支名>使用了短选项-u,所以它使得当前分支远程跟踪了远程分支。进而,往后再次Push当前分支时可以直接使用git push或者git push <远程仓库名>命令。
3.5git push --set-upstream <远程仓库名> <本地分支名>
举例:git push --set-upstream origin master
相比于git push -u <远程仓库名> <本地分支名>,git push --set-upstream <远程仓库名> <本地分支名>把短选项-u换成了长选项--set-upstream。因为--set-upstream长选项等价的短选项是-u,所以git push --set-upstream <远程仓库名> <本地分支名>与git push -u <
远程仓库名> <本地分支名>是等价的。
3.6git push <远程仓库名> <本地分支名>:<远程分支名> 举例:git push origin serverfix:awesomebranch
一般善于偷懒的Git使用者会直接使用git push -u <远程仓库名> <本地分支名>命令来免去填写<远程分支名> 这个参数的麻烦。但是“免去填写<远程分支名> 这个参数的麻烦”只适用于本地分支名与被推送到的远程分支名相同时的情况。
根据Git官方教程-3.5 Git 分支 - 远程分支的描述:
在本地分支名是serverfix的情况下,如果并不想让远程仓库上的分支也叫做 serverfix,可以运行 git push origin serverfix:awesomebranch 来将本地的 serverfix 分支推送到远程仓库上的 awesomebranch 分支。这样就可推送本地分支到一个命名不相同的远程分支。
参看链接:
廖雪峰的git教程:https://www.liaoxuefeng.com/wiki/896043488029600/1163625339727712
https://blog.csdn.net/wq6ylg08/article/details/89028412