Git 远程分支
[TOC]
一个远程仓库:
上图描述的是,在远程仓库git.company.com里面,有一个master分支。如果clone到本地仓库,那么会有一个跟踪分支,这个分支我们平时是很少讨论的。 默认把它和master混为一谈。如上图1所示,将远程仓库中的master分支clone后,在本地会有一个local branch和一个remote branch。 这个remote branch一般会带有远程仓库的名字origin。所以是origin/master开头。这个就是跟踪分支,跟踪分支是用来确认远程仓库和本地仓库之间的联系。
如果有人对远程仓库中的master分支做了修改,在没有pull或者fetch到本地的情况下。跟踪分支origin/master的commit id是不会变的。 如果本地仓库做了修改之后提交,虽然HEAD指向的master的commit id变了,跟踪分支的commit id也是不变的。如图2所示,有人对远程仓库做了修改, 远程仓库中的master的commit id从f4265,提交两次后变成190a3;在本地仓库上,假如你对本地仓库做了两次提交,commit id从原来的f4265变为893cf, 但是跟踪分支,就是连接远程仓库和本地仓库的分支origin/master始终是不变的。这就是跟踪分支的意义,跟踪分支为本地分支和远程分支之间建立了一种联系, 方便了远程分支和本地分支的同步。每次pull/fetch或者push的时候才会改变。
“origin” 并无特殊含义
远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时 “master” 是当你运行 git init 时默认的起始分支名字, 原因仅仅是它的广泛使用, “origin” 是当你运行 git clone 时默认的远程仓库名字。
接着你对远程仓库中的master分支fetch到本地仓库,那么远程仓库中提交过两次的master就会变成本地的分支,跟踪分支的commit id就会从f4265变成190a3, 这显示你从commit id为190a3的地址上和远程仓库连接了一次。 接下来,你可以决定要不要和本地的master 分支merge。
两个远程仓库
假设有两个远程仓库,分别有一个master分支,在上一步的基础上,我们添加teamone的远程仓库。 这个服务器位于 git.team1.ourcompany.com。 你可以运行 git remote add 命令添加一个新的远程仓库引用到当前的项目:
$ git remote add teamone git://git.team1.ourcompany.com
最后的结果如上图4所示,只是多了一个远程仓库。
接下来,通过fetch 可以抓取远程仓库 teamone 有而本地仓库没有的数据。因为那台服务器上现有的数据是 origin 服务器上的一个子集, 所以 Git 并不会抓取数据而是会设置远程跟踪分支 teamone/master 指向 teamone 的 master 分支。后面是否需要合并,就看你需不需要。
查看所有跟踪分支
如果想要查看设置的所有跟踪分支,可以使用 git branch 的 -vv 选项。 这会将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有。
$ git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] forgot the brackets
master 1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
testing 5ea463a trying something new
这里可以看到 iss53 分支正在跟踪 origin/iss53 并且 “ahead” 是 2,意味着本地有两个提交还没有推送到服务器上。 也能看到 master 分支正在跟踪 origin/master 分支并且是最新的。 接下来可以看到 serverfix 分支正在跟踪 teamone 服务器上的 server-fix-good 分支并且领先 3 落后 1, 意味着服务器上有一次提交还没有合并入同时本地有三次提交还没有推送。 最后看到 testing 分支并没有跟踪任何远程分支。
推送push
当年完成提交(commit),想要把你的成果放在远程仓库上和伙伴一起分享,这是就需要用到pull的操作。因为本地的分支并不会自动与远程仓库同步——你必须通过推送(pull)分支来分享。 git push
$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
* [new branch] serverfix -> serverfix
上面的指令的意思是将本地serverfix推送到远程仓库中的serverfix分支上。这个连接就是跟踪分支origin/serverfix。
$ git push origin serverfix:serverfix
这个指令也是一样的,如果不想推送到远程仓库中的serverfix分支上,可以修改最后一个仓库名字,比如:
$ git push origin serverfix:anotherbranch
上面的意思是将本地的serverfix分支推送到远程仓库中的anotherbranch分支上。 一般来讲,会弹出叫你输入密码:
如何避免每次输入密码
如果你正在使用 HTTPS URL 来推送,Git 服务器会询问用户名与密码。 默认情况下它会在终端中提示服务器是否允许你进行推送。 如果不想在每一次推送时都输入用户名与密码,你可以设置一个 “credential cache”。 最简单的方式就是将其保存在内存中几分钟,可以简单地运行 git config –global credential.helper cache 来设置它。
文档信息
- 本文作者:Kilin
- 本文链接:https://star-twinking.github.io/2021/08/13/Git-%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)