如果没有特意去了解 master、origin master 与 origin/master 的区别的话,经常会导致在使用的时候模糊两者之间的区别。那么它们是怎样的区别呢?
- master 这个很好理解,它代表本地的某个分支名。
- origin master 代表着两个概念,前面的 origin 代表远程名,后面的 master 代表远程分支名。
- origin/master 只代表一个概念,即远程分支名,是从远程拉取代码后在本地建立的一份拷贝(因此也有人把它叫作本地分支)。
举几个例子可能会更加清晰地说明问题:
- 执行
git fetch origin master
时,它的意思是从名为 origin 的远程上拉取名为 master 的分支到本地分支 origin/master 中。既然是拉取代码,当然需要同时指定远程名与分支名,所以分开写。 - 执行
git merge origin/master
时,它的意思是合并名为 origin/master 的分支到当前所在分支。既然是分支的合并,当然就与远程名没有直接的关系,所以没有出现远程名。需要指定的是被合并的分支。 - 执行
git push origin master
时,它的意思是推送本地的 master 分支到远程 origin,涉及到远程以及分支,当然也得分开写了。 - 还可以一次性拉取多个分支的代码:
git fetch origin master stable oldstable
; - 也还可以一次性合并多个分支的代码:
git merge origin/master hotfix-2275 hotfix-2276 hotfix-2290
;
执行 git branch -a
可以查看所有的分支名:
root@localhost:/dat/taoblog# git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/api
remotes/origin/draft
remotes/origin/master
remotes/origin/rsync
remotes/origin/waterfall
还可以进入 .git 目录看看它们的结构:
root@localhost:/dat/taoblog# cd .git
root@localhost:/dat/taoblog/.git# tree refs/
refs/
|-- heads
| `-- master
|-- remotes
| `-- origin
| |-- api
| |-- draft
| |-- HEAD
| |-- master
| |-- rsync
| `-- waterfall
`-- tags
4 directories, 7 files
并且,它们都只是一串简单的哈希值:
root@localhost:/dat/taoblog/.git# cat refs/remotes/origin/waterfall
8d6e2a06bc5df0b87b3b05993a9e36749ccc857a
经过上面的解释,估计现在就很容易记住这两个概念,及其它们的区别了。
参考链接: