[GIT] master、origin master 与 origin/master 有什么区别?

陪她去流浪 桃子 2017年02月23日 编辑 阅读次数:21919

如果没有特意去了解 masterorigin masterorigin/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

经过上面的解释,估计现在就很容易记住这两个概念,及其它们的区别了。

参考链接:

标签:git