### /.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.hmoore.net/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
- 代碼部署問題
- 開發流程
- 指定公鑰文件