追踪分支和远程追踪分支
追踪分支:
- 追踪分支从
git clone
,git pull
和git merge
获取内容。 - 追踪分支可以被用户修改。
- 用户可以在本地的追踪分支提交并 push 到远程仓库上,由此更新远程跟踪分支。
远程跟踪分支:
- 从
git clone
,git pull
,git fetch
获取内容。 - 不能被用户修改。
- 只能从远程仓库获取内容。
类型 | 通过更新 | 通过发布 | 客户端访问 |
---|---|---|---|
远程追踪分支 | git fetch,git pull | 不发布 | 只读 |
追踪分支 | git merge,git pull | git push | 读写 |
分支指向流
下面通过一些列的操作和图形来标识这俩分支的指向。
git clone
运行git clone
命令时,Git 会做这些有关于分支的事情:
- 创建一个新的远程分支叫做 origin/master
- 本地创建一个远程追踪分支 origin/matster 和一个本地分支 master。这两个分支指向远程仓库 master 分支所指向的提交对象。
向本地仓库添加文件
$ echo '# Beginning of a Makefile' > Makefile
$ git add .
$ git commit -m "Added a Makefile"
添加了这个提交(C3)之后,仓库的情况如下图所示:
push 本地提交
fetch 新的提交
如果和别人协作开发,那么经常需要 fetch 以获取同事的工作。假设同事已经推送了一个提交(C4),那必须先 fetch 其仓库。fetch 操作会把远程仓库的新提交更新到本地的远程跟踪分支,而跟踪分支是不动的:
merge 新的提交
前面说到 fetch 之后,远程跟踪分支实际上就保持和远程仓库一直了,现在把远程跟踪分支合并到跟踪分支:
对 .git 的影响
前面聊了git clone/git fetch/git merge
等命令运行背后发生的事情。不止如此,这些远程命令的运行也会对 .git 文件夹有影响。
git clone 和配置文件
运行git clone git://repohost/project1.git
,git 的配置文件会发生变化:
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git://repohost/project1.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
更多关于远程分支的文章:远程分支-progit