### /.git/HEAD
~~~
ref: refs/heads/dev
~~~
说明:记录当前工作的分支,指向当前的工作分支(表示指向dev分支,即dev为当前工作的分支)
### /.git/refs/remotes/origin/HEAD
~~~
ref: refs/remotes/origin/master
~~~
说明:记录远程仓库指向的分支
## 看下面的代码记录:
~~~
Administrator@USER-20160512VQ MINGW64 ~/desktop
$ git clone https://github.com/xiasf/github-note
Cloning into 'github-note'...
remote: Counting objects: 40, done.
remote: Total 40 (delta 0), reused 0 (delta 0), pack-reused 40
Unpacking objects: 100% (40/40), done.
Administrator@USER-20160512VQ MINGW64 ~/desktop
$ cd github-note
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master)
$ git branch
* master
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master)
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master)
$ git branch -r
origin/HEAD -> origin/master
origin/dev
origin/master
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (master)
$ git checkout dev
Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (dev)
$ git branch -r
origin/HEAD -> origin/master
origin/dev
origin/master
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (dev)
$ git branch -a
* dev
master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
Administrator@USER-20160512VQ MINGW64 ~/desktop/github-note (dev)
$ git branch
* dev
master
~~~
可以看出(得出结论):
1. `git branch -r` 查看远程分支(包括远程的指向)
2. `git branch -a` 查看所有(本地和远程)分支(包括远程的指向和当前工作的本地分支)
3. `git branch` 查看本地分支(包括当前工作的本地分支),当前工作的分支用`*`表示。
4. 默认`clone`后并不没有`dev`分支,使用`git checkout dev`检出后才会有dev分支,并且此时`/.git/refs/heads/`目录下面才会有`dev`文件,在检出`dev`分支之前、刚克隆时只有`master`文件,请注意到这个细节。
猜想:
1. 原来`clone`远程仓库是将`远程仓库`克隆到了本地,而我们本地工作时是在`本地仓库`中工作的,所以需要从`本地的远程仓库`中检出到本地仓库,默认克隆后会自动将`master`分支检出。所以这推翻了我们之前理解的本地只是本地分支,只是将它和远程分支关联就可以。或许对这个还是比较模糊,先看一下配置文件吧。
## /.git/config
~~~
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = https://github.com/xiasf/github-note
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[branch "dev"]
remote = origin
merge = refs/heads/dev
~~~
这段配置表示了`本地分支`和`本地远程分支`的关系(origin就是`本地远程分支`的别名,还记得`$ git remote add origin url`命令吗)
~~~
# 本地分支master
[branch "master"]
# 对应的远程分支为origin
remote = origin
# 对应的本地分支文件为master(master内容为一次commit的哈希Hash值)
merge = refs/heads/master
[branch "dev"]
remote = origin
merge = refs/heads/dev
~~~
这段配置记录了本地远程仓库的信息:
~~~
# 本地远程仓库
[remote "origin"]
# 对应的远程仓库地址
url = https://github.com/xiasf/github-note
# 本地仓库与本地远程仓库的对应关系
fetch = +refs/heads/*:refs/remotes/origin/*
~~~
现在清晰一点吧,记住现在这几个名词:
1. **本地仓库**
2. **本地远程仓库**
3. **远程仓库**
>[info] 不要在搞混了哦,尤其是本地远程仓库和远程仓库不能搞混淆了,不要简单的像之前一样以为本地只是本地分支,只是将它和远程分支关联就可以,这种理解是错误的。
### 本地仓库:
我们在这里工作
### 本地远程仓库
可以看做是我们`本地仓库`与`远程仓库`连接的桥梁
### 远程仓库
它只是一个地址源,用于与外界进行共享仓库的
>[info] 通常远程仓库只是用于向远程推送本地分支,或者进行一些同步操作,并且本地远程仓库实质只是一个“桥梁”的作用,所以一般我们所说的远程仓库都是指本地远程仓库,或者说我们使用时感觉不到这个区别,根本没有这个概念,但我们理解真正的原理之后,很多问题就会清晰了。比如git fetch命令,是获取远程仓库新提交到本地远程仓库,所以命令执行后还需要进行merge操作。
参考:[远程分支](http://www.kancloud.cn/kancloud/progit/70187)
- 说明
- git配置
- git与github的关系
- 基础概念
- git命令
- git init
- git status
- git diff
- git log
- git reflog
- git add
- git commit
- git reset
- git checkout
- git rm
- git stash
- git remote
- git push
- git clone
- git branch
- git fetch
- git merge
- git rebase
- git pull
- git tag
- 建立版本库
- 分支合并
- 远程库别名
- Pull requests
- 扩展知识
- 功能文件
- 差异看法
- 注意细节
- github移动端
- git工作系统理解
- 仓库嵌套问题
- 仓库的使用问题
- 常用命令
- 学习资料
- 学习总结
- 示例文件
- README.md
- CONTRIBUTING.md
- .gitignore
- coding
- 大小写问题
- 如何贡献
- 使用账号密码clone
- git目录分析
- HEAD
- 代码部署问题
- 开发流程
- 指定公钥文件