多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### /.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)