操作总结
有时候我们开发需要开一个分支,这样可以有效的并行开发.
开分支有两种方式:
(1)一种是在远程开好分支,本地直接拉下来;
git checkout -b feature-branch origin/feature-branch //检出远程的feature-branch分支到本地
(2)一种是本地开好分支,推送到远程.
$ git checkout -b newbranch //创建并切换到分支newbranch
$ git push origin newbranch:newbranch //推送本地的newbranch(冒号前面的)分支到远程origin的newbranch(冒号后面的)分支(没有会自动创建)
远程分支
远程分支是对远程仓库的引用(指针),包括分支、标签等等,你可以通过 git ls-remote <remote>
来显示的获取远程引用的完整列表,或者git remote show <remote>
获得远程分支的更多信息。然而,一个更常见的做法是利用远程跟踪分支
- 远程跟踪分支是远程分支状态的引用。它们是你无法移动的本地引用。一旦你进行了网络通信,git就会为你移动它们以精确反映远程仓库的状态。
- 请将远程跟踪分支看做书签,这样可以提醒你该分支在远程仓库中的为止就是你最后一次连接到它们的位置
它们以<remote>/</branch>的形式命名。
- 如果你想要看你最后一次与远程仓库
origin
通信时master
分支的状态,你可以查看origin/master
分支
- master 是当你运行
git init
时默认的起始分支名字 - origin是当你运行
git clone
时默认的远程仓库名字
- 你与同事合作解决一个问题并且他们推送了一个
iss53
分支,你可能有自己的本地iss53
分支, 然而在服务器上的分支会以origin/iss53
来表示
例子:
- 假设你的网络里有一个在
git.ourcompany.com
的 Git 服务器。 - 如果你从这里clone,Git 的
clone
命令会为你自动将其命名为origin
,拉取它的所有数据,创建一个指向它的master
分支的指针,并且在本地将其命名为origin/master
- Git 也会给你一个与 origin 的
master
分支在指向同一个地方的本地master
分支,这样你就有工作的基础
- 如果你在本地的
master
分支做了一些工作,在同一段时间内有其他人推送提交到git.ourcompany.com
并且更新了它的master
分支,这就是说你们的提交历史已走向不同的方向。 即便这样,只要你保持不与origin
服务器连接(并拉取数据),你的origin/master
指针就不会移动。
- 如果要与给定的远程仓库同步数据,运行
git fetch <remote>
命令(在本例中为git fetch origin
)。 这个命令查找 “origin” 是哪一个服务器(在本例中,它是git.ourcompany.com
), 从中抓取本地没有的数据,并且更新本地数据库,移动origin/master
指针到更新之后的位置。
- 为了演示有多个远程仓库与远程分支的情况,我们假定你有另一个内部 Git 服务器,仅服务于你的某个敏捷开发团队。 这个服务器位于
git.team1.ourcompany.com
- 你可以运行
git remote add
命令添加一个新的远程仓库引用到当前的项目。 将这个远程仓库命名为teamone
,将其作为完整 URL 的缩写。
- 现在,可以运行
git fetch teamone
来抓取远程仓库teamone
有而本地没有的数据。 因为那台服务器上现有的数据是origin
服务器上的一个子集, 所以 Git 并不会抓取数据而是会设置远程跟踪分支teamone/master
指向teamone
的master
分支
推送
当你想要公开分享一个分支时,需要将其推送到有写入权限的远程仓库上。
本地的分支并不会自动与远程仓库同步,你必须显示的推送想要分享的分支
语法:
git push <remote> <branch>:
例子:
$ 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
下一次其他协作者从服务器上抓取数据时,他们会在本地生成一个不可以修改的 远程分支origin/serverfix
指针
,指向服务器的 serverfix
分支的引用:
$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
* [new branch] serverfix -> origin/serverfix
可以运行 git merge origin/serverfix
将这些工作合并到当前所在的分支。 如果想要在自己的 serverfix
分支上工作,可以将其建立在远程跟踪分支之上:
$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
这会给你一个用于工作的本地分支,并且起点位于 origin/serverfix
。
执行git push origin serverfix的效果和git push origin serverfix:serverfix的效果一样:
- Git 自动将
serverfix
分支名字展开为refs/heads/serverfix:refs/heads/serverfix
,这表示“推送本地的serverfix
分支,将其作为远程仓库的serverfix
分支”git push origin serverfix:awesomebranch,表示“推送本地的
serverfix
分支,将其作为远程仓库的awesomebranch
分支”
跟踪分支
- 从一个远程跟踪分支检出一个本地分支会自动创建跟踪分支(它跟踪的分支叫做“上游分支”)。
- 跟踪分支是与远程分支有直接关系的本地分支。 如果在一个跟踪分支上输入
git pull
,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。
当克隆一个仓库时,它通常会自动地创建一个跟踪 origin/master
的 master
分支。
我们可以使用 git checkout -b <branch> <remote>/<branch>
设置其他的跟踪分支,或是一个在其他远程仓库上的跟踪分支,又或者不跟踪 master
分支。它的快捷方式是--track
:
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
如果想要将本地分支与远程分支设置为不同的名字,你可以轻松地使用上一个命令增加一个不同名字的本地分支:
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
现在,本地分支 sf
会自动从 origin/serverfix
拉取。
设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支, 你可以在任意时间使用 -u
或 --set-upstream-to
选项运行 git branch
来显式地设置。
$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
当设置好跟踪分支后,可以通过简写 @{upstream}
或 @{u}
来引用它的上游分支。 所以在 master
分支时并且它正在跟踪 origin/master
时,如果愿意的话可以使用 git merge @{u}
来取代 git merge origin/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
分支并没有跟踪任何远程分支。
需要重点注意的一点是这些数字的值来自于你从每个服务器上最后一次抓取的数据。 这个命令并没有连接服务器,它只会告诉你关于本地缓存的服务器数据。 如果想要统计最新的领先与落后数字,需要在运行此命令前抓取所有的远程仓库。 可以像这样做:
$ git fetch --all; git branch -vv
拉取
git pull = git fetch
+ git merge