远程分支
3.5 远程分支
远程分支是指向远程仓库的分支的指针,这些指针存在于本地且无法被移动。当你与服务器进行任何网络通信时,它们会自动更新。远程分支有点像书签,它们会提示你上一次连接服务器时远程仓库中远程仓库中每个分支的位置
远程分支的表示形式是(remote)/(master)。例如,如果你想查看上次与服务器通信时远程origin 仓库中的master 分支的内容,就需要查看origin/master 分支。假设你与合作伙伴同开发某个需求,而他们将数据推送到了iss53分支。这时你也可能有一个自己本地的iss53分支,但是服务器端的分支其实指向的是origin/iss53。
上述内容可能有点令人困惑,所以让我们再来看一个例子。假设你有一台网络上的git服务器,地址是git.ourcompany.com。如果你将内容从这台服务器上克隆到本地,Git 的clone 命令会自动把这台服务器命名为origin,并拉取它的全部数据,然后会在本地创建指向服务器上master分支的指针,并命名为 origin/master。Git 接着也会帮你创建你自己的本地master分支。这个分支一开始会与origin上的master分支执向一样的位置,这样你就可以在它上面开始工作了。
origin并非特殊名称
与master 分支名称一样,origin 在Git 中也没什么特殊含义。master 被广泛使用只是因为它是执行 git init 时创建的初始化分支的默认名称。origin也一样是执行git clone时远程仓库的默认名称。如果你执行的不是上述的命令,而是git cone -o booyah,那么你的默认远程分支就会是booyah/master。
如下图:远程仓库和克隆下来的本地仓库
假设你在本地的master 分支上进行了一些工作,与此同时,别人向 git.ourcompany.com 推送了数据,更新了服务器数据上的master 分支,这时你的提交历史就与服务器上的历史产生了偏离。而且,只要你不与服务器通信,你的origin/master 指针就不会移动。
如下图:本地与远程的数据之间可以产生偏离
要与服务器同步,需要执行git fetch origin 命令。这条命令会查询 "origin" 对应的服务器地址(本例中是git.ourcompany.com),并从服务器取得所有本地尚未包含的数据,然后更新本地数据库,最后把origin/master 指针移动到最新的位置上去。
如下图: git fetch 命令会更新远程分支指针
3.5.1 推送
当需要同别人共享某个分支上的工作成果时,就要把它随送到一个具有写权限的远程仓库。你的本地分支并不会自动同步到远程仓库,必须要显示地推送那些你想要与别人共享的分支。这样一来,你就可以使用私有分支做一些不想与别人共享的工作,而仅仅推送那些需要与别人协作的主题分支
假设你有一个叫做 serverfix 的分支需要与其他人协作开发。只需要执行 git push (remote) (branch) 命令即可,作用就是将本地新建的分支共享到远程仓库
$ git push origin serverfix
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
remote: Create a pull request for 'serverfix' on Gitee by visiting:
remote: https://gitee.com/chaung_sun/douban/pull/new/chaung_sun:serverfix...chaung_sun:master
To https://gitee.com/chaung_sun/douban.git
* [new branch] serverfix -> serverfix
上述命令实际上时一个简化写法。Git 会自动把分支名称serverfix 扩展成refs/heads/serverfix:refs/heads/serverfix。上述的含义是:"把本地的serverfix 分支推送到远程的serverfix分支上,以便更新远程数据"。也就是说,你可以执行git push origin serverfix: serverfix,这条命令可以达到与之前的命令一样的效果。类似这样的命令格式可以用来将本地分支推送到不同名称的远程分支。比如,如果你不想把远程分支命名为serverfix,就可以执行 git push origin serverfix: awesomebranch,把你的本地serverfix 分支推送到远程的 awesomebranch 分支上去。
下一次与你协作的同事从服务器上拉去数据时,他就会获取到一个指向服务器上serverfix分支的指针,这个指针叫做origin/serverfix:
$ git fetch origin
From https://gitee.com/chaung_sun/douban
* [new branch] serverfix -> origin/serverfix
要注意的一点是,当获取服务器上的数据时,如果获取到了本地还没有的新的远程跟踪分支,这时Git 合并不会自动提供给你该分支的本地可编辑副本。换句话说,在上述列子中,在本地就不会自动创建新的serverfix分支,而只是拥有了指向origin/serverfix 的指针,不能直接做出修改、
$ git branch -a
* master
remotes/origin/error335
remotes/origin/master
remotes/origin/serverfix
要把该分支的工作合并到你的当前工作分支,可以执行git merge origin/serverfix。
$ git fetch origin
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://gitee.com/chaung_sun/douban
540a302..2de160d serverfix -> origin/serverfix
86158@DESKTOP-9PANV23 MINGW64 /e/PyProject/douban (master)
$ git merge origin/serverfix
Updating 540a302..2de160d
Fast-forward
serverfix_test.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 serverfix_test.txt
如果你想要创建自己的本地serverfix分支,以便在其上工作,可以执行以下命令
$ git branch -a
* master
remotes/origin/error335
remotes/origin/master
remotes/origin/serverfix
86158@DESKTOP-9PANV23 MINGW64 /e/PyProject/douban (master)
$ git checkout -b serverfix origin/serverfix
Switched to a new branch 'serverfix'
Branch 'serverfix' set up to track remote branch 'serverfix' from 'origin'.
86158@DESKTOP-9PANV23 MINGW64 /e/PyProject/douban (serverfix)
$ git branch -a
master
* serverfix
remotes/origin/error335
remotes/origin/master
remotes/origin/serverfix
86158@DESKTOP-9PANV23 MINGW64 /e/PyProject/douban (serverfix)
这样就会基于origin/serverfix 创建本地分支,使你可以在其上工作
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/18032433