使用 GitHub 远程仓库

使用 GitHub 远程仓库

GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心。 大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。本篇文章主要带大家上手 GitHub 最基本的使用方式。

创建 Git 仓库

先登入 GitHub,再进入 GitHub 首页: https://github.com

点选右上角的使用者名称进入个人首页:

在这里插入图片描述

切换到 Repositories 后点击 New 按钮填写仓库名即可创建一个仓库:

在这里插入图片描述

在创建好后,我们就可以复制这个远程仓库地址,使用 git clone 命令把远程仓库下载到本地。

git clone 命令
将远程仓库复制到本地,并建立工作目录与本地仓库 (就是 .git 文件夹)

如果我们在创建的时候没有勾选 Initialize this repository with a README,那么创建出来是一个空仓库。

Github 中也有相关的提示:

在这里插入图片描述

远程仓库的添加

前面 创建 Git 仓库 部分我们只提到通过 clone 命令把远程空仓库下载到本地。那如果我们想要把本地的仓库与远程仓库建立关联呢?

比如说我们有个 localDemo 这个本地仓库,想要与远程的 https://github.com/dralexsander/remoteDemo.git 仓库建立关联,可以直接使用下面的命令:

git remote add origin https://github.com/dralexsander/remoteDemo.git

在这里插入图片描述

从上图可以看到执行完命令后没有任何输出,但其实它修改了 .git/config 这个文件。

在这里插入图片描述

多了一个 [remote “origin”] 的配置,这个 origin 的意思就是远程仓库的名字(就是我们通过 git remote add origin xxx 给 remoteDemo 这个远程仓库定义的名字,当然也可以改成 git remote add remoteDemo xxx)。url 就是这个远程仓库的地址,fetch 就是本地分支与本地追踪分支的对应关系,refs/heads 里存储本地分支,refs/remotes/origin 存储本地追踪分支。

事实上在我们的本地仓库中,可以建立多个远程仓库的关联。

比如说在我们当前本地仓库 remoteDemo 中,关联多一个 axios 的远程仓库,通过 git remote -v 命令可以查看目前在「工作目录」里的远程仓库信息

git remote add axios https://github.com/axios/axios.git

在这里插入图片描述

在 .git/config 文件中也多了 axios 远程仓库的配置:

在这里插入图片描述

不过,通常我们关联多个远程仓库的机会并不多,因此稍加了解顺便理解一下 origin 只是一个远程仓库的参照名称即可。

远程分支

我们先创建一个非空仓库,然后使用 git clone 命令将远程仓库复制到本地,深入看一下发生了什么。

在这里插入图片描述
在这里插入图片描述

Git 会自动帮我们配置好.git/config 文件里的远程仓库信息:

在这里插入图片描述

而且最明显的是我们的本地仓库上多了一个 remotes/origin/main 分支( remotes/origin/HEAD 是远程 main 分支的指针),通过 git branch -a 命令(不带 -a 参数展示的是本地的分支, -a 可以展示全部)查看:

在这里插入图片描述

我们先前学习过关于「分支」的概念,不过仅限于「本地分支」,今天我们多出了个「远程分支」,事情就相对复杂一些。

基本上,当我们的版本控制流程加上了远程仓库之后,原本的分支就可以被拆成四种不同的概念:

  1. 远程追踪分支

这个分支位于远程,目的是用来追踪分支的变化情形。通常远程分支我们是获取不到的。

  1. 本地追踪分支

当我们执行 git clone 复制一个远程仓库后,所有远程追踪分支会被下载回来,并且相对应的建立起一个同名的本地追踪分支。本地追踪分支反映了远程仓库在我们最后一次与它通信时的状态。

也就是这张图里的:

在这里插入图片描述

红色部分的 remotes/origin/main 就是本地追踪分支,remotes 标识是远程的意思,而 origin/ 是一种命名规范,main 就是分支名称,远程仓库的名称就是 origin(origin 是在 Git 版本控制中惯用的预设远程分支的参照名称)。

远程分支有一个命名规范 —— 它们的格式是:

<remote name>/<branch name>

  1. 本地分支

在执行 git branch 命令后所显示的分支,就是所谓的「本地分支」,这些分支存在于本地,而这些分支又常被称为 主题分支 (Topic Branch) 或 开发分支 (Development Branch),就是因为这些分支不会被推送到远程仓库,主要用来做开发用途。

  1. 远程分支

顾名思义,远程分支就是在远程仓库中的分支,如此而已。如果我们用 GitHub 的话,我们是无法存取远程分支的。

虽然说「概念上」可以分为这四类,但其实这些分支就只是参照名称而已,而前面提到的「本地追踪分支」主要就是用来跟远程的分支做对应,我们不应该直接在这些分支上建立版本 (虽然我们还是可以这么做,但强烈不建议乱搞),而是把这些「本地追踪分支」视为是一种只读的分支。

分支推送

clone 项目

经过前面的学习,我们知道在 clone 一个新的 Git 仓库时,都会有一个预设 main 分支。实际上,这个分支通常用来当作目前系统的「稳定版本」,也就是这个版本必须是干净且高品质的原始码版本。所以,我们会要求所有人都不要用这个分支来建立任何版本,真正要建立版本时,一定会通过「合并」的方式来进行操作,以确保版本能够更容易被追踪。

在开发阶段,我们通常会从 main 分支中新建一个分支用来开发:

git checkout -b dev

在这里插入图片描述

此时我们新建分支并未跟远程仓库建立起任何关联,Git 可能不知道我们到底想推送到哪里(可能存在多个远程仓库),我们直接执行 git push 命令的话 Git 就会提示错误,所以我们要另外定义本地分支与远程仓库之间的关系。

在这里插入图片描述

要将本地分支起跟远程仓库的建立起对应关系,只要在 git push 的时候加上 --set-upstream 参数,即可将本地分支注册进 .git/config 文件中,之后就能用 git push 就可以顺利的推送上去。

在这里插入图片描述

.git/config 文件:

在这里插入图片描述

上图中的 remote 和 merge 所代表的意思是:「当我们想要将本地的 dev 分支推送到远程仓库时,预设的远程仓库为 origin 这个(因为可以关联多个远程仓库,因此需要指定),然后推送的时候要将本次的变更合并到 merge 字段对应这个远程分支里。

我们在一开始执行 git clone 的时候,Git 就会预设帮我们建立好 main 分支的对应关系,所以针对 main 分支进行操作时,不需要额外加上 --set-upstream 就能使用。

本地关联项目

如果我们是直接本地仓库与远程仓库建立关联的,这个时候情况可能不一样。

我们用回之前的 remoteDemo 示例,前面我们只介绍了如何与远程仓库建立关联(git remote add),如果此时我们执行 git branch -a 命令查看分支,可以发现并不存在本地追踪分支,这是因为远程仓库是空的,根本不存在任何分支:

在这里插入图片描述

此时我们就需要执行 git push --set-upstream origin master 命令来建立与远程仓库的分支关联:

在这里插入图片描述

我们来详细说明一下这个打印:

在执行 push 命令时会扫描 .git/objects 目录,也就是之前我们之前文章中提到的 Git 的对象,然后把这些对象放入到远程仓库中(同步版本)。但是由于远程仓库的空的,因此也创建了一个 master 分支并在本地设置了一个追踪分支。

我们查看 .git/refs 目录就可以看到新建了一个 remotes 目录,里面的内容就是本地追踪分支。

在这里插入图片描述

这时候在执行 git branch -a 命令就会发现存在红色的 remotes/origin/master 分支了:

在这里插入图片描述

此时本地分支与本地追踪分支都是同步的,我们可以通过 git log 命令来查看:

在这里插入图片描述

代码拉取

这部分需要结合前面 远程分支 部分一起讲解,我们在 clone 一个远程仓库后,所有远程追踪分支会被下载回来,并且相对应的建立起一个同名的本地追踪分支。如果远程仓库更新了几个版本后,我们的本地追踪分支相较于远程仓库其实就落后了几个版本,此时我们就要更新本地追踪分支的状态。

fetch

git fetch 命令完成了仅有的但是很重要的两步:

  • 从远程仓库下载本地仓库中缺失的提交记录
  • 更新本地追踪分支指针(如 remote/origin/main )

git fetch 实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态。

前面我们说过的,本地追踪分支反映了远程仓库在我们最后一次与它通信时的状态,git fetch 就是我们与远程仓库通信的方式!

我们用一个可视化来更好理解 fetch 命令:

在这里插入图片描述

我们一开始 clone 项目后分支状态类似上面这张图,此时我们在远程仓库中提交一个版本后在本地仓库中执行 git fetch 命令。
在这里插入图片描述

可以看到只有本地追踪分支( remote/origin/main )才更新了状态,本地的 main 分支并没有更新,如果我们需要更新本地 main 分支,需要手动使用 git merge 命令去合并本地追踪分支( remote/origin/main )。

示例

概念理解了我们来看一下示例:

在这里插入图片描述

本地分支与本地追踪分支都是同步的(最新「commit 对象」的 hash 值为 bcbe312…),此时我们在远程仓库中提交一次 commit:

在这里插入图片描述

远程仓库最新的 commit hash 值为 62ed650。

我们执行 git fetch 命令更新本地追踪分支:

在这里插入图片描述

此时 remotes/origin/master 领先 master 分支一个提交,我们切换到 remotes/origin/master 分支查看提交日志能更清楚的看到差异:

在这里插入图片描述

在这种情况我们就需要执行 git merge remotes/origin/master 命令来更新 master 分支:

在这里插入图片描述

pull

git pull 就是 git fetch 和 git merge 的缩写,会自动帮我们更新本地追踪分支和本地分支。

在这里插入图片描述

在这篇文章里只简单介绍一下 fetch、pull 的操作,后续我们会详细介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模型Model:文件系统模型QFileSystemModel

一、 1、常用函数 QFileSystemModel自带目录变化监听 1)、 QModelIndex setRootPath(const QString &path); 设置检索根目录 2)、 bool isDir(const QModelIndex &index) const; 选中索引是否为目录节点 3)、 QString filePath(const QModelIndex &index) const;…

【分布式技术】分布式存储ceph之RBD块存储部署

目录 创建 Ceph 块存储系统 RBD 接口 服务端操作 1、创建一个名为 rbd-demo 的专门用于 RBD 的存储池 2、将存储池转换为 RBD 模式 3、初始化存储池 4、创建镜像 5、在管理节点创建并授权一个用户可访问指定的 RBD 存储池 6、修改RBD镜像特性&#xff0c;CentOS7默认情…

Databend 开源周报第 128 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 使用 Databend …

[Linux 进程(四)] 再谈环境变量,程序地址空间初识

文章目录 1、前言2、环境变量2.1 main函数第三个参数 -- 环境参数表2.2 本地环境变量和env中的环境变量2.3 配置文件与环境变量的全局性2.4 内建命令与常规命令2.5 环境变量相关的命令 3、程序地址空间 1、前言 上一篇我们讲了环境变量&#xff0c;如果有不明白的先读一下上一…

C++ 编程需要什么样的开发环境?

C 编程需要什么样的开发环境&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#…

网页设计-用户体验

Use Cases (用例) 用例是用户如何在网站上执行任务的书面描述&#xff0c;从用户的角度描述了系统响应请求时的行为。每个用例都是用户实现目标的一系列简单的步骤。简言之&#xff0c;用例是一种用于描述系统如何满足用户需求的方法。 用例的好处 1. 明确需求&#xff1a; Use…

Python办公自动化 – 可以解析的文件格式和可以调用的API实现办公自动化

Python办公自动化 – 可以解析的文件格式和可以调用的API实现办公自动化 以下是往期的文章目录&#xff0c;需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处…

Unity与Android交互通信系列(4)

上篇文章我们实现了模块化调用&#xff0c;运用了模块化设计思想和简化了调用流程&#xff0c;本篇文章讲述UnityPlayerActivity类的继承和使用。 在一些深度交互场合&#xff0c;比如Activity切换、程序启动预处理等&#xff0c;这时可能会需要继承Application和UnityPlayerAc…

Windows系统字体尺寸学习

调用GetTextMetrics来获得字体尺寸信息, 函数返回设备描述表中当前选定的字体信息&#xff1b; 返回值到TEXTMETRIC类型的结构中&#xff1b; 返回字段值的单位取决于当前设备描述表映射方式&#xff1b;默认映射方式是MM_TEXT&#xff0c;值的单位是像素&#xff1b; 前7个字…

多模型图像特征可视化

特征图可视化是指将网络中某一层的特征图可视化出来&#xff0c;以便观察网络在不同层次上学到的特征。卷积可视化可以帮助深度学习研究者更好地理解卷积的概念和原理&#xff0c;从而更好地设计和优化卷积神经网络。通过可视化&#xff0c;研究者可以更清晰地看到卷积运算中的…

[SS]语义分割——基础知识

语义分割前言 一、定义 1、概念 语义分割&#xff08;Semantic Segmentation&#xff09;是计算机视觉中的一项任务&#xff0c;目标是将图像中的每个像素按其语义类别进行分类。与传统的目标检测不同&#xff0c;语义分割对图像中的每个像素都进行分类&#xff0c;而不是只…

Vue 如何把computed里的逻辑提取出来

借用一下百度的ai 项目使用&#xff1a; vue 文件引入 <sidebar-itemv-for"route in routes":key"route.menuCode":item"route":base-path"route.path"click"onColor"/>import { handleroutes } from "./handle…

牛客-寻找第K大、LeetCode215. 数组中的第K个最大元素【中等】

文章目录 前言牛客-寻找第K大、LeetCode215. 数组中的第K个最大元素【中等】题目及类型思路思路1&#xff1a;大顶堆思路2&#xff1a;快排二分随机基准点 前言 博主所有博客文件目录索引&#xff1a;博客目录索引(持续更新) 牛客-寻找第K大、LeetCode215. 数组中的第K个最大元…

C#: CRC8,CRC16,CRC32 校验代码

说明&#xff1a;CRC即循环冗余校验码&#xff08;Cyclic Redundancy Check&#xff09;&#xff1a;是数据通信领域中最常用的一种查错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&#xff09;是一种数据传输检错功能&…

统计学-R语言-5.1

文章目录 前言随机性和规律性概率变量的分布离散型--二项、泊松、几何二项分布几何分布泊松分布 连续型--均匀、正态均匀分布正态分布 其它统计分布--χ2分布、t分布、F分布χ2分布t分布F分布 练习 前言 从本篇文章开始介绍有关概率与分布的介绍。 随机性和规律性 当不能预测…

嵌入式-Stm32-江科大基于标准库的GPIO的八种模式

文章目录 一&#xff1a;GPIO输入输出原理二&#xff1a;GPIO基本结构三&#xff1a;GPIO位结构四&#xff1a;GPIO的八种模式道友&#xff1a;相信别人&#xff0c;更要一百倍地相信自己。 &#xff08;推荐先看文章&#xff1a;《 嵌入式-32单片机-GPIO推挽输出和开漏输出》…

vue-cli解决跨域

在vue.config.js中 找到devServer 在devServer中创建proxy代理 proxy:{ path&#xff08;路径中包含这个path就会导航到target的目标接口&#xff09;&#xff1a;{ target:"目标接口" } } 例&#xff1a; 1 同源策略只针对于浏览器&#xff0c;代理服务器到后端接…

操作系统课程设计-Linux 进程控制

目录 前言 1 实验题目 2 实验目的 3 实验内容 3.1 进程的创建 3.1.1 步骤 3.1.2 关键代码 3.2 子进程执行新任务 3.2.1 步骤 3.2.2 关键代码 4 实验结果与分析 4.1 进程的创建 4.2 子进程执行新任务 5 代码 5.1 进程的创建 5.2 子进程执行新任务 前言 本实验为课…

Electron+React项目打包踩坑记录

首先&#xff0c;如何打包 写下本文的时间是 2024/01/16&#xff0c;搜索了网络上 ElectronReact 的打包方式&#xff0c;中间行不通&#xff0c;本文采用的方式是记录本文时 Electron 快速入门(https://www.electronjs.org/zh/docs/latest/tutorial/quick-start)记录的打包方式…

Stream API 函数式编程 - 告别for循环,代码竟能写的如此优雅?

目录 一、Stream API 函数式编程 1.1、Stream 简介 a&#xff09;为什么引入 Stream&#xff1f;Stream 的出现就是为了让关于集合的操作更加简单&#xff1a; b&#xff09;Stream 的特性&#xff1a; c&#xff09;对stream的操作分为为两类&#xff0c;中间操作 和 结束…