使用 GitHub 远程仓库

news2024/11/18 10:33:17

使用 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.coloradmin.cn/o/1390138.html

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

相关文章

element-ui表单验证时undefined (reading ‘validate‘)

我搜索了一下&#xff0c;大部分都是说不仔细造成的&#xff0c;但是我一一对照了 1、el-form中我定义了ref&#xff0c;并且ref前面也是没有加冒号的 2、el-form中也绑定了rules&#xff0c;并且rules前面加了冒号 2、el-form-item我是加了prop的&#xff0c;并且和rules中…

程序员客栈发布《2023程序员自由职业报告》

自2020年以来&#xff0c;自由职业者的生态系统迅速繁荣&#xff0c;从而塑造了一个全新的职业发展模式。2023年&#xff0c;经济形势严峻&#xff0c;但灵活就业形式越来越流行&#xff0c;包括自由职业、远程办公和平台经济等。越来越多的人选择从事自由职业或者利用互联网平…

costmap_2d包介绍

文章目录 一. costmap_2d包介绍二. Costmap包的执行入口-- move_base中调用三. Costmap包的初始化以及维护3.1 Costmap2DROS类3.1.1 构造函数 Costmap2DROS::Costmap2DROS3.1.2 地图更新线程 Costmap2DROS::mapUpdateLoop3.1.3 地图更新 Costmap2DROS::updateMap()3.1.4 激活各…

【HuggingFace Transformer库学习笔记】基础组件学习:Datasets

基础组件——Datasets datasets基本使用 导入包 from datasets import *加载数据 datasets load_dataset("madao33/new-title-chinese") datasetsDatasetDict({train: Dataset({features: [title, content],num_rows: 5850})validation: Dataset({features: [titl…

高级定时器

本节主要介绍以下内容&#xff1a; 定时器简介 高级定时器功能框图讲解 一、定时器简介 定时器功能 &#xff1a;定时、输出比较、输入捕获、断路输入 定时器分类 &#xff1a;基本定时器、通用定时器、高级定时器 定时器资源 &#xff1a;F103有2个高级定时器、4个通…

C#编程-实现委托

实现委托 委托是可以存储对方法的引用的对象。在C#中,委托允许您动态地改变类中方法的引用。 考虑咖啡售货机的示例,它配置不同口味的咖啡,例如卡布奇诺咖啡和黑咖啡。在选择所需口味的咖啡时,售货机决定混合各种成分,例如奶粉、咖啡粉、热水、卡布奇诺咖啡粉。所有的材…

构建一个最新版本 Maven 项目

文章目录 构建一个最新版本 Maven 项目1. 所用各种软件的版本2. 踩过的坑3. 构建项目过程4. 项目打包方式 构建一个最新版本 Maven 项目 截止 2024 年 1 月 13 日&#xff0c;Apache 官网上 Maven 的最新安全版本为 3.9.6&#xff0c;下载、安装及配置方法见之前的博客&#x…

TIMESAT提取物候信息操作流程

TIMESAT提取物候信息操作流程 软件环境&#xff1a;Matlab R2014aTIMESAT3.2 数据介绍&#xff1a;MODIS A3或Q1的NVI&#xff08;NDVI&#xff09;均测试过这个流程&#xff0c;可行&#xff08;大拇指&#xff09;。 TIMESAT输入n年数据&#xff0c;提取n-1年的物候参数。通…

jmeter--4.参数化的方式

目录 1. 用户定义的变量 2. 用户参数 3. 函数助手 3.1 time获取当前时间 3.2 Random随机数 3.3 随机字符串函数 3.4 字符串变更为大写 4. CSV数据文件设置 5. 接口关联--正则和json等提取 1. 用户定义的变量 线程组->添加->配置元件->用户定义的变量 引用方…

【设计模式-06】Observer观察者模式

简要说明 事件处理模型 场景示例&#xff1a;小朋友睡醒了哭&#xff0c;饿&#xff01; 一、v1版本(披着面向对象的外衣的面向过程) /*** description: 观察者模式-v1版本(披着面向对象的外衣的面向过程)* author: flygo* time: 2022/7/18 16:57*/ public class ObserverMain…

MySQL 从零开始:05 MySQL 数据类型

文章目录 1、数值类型1.1 整形数值1.2 浮点型数值1.3 布尔值 2、日期和时间类型3、字符串类型3.1 CHAR 和 VARCHAR3.2 BINARY 和 VARBINARY3.3 BLOB 和 TEXT3.4 ENUM 类型3.5 SET 类型 4、空间数据类型5、JSON 数据类型5、JSON 数据类型 前面的讲解中已经接触到了表的创建&…

这款软件轻松解决你图片水印问题

随着数字时代的到来&#xff0c;图片已经成为我们生活中不可或缺的一部分。然而&#xff0c;很多时候&#xff0c;我们会遇到带有水印的图片&#xff0c;这不仅影响了图片的视觉效果&#xff0c;还可能遮挡了重要的内容。这时&#xff0c;一款专业的去水印工具就显得尤为重要。…

博途PLC增量式PID和脉冲轴组合控制阀门开度(算法介绍)

这篇博客我们以S7-1200PLC平台来举例,介绍我们的PID闭环控制器如何控制脉冲轴实现阀门角度控制。SMART PLC PID控制器控制伺服驱动器实现关节角度控制详细内容请参考下面文章: https://rxxw-control.blog.csdn.net/article/details/129658364https://rxxw-control.blog.csdn…

Python基础语法(中)—— python列表、字符串、函数

文章目录 5. python中的列表5.1 列表的初始化5.1.1 直接初始化5.1.2 通过append函数初始化5.1.3 通过for语句初始化列表长度和每个位置的数值 5.2访问列表元素5.3使用循环语句遍历列表5.4列表的切片操作5.5列表的复制5.6列表的运算5.7列表的常用操作5.8嵌套列表5.9列表其他小知…

【手撕C语言 第二集】初识C语言

​​ 一、变量的作用域和生命周期 作用域&#xff1a;一个变量在哪里可以使用它&#xff0c;哪里就是它的作用域。 局部变量的作用域&#xff1a;变量所在的局部范围 全局变量的作用域&#xff1a;整个工程 不管整个工程里面有多少源文件&#xff0c;都可以使用全局变量。这样…

力扣电话号码的组合

文章目录 题目说明做题思路代码实现代码解析 题目链接 题目说明 首先我们先分析一下这个题目题目中说呢先给出一个字符串这个字符串其实就是这个九键数字我们要按照要求将数字所代表的字符进行自由组合形成一个字符串并且这个字符串的长度和输入的数字字符串长度相同&#xff0…

《每天一分钟学习C语言·十二》各种指针问题

1、 int arr; int * restrict pt &arr; *pt 100; *arr 10;注&#xff1a;restrict只能修饰指针&#xff0c;被restrict修饰的指针指向一块内存后这块内存就归这个指针管理了&#xff0c;其他任何指针都不能修改这块内存的内容&#xff0c;这是一个约定&#xff0c;当…

备份和容灾讲解

备份和容灾 &#xff08;1&#xff09;容灾&#xff08;容许灾难的发生&#xff09;是一种架构方案&#xff0c;包括了很多方案&#xff0c;如下 本地高可用 双活&#xff08;特指存储&#xff0c;可以理解为两端同时对外提供服务&#xff09;&#xff1a;通过一个双写模块把…

20240115-插入删除 GetRandom O(1)

题目要求 实现 RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象。bool insert(int val) 将不存在的项目 val 插入随机集合。如果项目不存在&#xff0c;则返回 true&#xff0c;否则返回 false。bool remove(int val) 从集合中删除项目 val&#xf…

文理导航期刊投稿方式

《文理导航》杂志系国家新闻出版总署批准&#xff0c;内蒙古自治区文旅厅主管&#xff0c;内蒙古自治区北方文化研究院主办的&#xff0c;面向大中专院校、中小学教育的专业性教育刊物&#xff0c;阅读对象是关心教育事业发展的大中专院校、职业教育、中小学教育的专家、教研员…