本节主要学习一下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
可以看到,
- 远程的branch 信息在本地是有单独的存放地方的 在refs/remotes下面的。
- 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就可以看到