追踪分支和远程追踪分支

追踪分支

  • 追踪分支从git clonegit pullgit merge获取内容。
  • 追踪分支可以被用户修改。
  • 用户可以在本地的追踪分支提交并 push 到远程仓库上,由此更新远程跟踪分支。

远程跟踪分支

  • git clonegit pullgit fetch 获取内容。
  • 不能被用户修改。
  • 只能从远程仓库获取内容。
类型 通过更新 通过发布 客户端访问
远程追踪分支 git fetch,git pull 不发布 只读
追踪分支 git merge,git pull git push 读写

分支指向流

下面通过一些列的操作和图形来标识这俩分支的指向。

git clone

运行git clone命令时,Git 会做这些有关于分支的事情:

  • 创建一个新的远程分支叫做 origin/master
  • 本地创建一个远程追踪分支 origin/matster 和一个本地分支 master。这两个分支指向远程仓库 master 分支所指向的提交对象。

1

向本地仓库添加文件

$ echo '# Beginning of a Makefile' > Makefile
$ git add .
$ git commit -m "Added a Makefile"

添加了这个提交(C3)之后,仓库的情况如下图所示:

2

push 本地提交

3

fetch 新的提交

如果和别人协作开发,那么经常需要 fetch 以获取同事的工作。假设同事已经推送了一个提交(C4),那必须先 fetch 其仓库。fetch 操作会把远程仓库的新提交更新到本地的远程跟踪分支,而跟踪分支是不动的:

4

merge 新的提交

前面说到 fetch 之后,远程跟踪分支实际上就保持和远程仓库一直了,现在把远程跟踪分支合并到跟踪分支:

5

对 .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

results matching ""

    No results matching ""