【Git零基础教程】(5)Remote

当你不仅仅是在本地单人工作时,就需要使用git remote、push、pull等命令来实现多人协作。

当你使用clone命令从某个网络地址下载得到一个本地的git仓库:
git clone <url>
或者
git remote add <shortname> <url>
git pull <shortname>

网络仓库的结构和你的本地仓库结构分别如下图所示:
这里写图片描述

然后当你在本地做了一些修改,同时服务器上的内容经过别人的一些修改(并提交)后,两者的结构就会发生变化:
这里写图片描述

这时你如果用
git fetch origin
或者偷懒一点,可以省略origin,它是默认参数:
git fetch
来下载得到指定的remote上所有本地没有的commits,以及branches的位置,结构图变成下图所示:
这里写图片描述

这里origin是clone后自动生成的一个remote,它就指代的是clone的地址(上图中的 janedoe@git.ourcompany.com:project.git)。
origin/master表示origin上面的master分支的位置(可以理解为一个指针)

fetch下载的数据放在.git文件夹里,所以此时的工作目录不会有任何变化。你也无法通过git branch看到下载到的origin的各分支。不过你可以通过
git ls-remote origin
来查看origin上的各分支,然后使用
git checkout origin/<branch_name>
来切换到刚刚fetch到的某个remote分支

现在假设此时你又得知在另外的网址也建立了一个该库,你也想获得它,可以使用
git remote add <shortname> <url>
来新加一个remote,其中<shortname>是你自己为它随意命名的,这里假设取名为teamone。
然后用
git fetch teamone
来下载该仓库的各个分支。
完成后结构图如下,左上是原服务器仓库,右上是新加的服务器仓库:

这里写图片描述


git push

git push <remote> <branch>
如:
git push origin master
它的意思是用本地的master分支去更新origin服务器上的master分支。你也可以指定不同名称的<local_branch><remote_branch>
git push <remote> <local_branch>:<remote_branch>

之前的git push origin master等价于git push origin master:master


git pull

git pull
缺省情况下等于git pull origin
就等于先git fetch origin然后git merge <tracked_branch>
git fetch origin从origin下载得到所有本地没有的commits,以及所有origin上branches的位置信息。
git merge <tracked_branch>的意思是将当前branch 跟踪(track)的remote branch合并到当前branch,如果当前branch没有track的对象,必须显式指定出来:
git pull <remote> <branch>
它就相当于
git fetch
git merge /


Tracking Branches

上一节提到了跟踪(track),那么如何让本地的branch track相应的服务器分支呢。
一般如果你clone了一个工程,那么你的本地master分支默认已经track了origin/master。如果我们要新增一个track关系,分三种情况:

1. 本地有分支服务器没有分支

git push -u或--set-upstream <remote> HEAD或<branch_name>
如:git push -u origin test
上文中提到过,它等价于 git push -u origin test:test,也就是用本地的test分支去更新origin/test分支,同时让本地的test分支track origin/test(-u的效果)

2. 本地没有服务器有

git checkout -b <local_branch> <remote>/<remote_branch>
如:git checkout -b test origin/test
-b的意思是新建一个local_branch(不能和本地已有的重名),如果同时附上remote branch,就可以让它track该remote branch。这里<remote_branch><local_branch>不需要同名。

还有另一种写法:
git checkout --track <remote>/<remote_branch>
相当于
git checkout -b <remote_branch> <remote>/<remote_branch>

还有另一种更简单的写法:
git checkout <remote_branch>
相当于
git checkout -b <remote_branch> <remote>/<remote_branch>
该写法生效需满足:
1.本地不存在名为<remote_branch> 的分支(不然就直接checkout过去了)
2.只有一个remote拥有<remote_branch>

3. 本地有服务器也有

git branch <local_branch> -u或--set-upstream-to <remote>/<remote_branch>
如:git branch experiment -u origin/test
或:git branch -u origin/test
<local_branch> track <remote>/<remote_branch>
如果省略<local_branch>参数将使用当前所在的branch。
之后merge的时候将自动将<remote>/<branch>合并到当前branch


可以使用
git branch -vv
来查看本地branches的跟踪情况:
这里写图片描述

图中[ ]内就是track的对象,后面还会写出local branch与remote branch比较的结果。如ahead 3, behind 1就表示local branch有3个commits是remote branch所没有的,而remote branch有1个commit是local branch所有没有的,也就是存在着分叉。

建立了track关系后进行pull、merge就可以不用指定参数了。


  • 删除remote branches
    git push <remote> --delete <remote_branch>

    git push <remote> :<remote_branch>
    不会影响到本地的branches

  • 删除remotes
    git remote rm <remote>

其他git remote的常用命令:

  • -v
    并显示总体概要信息

  • show <remote_name>
    显示某一remote的详细信息,如:
    git remote show origin

  • rename <old_name> <new_name>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值