我们从progit 一书中可以看到:

远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时“master”是当你运行git init时默认的起始分支名字,原因仅仅是它的广泛使用,“origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master。

我们使用 git remote -v 或者 查看.git/config 可以看到 origin 的含义。

当我们通过使用 git remote -v 命令的时候我们可以看到如下:

origin https://github.com/yaowenxu/yaowenxu.github.io.git (fetch)

origin https://github.com/yaowenxu/yaowenxu.github.io.git (push)

origin 这两种形式。

但是

origin 并不是指得是远程的仓库,而是指得是远程仓库在本地的一个指针(这个指针有可能过时的)。当我们使用使用merge 的时候,我们进行合并的时候只是上一次fetch 从远程拿到的版本。不是远程仓库的最新版本。

比如命令:

git merge origin master

指的就是将本地的远端分支与本地的master 分支进行合并。

这里 git merge origin master 可以和 git merge origin/master 进行对比

或者可以对比一下 git pull origin master 对比一下,你是不是会有新得体会。

我们或许可以再看一下 progit 上面对 远程仓库的最新的解释:

远程分支(remote branch)是对远程仓库中的分支的索引。它们是一些无法移动的本地分支;只有在 Git 进行网络交互时才会更新。远程分支就像是书签,提醒着你上次连接远程仓库时上面各分支的位置。

其实:

在clone完成之后,Git 会自动为你将此远程仓库命名为origin(origin只相当于一个别名,运行git remote –v或者查看.git/config可以看到origin的含义),并下载其中所有的数据,建立一个指向它的master 分支的指针,我们用(远程仓库名)/(分支名) 这样的形式表示远程分支,所以origin/master指向的是一个remote branch(从那个branch我们clone数据到本地),但你无法在本地更改其数据。

同时,Git 会建立一个属于你自己的本地master 分支,它指向的是你刚刚从remote server传到你本地的副本。随着你不断的改动文件,git add, git commit,master的指向会自动移动,你也可以通过merge(fast forward)来移动master的指向。

我们通过 git branch -a 可以看到所有分支:

* master

remotes/origin/HEAD -> origin/master

remotes/origin/dev

remotes/origin/master

可以发现:master 就是本地分支, origin/master 指得就是远程分支。origin/master 指得是最近一次fetch 拿下来的最新版本。

上面这个图就可以很好得讲解,我们git 所合并得是commit. git merge origin master 指得是将本地库所关联的远程仓库对应的commit id 来和本地master进行合并。

而: 本地远程仓库记录文件是:.git\refs\remotes\origin\master 本地仓库记录的文件是:.git\refs\heads\master

根据 sean-zou 的博客我们可以知道:

1、git fetch只会将本地库所关联的远程库的commit id更新至最新

2、git pull会将本地库更新至远程库的最新状态

所以 git fetch 和 git merge 共同效果并不完全等同于 git pull

或者用英文来定义一下 fetch 和 pull 更为明白:

  • git fetch is the command that says “bring my local copy of the remote repository up to date.”
  • git pull says “bring the changes in the remote repository where I keep my own code.”

所以可以这么 理解orgin 或者 orgin/master 这个只是远程仓库在本地仓库的一个指针。我们可以使用 git fetch 命令来进行更新。

所以在进行merge 的时候 不要忘了先进行git fetch 进行更新到最新的远程仓库。

我们借用OoBa的一个图,他详细得对比了pull 和 fetch,merge 。当然更为详细的内容可以参考《ProGit》一书。

参考文献:

1. http://www.zhanglian2010.cn/2014/07/git-pull-vs-fetch-and-merge/

2. https://git-scm.com/book/zh/v1/Git-分支

3. https://blog.csdn.net/a19881029/article/details/42245955

4. 《ProGit》- v2.1.8

git 的 origin 的含义的更多相关文章

  1. Git 的origin和master分析

    首先要明确一点,对git的操作是围绕3个大的步骤来展开的(其实几乎所有的SCM都是这样) 1.     从git取数据(git clone) 2.     改动代码 3.     将改动传回git(g ...

  2. Git 的origin和master分析 push/diff/head(转)

    1.origin/master : 一个叫 origin 的远程库的 master 分支 2.HEAD指向当前工作的branch,master不一定指向当前工作的branch 3.git  push ...

  3. Git 的origin和master分析(转)

    转:http://lishicongli.blog.163.com/blog/static/1468259020132125247302/ 首先要明确一点,对git的操作是围绕3个大的步骤来展开的(其 ...

  4. Git的origin和master分析

    首先要明确一点,对git的操作是围绕3个大的步骤来展开的(其实几乎所有的SCM都是这样) 1. 从git取数据(git clone) 2. 改动代码 3. 将改动传回git(git push) 这3个 ...

  5. [Git] Git 的origin和master分析

    转载: http://lishicongli.blog.163.com/blog/static/1468259020132125247302/ 首先要明确一点,对git的操作是围绕3个大的步骤来展开的 ...

  6. git push origin master、git pull出现如下错误

    git push origin master出现如下错误: Counting objects: , done. Writing objects: % (/), bytes, done. Total ( ...

  7. git push origin与git push -u origin master的区别

    $ git push origin 上面命令表示,将当前分支推送到origin主机的对应分支. 如果当前分支只有一个追踪分支,那么主机名都可以省略. $ git push 如果当前分支与多个主机存在追 ...

  8. git push origin master 上传失败

    http://blog.csdn.net/llf369477769/article/details/51917557 按照网上教程用git把项目上传到github,但是在最后一步git push or ...

  9. git push origin master出错:error: failed to push some refs to

    1.输入git push origin master 出错:error: failed to push some refs to 那是因为本地没有update到最新版本的项目(git上有README. ...

随机推荐

  1. [Swift]LeetCode693. 交替位二进制数 | Binary Number with Alternating Bits

    Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits will a ...

  2. Linux查看系统、核数、CPU、位数

    查看系统: cat /etc/os-release 结果为 centOS Linux 7 查看核数和CPU: lscpu 40 个核,处理器为 Intel(R) Xeon(R) CPU E7-8891 ...

  3. Hadoop源码篇--Reduce篇

    一.前述 Reduce文件会从Mapper任务中拉取很多小文件,小文件内部有序,但是整体是没序的,Reduce会合并小文件,然后套个归并算法,变成一个整体有序的文件. 二.代码 ReduceTask源 ...

  4. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚

    写在前面 我们以前windows跑.net Framework程序的时候,发布,自己乖乖的替换程序:备份,也是自己一个一个的重命名备份:回滚,发布遇到问题的回滚更是不用说了:运维很是怕我们 这些用wi ...

  5. 【c#】RabbitMQ学习文档(二)Work Queues(工作队列)

        今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题.   (使用.NET 客户端 进行事例演示)          在第一个教程中,我们编写了一个从命名队列中发送和接收消息的程序. ...

  6. leetcode — restore-ip-addresses

    import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util. ...

  7. PE知识复习之PE的节表

    PE知识复习之PE的节表 一丶节表信息,PE两种状态.以及重要两个成员解析. 确定节表位置: DOS + NT头下面就是节表. 确定节表数量: 节表数量在文件头中存放着.可以准确知道节表有多少个. 节 ...

  8. 看看.NET Core几个Options的简单使用

    前言 配置,对我们的程序来说是十分重要的一部分.或多或少都会写一部分内容到配置文件中去. 由其是在配置中心(Apollo等)做起来之前,配置文件一定会是我们的首选. 在.NET Core中,习惯的是用 ...

  9. Kubernetes系列02—Kubernetes设计架构和设计理念

    本文收录在容器技术学习系列文章总目录 1.Kubernetes设计架构 Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分 ...

  10. Spring Boot 2.x (十二):Swagger2的正确玩儿法

    Swagger2简介 简单的来说,Swagger2的诞生就是为了解决前后端开发人员进行交流的时候API文档难以维护的痛点,它可以和我们的Java程序完美的结合在一起,并且可以与我们的另一开发利器Spr ...