细读 Git | 让你弄懂 origin、HEAD、FETCH_HEAD 相关内容
一、远程名称(Remote Name)
在 Git 中,其实无论是 origin
,还是 upstream
并没有特殊的含义,但由于被广泛使用,因此它们有了约定俗成、众所周知的含义。
如果我跟你说,以下两条命令是完全等效的,你是不是就差不多猜得出 origin
表示什么了?
$ git push origin master
$ git push https://gitee.com/jsxztshaohaibo/git-usage-test.git master
是的,跟你猜的一样:没有区别。
1.1 Origin
我们用示例来讲...
先在本地随意创建一个 Git 仓库 git-test
,然后新增一个 ReadMe.md
文件,接着 Commit 一下
以上都没问题!接着,我们试着 Push 一下:
可以看到 git push
失败了.
原因很容易理解:我们只是在本地创建一个仓库,并没有将本仓库与远程仓库进行关联,因此 Git 无法理解是将其推送至哪个代码托管平台,然后也不知道是平台上的哪个远程仓库,是 GitHub 平台的,还是 GitLab 平台的?是平台上的 React 仓库,还是 Vue 仓库,还是别的什么仓库?Git 统统都不知道,那么自然是无法替你办事了。
因此,我们需要做的就是把本地的 git-test
仓库与远程仓库关联一下(请注意,一个本地仓库是可以关联多个远程仓库的):
$ git remote add origin <repo_address>
这里用到了 origin
,我们先不管为什么用 origin
,用其他(比如 main、abc
)行不行的问题?(答案是可以的)
关联之后,再进行 Push 就能成功了。
那么 git remote add
内部做了什么默默无闻的工作呢,它其实是往 .git/config
中写入了一个叫 [remote "origin"]
配置:
[core]repositoryformatversion = 0filemode = falsebare = falselogallrefupdates = truesymlinks = falseignorecase = true
[remote "origin"]url = https://gitee.com/jsxztshaohaibo/git-usage-test.gitfetch = +refs/heads/*:refs/remotes/origin/*
如果你本地的仓库是通过 git clone
下来的,Git 会默认将远程仓库命名为 origin
,自动帮你关联上远端仓库(可在 .git/config
文件中看到已有 [remote "origin"]
配置项了),因此 Commit 之后就能直接 Push 了。
我们来分析一下,这配置表示什么意思。
[remote "origin"]url = https://gitee.com/jsxztshaohaibo/git-usage-test.gitfetch = +refs/heads/*:refs/remotes/origin/*
通过 git remote add
命令,添加了一个叫做 origin
的远程名称(Remote Name),
- 其中
url
参数,表示该远程名称对应的远程仓库地址。 - 其中
fetch
参数分为两部分,以冒号:
进行分割,冒号左边表示本地仓库文件夹,冒号右边表示远程仓库在本地的副本文件夹。里面的加号+
表示往里面添加数据的意思。
当使用 git fetch origin
时,Git 将远程仓库下的所有分支拉取到本地的 refs/remotes/origin/
目录下,然后 git merge
时,它会把 refs/remotes/origin/
目录下的对应分支合并到 refs/heads/
目录下对应分支上。
那么 origin
究竟是什么呢?
请注意,
origin
只是一个名称(别名),用于指向远程仓库。这个别名是可以自行修改的,比如命名为foo
、bar
等。使用别名好处是「简单、方便、好记(就像网址和IP的关系)」。
比起记住一个远程仓库地址,别名实在方便太多了。将 origin
作为远程仓库的别名是较为普遍的做法,况且所有代码托管平台默认就是 origin
。
回到文章开头的例子
$ git push origin master# 相当于(其中 origin 指向了 https://gitee.com/jsxztshaohaibo/git-usage-test.git 远程仓库)
$ git push https://gitee.com/jsxztshaohaibo/git-usage-test.git master
以上两种方式是完全等价的,这样就更能体现别名的优势了,简洁很多。
既然是别名,自然是可以修改的,主要有以下命令:
# 新增远程名称(一个本地仓库,可以关联多个远程仓库)
$ git remote add <remote-name> <repo-address># 删除已存在远程名称(只会移除本地仓库与远程仓库的管理,不会删除远程仓库的代码哈)
$ git remote rm <remote-name># 更新远程名称关联的远程仓库
$ git remote set-url <remote-name> <repo-address># 修改远程名称(也可以先删除再添加)
$ git remote rename <old-remote-name> <new-remote-name>
比如使用 git remote set-url 修改关联的远程仓库地址:
然后,我们修改下远程名称为 main
,也是可以的:
接着,我们随意修改个文件 Push 一下,是这样的 git push main master
:
到这里,你应彻底明白 origin
是什么了吧。
前面提到过,一个本地仓库是可以关联多个远程仓库的,举个例子:
我们新建一个远程仓库的地址,给新的仓库地址 起一个别名 origin
$ git remote add origin https://gitee.com/jsxztshaohaibo/git-usage-test.git
从图中可以看到,别名 foo
和 bar
分别指向了两个不同的远程仓库,然后使用方法与 origin
是相同的,比如:
# 将本地的 master 分支推送至 main 对应的远程仓库(git-usage-test-02.gt)
$ git push main master # 将本地的 master分支推送至 origin 对应的远程仓库(git-usage-test.git)
$ git push origin master
二、远程分支(Remote Branch)
常说的「远程分支」是远程仓库对应分支在本地的一个副本。比如常见的 origin/master
、origin/main
、origin/develop
等都是远程分支,可以在 .git/refs/remotes/
目录下看到。
# 查看所有本地分支
$ git branch# 查看所有远程分支(-r 是 --remotes 的简写)
$ git branch -r# 查看所有本地分支和远程分支(-a 是 --all 的简写)
$ git branch -a
可以通过 git branch -r
命令查看所有的远程分支:
上一节,我们介绍了远程名称只是一个代号、别名,是可以修改的。那么我们将 Remote Name 由 origin
修改为 foo
,那么远程分支,会不会由 origin/main
变为 foo/main
呢?
将远程名称修改之后,远程分支名称也会跟着改变的。
三、拉取最新代码
通常,拉取最新代码的过程是这样的:
通过
git fetch
拉取代码的过程:先读取.git/config
文件里面的配置[remote <remote-name>]
,将里面的所有(因为fetch
并没有指定其中一个或多个远程仓库)远程名称对应仓库的分支下载到本地,并放在.git/refs/remotes/<remote-name>/
目录下。比如
git fetch origin main
会创建或更新.git/refs/remotes/origin/main
的文件,此时通过git branch -r
就能看到一个origin/main
的分支。但注意,我们使用的时候还是用origin/main
而不是remotes/origin/main
哦。有时候,我们可能会通过
git diff
命令来对比本地分支与远程分支的一些信息,才决定要不要合并。比如,git diff main origin/main
。通过
git merge
或git rebase
来进行分支合并。比如git merge origin/main
,表示将远程分支origin/main
合并至本地分支main
中。
也可以直接使用 git pull
命令,其实包括了 git fetch
和 git merge
两个过程。请注意 git fetch
并不会修改「本地分支」的代码。
细心的同学可能会发现,refs/remotes/origin/
目录下,相应的分支文件记录的只是一个 Commit-ID
(SHA-1),比较特殊的是 HEAD
文件(即 origin/HEAD
分支)记录的是 ref: refs/remotes/origin/main
的东西,它始终指向默认远程分支。
四、git 根据tag创建分支
现在主分支上有一个tag为v1.0.0,主分支的名字为master.
1.执行:git origin fetch
获得最新.
2.通过: git branch newbranch tagName 创建新分支
git branch newbranch v1.0.0.
会以tag v1.0.0创建新的分支newbranch;
3.再通过 git checkout newbranch 切换到新的分支.
git checkout newbranch
4.通过 git push origin newbranch 把本地创建的分支提交到远程仓库。
git push origin newbranch
执行完以后,远程仓库也会有新创建的分支了。
细读 Git | 让你弄懂 origin、HEAD、FETCH_HEAD 相关内容相关推荐
- git只提交一张图片_几张图让你彻底弄懂git工作流(三) ——git深入
Git深入 在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直 ...
- Cookie 从入门到进阶:一文彻底弄懂其原理以及应用
大家好,我是若川.持续组织了8个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.同时极力推荐订阅我写的<学习源码整体架构系列& ...
- 职称计算机证是继续教育的内容吗,豆腐网教你一分钟弄懂继续教育学时认定表及上传注意事项~...
原标题:豆腐网教你一分钟弄懂继续教育学时认定表及上传注意事项~ 大家好,我是豆腐网王老师,专注于南京工程师职称评审政策解读,关注我,让您轻松面对职称评审,少走弯路!!! 南京中高级职称申报已有段时间, ...
- 《繁凡的深度学习笔记》前言、目录大纲 一文让你完全弄懂深度学习所有基础(DL笔记整理系列)
<繁凡的深度学习笔记>前言.目录大纲 (DL笔记整理系列) 一文弄懂深度学习所有基础 ! 3043331995@qq.com https://fanfansann.blog.csdn.ne ...
- 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述
<繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...
- 一文让你完全弄懂逻辑回归和分类问题实战《繁凡的深度学习笔记》第 3 章 分类问题与信息论基础(上)(DL笔记整理系列)
好吧,只好拆分为上下两篇发布了>_< 终于肝出来了,今天就是除夕夜了,祝大家新快乐!^q^ <繁凡的深度学习笔记>第 3 章 分类问题与信息论基础 (上)(逻辑回归.Softm ...
- 看完弄懂,明年至少加 5K
看完弄懂,明年至少加 5K
- 彻底弄懂flex布局
目前在不考虑IE以及低端安卓机(4.3-)的兼容下,已经可以放心使用flex进行布局了.什么是flex布局以及它的好处,这里就不再赘述. 在这篇文章里,想说说flex布局的属性语法及其细节.那么网上也 ...
- 这一次,彻底弄懂 JavaScript 执行机制
本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定 ...
最新文章
- 想法2: 充电性冰袋
- STL容器之优先队列
- 中国IT运维O2O市场产值规模预测及发展策略建议报告2022年
- PyCharm安装及使用
- 第三次学JAVA再学不好就吃翔(part102)--拷贝图片
- 你的Windows Phone 手机还没有升级7.5吗?我有办法,亲身体验!
- Java中使用try-with-resource优雅的关闭io流
- Sandcastle Help File Builder(.NET帮助文档工具)的版本选择心得——支持VS2010至VS2015,高版本项目文件问题...
- 数仓4.0之即席查询
- Zynq-Linux移植学习笔记之57-国产ZYNQ PL挂载兆易创新GD25S512 flash
- idea修改回默认字体_设置 IntelliJ IDEA 主题和字体的方法
- 让机器人懂感情:表情符与深度学习
- 【JavaScript】事件绑定、事件解绑、常见事件类型、事件对象
- 快速寻找勾股数算法的实现和优化
- 【深度学习】ResNet残差网络 ResidualBlock残差块实现(pytorch) | 跟着李沐学AI笔记 | ResNet18进行猫狗分类
- 记一个外国的数据结构在线演示网站
- linux wine运行效率,Linux 使用 Wine 运行 TIM 简明教程
- TMC7300-LA:微型直流有刷电机驱动
- 云周刊】第177期:马云见证!蚂蚁金服推出全球首个区块链跨境汇款服务
- MySQL枚举类型的“八宗罪”
热门文章
- 80老翁谈人生(38):火星存在地下文明有了新证据
- C++ std::ref() 函数使用详解
- 唐僧是如何管理人才的
- 独热编码(One-Hot Encoding)介绍、代码实现应用与优缺点
- 王冠逸亮相日内瓦表展 海兰察与金刚狼打破次元壁get同框
- python file does not exist_解决python - "Worksheet range names does not exist" KeyError in openpyxl...
- HDU5661---Claris and XOR
- 自由意志与人的存在状态——贯彻生化奇兵系列的两个命题
- 办公家具厂家教你合理地布置办公家具
- 北京时间换算国际时间