问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Git中的"origin"到底是什么意思?

创作时间:
作者:
@小白创作中心

Git中的"origin"到底是什么意思?

引用
1
来源
1.
https://www.cnblogs.com/xuyaowen/p/git-origin.html

我们从《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并不是指得是远程的仓库,而是指得是远程仓库在本地的一个指针(这个指针有可能过时的)。当我们使用使用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 addgit 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 fetchgit merge共同效果并不完全等同于git pull。或者用英文来定义一下fetch和pull更为明白:

  • git fetch是命令,表示“将远程仓库的本地副本更新到最新”。
  • git pull表示“将远程仓库中的更改更新到本地仓库”。

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

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号