git数据结构三

本节主要学习一下git远程tag和branch在本地的存储表现
http://www.worldhello.net/gotgit/03-git-harmony/030-git-tag.html#git-tag

前一篇讨论了git本地的branch 和tag都是怎样存储的
这一篇主要是一起来了解一下git remote的branch 和tag在本地是如何存储的

1,问题发现

每次使用git fetch 和 git pull orgin master时候,如果想同步下来branch 都是使用git pull origin master,如果是 同步tag的话则是直接使用 git fetch操作。感觉自己有必要了解一下git fetch和git pull之间的关系。

实际发现在 .git目录下


chuangchuang@chuang:~/work/temp/gittest[master*]$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── FETCH_HEAD
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       ├── heads
│       │   ├── dev
│       │   └── master
│       └── remotes
│           └── origin
│               ├── dev
│               └── master
├── objects
│   ├── 45
│   │   └── 776d6cb67571cfe31656fb1d114e520c9e0ab2
│   ├── 68
│   │   └── d98b1781c29d1df8b4ac7b6d457bccecf9756e
│   ├── a3
│   │   └── c8effc24eeb66de97a66b073c6d62c48fbc9ed
│   ├── c8
│   │   └── ec46b8063b47a12de692106db06822945d4b09
│   ├── e4
│   │   └── 626567ec9ae5a6f3abd77af37c25a85ec4e7f1
│   ├── e6
│   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│   ├── f1
│   │   └── 3f51556efabe074d5b255eabcdd3ec33520c55
│   ├── info
│   └── pack
├── ORIG_HEAD
└── refs
    ├── heads
    │   ├── dev
    │   └── master
    ├── remotes
    │   └── origin
    │       ├── dev
    │       └── master
    └── tags
        └── v1.0.0

可以看到,

  1. 远程的branch 信息在本地是有单独的存放地方的 在refs/remotes下面的。
  2. tags则是远程和本地的是共用的。

2,git pull 也是可以拉下来

直接使用git pull 默认是使用的git pull origin ,这样会把所有的东西都拉下来(包括 branch 和tag ,而且会进行branch的合并)
但是有进行分支跟踪的设置,因为没有进行跟踪设置的话,git不知道如何合并,会报错

chuangchuang@chuang:~/work/temp/gittest[master*]$ git branch --set-upstream-to=origin/master 
分支 master 设置为跟踪来自 origin 的远程分支 master。
 //设置当前分支跟踪远程的 master分支
chuangchuang@chuang:~/work/temp/gittest[dev*]$ git push --set-upstream origin dev
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
Everything up-to-date

2.1 在远端的 master分支创建 master.txt dev分支创建dev.txt

2.2 在本地执行git pull

chuangchuang@chuang:~/work/temp/gittest[master*]$ git pull
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (6/6), 完成.
来自 github.com:chenchuangc/test_git
   45776d6..3bc8e4a  master     -> origin/master  //拉到了本地的远程分支保存地
   45776d6..a027208  dev        -> origin/dev  //同上
更新 45776d6..3bc8e4a
Fast-forward
 master.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 master.txt
chuangchuang@chuang:~/work/temp/gittest[master*]$ ll
总用量 20
drwxrwxr-x 3 chuangchuang chuangchuang 4096 11月 13 14:09 ./
drwxrwxr-x 6 chuangchuang chuangchuang 4096 11月 13 10:45 ../
-rw-rw-r-- 1 chuangchuang chuangchuang   37 11月 11 21:15 aa.txt
drwxrwxr-x 8 chuangchuang chuangchuang 4096 11月 13 14:09 .git/
-rw-rw-r-- 1 chuangchuang chuangchuang   19 11月 13 14:09 master.txt


可以看到在master分支上面已经通了
再看看dev分支

chuangchuang@chuang:~/work/temp/gittest[master*]$ git checkout dev
切换到分支 'dev'
您的分支落后 'origin/dev' 共 1 个提交,并且可以快进。
  (使用 "git pull" 来更新您的本地分支)
chuangchuang@chuang:~/work/temp/gittest[dev*]$ ll
总用量 16
drwxrwxr-x 3 chuangchuang chuangchuang 4096 11月 13 14:09 ./
drwxrwxr-x 6 chuangchuang chuangchuang 4096 11月 13 10:45 ../
-rw-rw-r-- 1 chuangchuang chuangchuang   37 11月 11 21:15 aa.txt
drwxrwxr-x 8 chuangchuang chuangchuang 4096 11月 13 14:09 .git/
chuangchuang@chuang:~/work/temp/gittest[dev*]$ git merge origin/dev
更新 45776d6..a027208
Fast-forward
 dev.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 dev.txt
chuangchuang@chuang:~/work/temp/gittest[dev*]$ ll
总用量 20
drwxrwxr-x 3 chuangchuang chuangchuang 4096 11月 13 14:09 ./
drwxrwxr-x 6 chuangchuang chuangchuang 4096 11月 13 10:45 ../
-rw-rw-r-- 1 chuangchuang chuangchuang   37 11月 11 21:15 aa.txt
-rw-rw-r-- 1 chuangchuang chuangchuang   27 11月 13 14:09 dev.txt
drwxrwxr-x 8 chuangchuang chuangchuang 4096 11月 13 14:09 .git/

这里可以看到,切换到dev分支以后并没有dev.txt但是执行完 merge origin/dev以后就可以看到了,应该是合并了本地的远程更新。
只有一个机器,暂时没有测试tag,按理tag是直接有的,不用再merge了

3,总结

所以执行git fetch 的时候是能够将远程的所有东西都拉下来的,但是 branch相关的信息在本地是单独存放在一个地方的,不影响本地的分支,
使用git branch 是看不到的;
但是tags则是共用的,只要拉下来,在本地仓库使用git tag就可以看到

你可能感兴趣的:(git数据结构三)