git原理解释,windows 10 / ubuntu 24.04 安装使用 github

embedded/2024/10/25 10:26:34/

git的原理

git是赫赫有名的Linux之父Linus Torvalds从2005年起开发的文件版本管理系统,掌控Linux内核这样一个最为重量级的世界产品的Linus为什么要开发这个东西呢?因为Linux系统由全世界的程序员协作维护,对源代码文件的版本控制管理的需求超过了任何一个软件项目,因此Linus才会为此发力。

git以前的文件版本管理软件大多为集中管理式,即完整的文件历史记录只存在于服务器,其它用户只获取自己当前工作需要的那一小部分内容,这样产生的问题就是一旦服务器不可连接,大家就无法协作,一旦服务器硬盘被损坏,整个文件的历史就丢失了,所以,这样的模式注定是脆弱的。

于是git应运而生,Linus的做法是,每个用户的电脑上都和服务器上一样有完整的历史记录,相当于每个用户的电脑都给服务器做了一个镜像备份,这样,即使服务器不可连接,用户也拥有完整的历史记录,如果服务器损坏,不仅不影响用户的使用,还能从用户的镜像备份中自我恢复,可以说,git是去中心化的典型,Linus不仅是伟大的程序员,更是伟大的思想家。

git为Linux内核的开发而诞生,因此它从一开始就有着极高的规格:

1. 极速

2. 简明

3. 支持并行开发(想想Linux有多少个发行版)

4. 分布式(每个用户都有完整的历史记录镜像)

5. 支持超大规模的项目(比Linux内核更大的项目也不多了吧)

git在文件管理技术上的革新是将以往的差异存储(delta)改为拍照存储(snapshot),也就是说,git以前的文件版本管理系统是保存每个文件的变化量,以此为基础来合成各个时期的文件版本,而git没有存储文件的变化量,它存储的是文件发生变化时的整体拍照,也就是用更多的存储空间获得更快的使用效率。一个是穷人思维,一个是富人思维,穷人总是舍不得丢弃旧东西,把时间花在修补缝合上,富人是只要出了新品那就买全新的,节省时间。这里的哲学是,如果一系列的操作被频繁地使用来产生某个固定的结果,那么,这个固定的结果就应该被缓存起来,以避免不断重复的操作所消耗的时间,因为时间永远都比任何其它的东西贵重,只要能缩短需要的时间,人类会为此付出任何代价。

git使用SHA-1算法来验证文件的内容和目录的结构,此算法产生的校验和(checksum)被git十分看重,git的数据库存储了所有的文件内容和目录结构的校验和,以此来确保文件内容和目录结构不被篡改。这其实就是区块链的做法,git从2005年诞生起就采用了这样的做法,从技术架构上来看,区块链引发的第三次信息技术革命的始祖其实是git

因为git在本机保存有完整的文件历史镜像,与服务器的内容一样,因此我们绝大多数时候都只需要在本机操作,只在一切完成妥当以后,将本地的镜像与服务器同步。

我们用 git init 命令创建一个git仓库,它会创建一个名为 .git 的隐藏文件夹,里面存放的东西主要是以下两部分内容:

1. 完整的文件历史镜像,也叫 本地repository,这就是正式的文件仓库,存放的是已经提交的(commit)文件。

2. staged区,这里存放的是准备提交到repository的文件的快照,我们用 git add <a_file> 命令的时候,就是将 a_file 的内容拷贝到了 .git 的 staged 区,拷贝完毕以后我们可以接着修改 a_file 的内容而不会影响已经存放在staged区的 a_file 的快照内容。

要了解git的运作原理,首先要了解文件存放的位置有以下4个区域:

1. 工作区 workspace, 就是我们平常修改文件的地方。

2. 缓存区 staged,位于本地.git隐藏文件夹中, 就是我们修改一个文件到了一个比较好的状态,就将这个状态的文件通过git add命令拷贝到缓存区存储起来,然后继续在工作区编辑文件,而不会影响缓存区中状态较好的文件。

3. 本地repo,位于本地.git隐藏文件夹中,就是一次工作结束以后,用git commit命令将所有缓存区中的文件提交给git repo保存,git repo就是由一次又一次的commit组成的。

4. 远程repo, 它和本地repo是镜像,互为备份,不断相互同步,我们在本地repo有了新的commit以后,通过git push命令将本地repo的新commit内容同步到远程repo,通过git fetch/pull将远程repo的新内容获取到本地repo.

git的使用流程通常如下:

1. 在工作区修改文件,到了一个满意的程度时,将它add到staged区,使用 git add <a_file> 命令。

2. 将所有需要提交到repository的文件都add到staged区以后,用git commit命令将它们提交到本地repository. 

3. 用git push命令将本地repository的新内容同步到服务器的repository. 

创建账号、access token和repository

首先在github>github注册账号

创建一个repository,比如 https://github>github.com/SiJinmin/buda

生成access token

现在github>github用git push上传文件的时候不能用用户名+密码的方式授权,要用 access token的方式授权,因此我们要先在github>github上生成access token。

点击github>github网站上右上角的头像,选择settings,

选择左边底部的developer settings,

点击左边personal access tokens下面的tokens(classic),

点击generate a personal access token

1. note 下填写 linux git push

2. expiration 选择 no expiration

3. select scopes: 只需要勾上 repo下面的public_pro即可,其它的都不用勾

点击generate token按钮,及时保存好它,仅此一面之缘。

Windows 10 下载安装git

Git - Downloading Package

https://github>github.com/git-for-windows/git/releases/download/v2.45.2.windows.1/Git-2.45.2-64-bit.exe

安装过程中,除了以下2步,其它步骤使用默认选项

choosing the default editor: visual studio code

configuring the line ending conversions: checkout as-is, commit as-is

安装完毕以后从开始菜单中将git bash固定到任务栏,打开git bash, 即为git的命令行界面。

Ubuntu 24.04 安装git

# sudo apt install git

使用git的常用操作 (Windows和Linux相同)

全局注册

1. 在git的命令行中注册github>github账号

# git config --global user.email "jinmin.si@outlook.com"
# git config --global user.name "SiJinmin"

2. 设置运行 git init 命令时默认的 branch 名称

git config --global init.defaultBranch main

3. 设置rebase=true

git config --global pull.rebase true

git pull时,如果有其它人在本地repo的新commit之前已发布commit,rebase=true会令git自动对这些并行发生的commit进行线性排列,自动push本地repo的commit到远程repo,免除merge提示。

4. 查看注册的信息是否正确

git config --list

初始化本地repo

初始化一个本地git repository的两种方法,一种是git clone, 另一种是git init。

1. git clone: 将远程repository拷贝到本地,且自动拷贝最新版文件到workspace (不支持断点续传)

# cd /d/code

# git clone https://github>github.com/SiJinmin/buda

git clone 虽然是进行项目初始化的最简单方法,但在国内对github>github使用git clone命令时很慢且容易断线,不能断点续传,因此有时候我们可能需要使用下面的第二种方法进行项目的初始化。

2. git init: 为本地常规文件夹添加 git repo (支持断点续传)

# cd /d/code && mkdir buda && cd buda

创建 .gitignore 文件用来设置不需要上传的本地文件,比如node_modules。

# git init

# git remote add origin https://github>github.com/SiJinmin/buda

# git fetch

# git checkout main

git fetch/pull 命令支持断点续传。

修改文件、查看状态

在本地文件夹 /d/code/buda 中增删改文件,查看文件的修改状态、目前所在的 branch

# git status

上传到github>github

# cd /d/code/buda

# git add -A && git commit -m "init files" && git push

查看修改内容

# git diff

保存密码,免密git push

初次上传时会提示输入密码,如果想要后续的git push不再需要输入密码,可以使用下面的命令保存输入的密码

3600000表示每1000个小时以后需要重新输入密码。

git config --global credential.helper cache  

# git config --global credential.helper 'cache --timeout=3600000'

运行上述的命令后git push,输入一次用户名和密码,就会被保存下来。

查看提交历史

1. 查看最近的10次提交

# git log --stat -10

2. 查看提交的详细信息

# git log -p

操作远程repo

1. 查看远程repo

# git remote -v

git remote show <remote>

例如:git remote show origin

2. 添加远程repo

# git remote add short_name url

例如: # git remote origin https://github>github.com/SiJinmin/buda

3. 重命名远程repo

# git remote rename <old_short_name>  <new_short_name>

4. 删除远程repo

# git remote remove <short_name>

5. 通过远程repo的short_name来获取内容

# git fetch short_name

6. 将本地repo的内容分享到远程repo

git push <remote> <branch>

例如:git push origin main

参考资料

Git - Book

Github断点续传(git clone 经常失败)_git clone断点续传-CSDN博客

https://www.cnblogs.com/upstudy/p/15870787.html

https://juejin.cn/post/6844903830195273736

【已解决】fatal: Authentication failed for ‘https://github>github.com/.../‘-CSDN博客

如何让Git记住你的GitHub Token,避免每次都要重复输入?-腾讯云开发者社区-腾讯云


http://www.ppmy.cn/embedded/50288.html

相关文章

【高等数学】第一章习题:函数、极限与函数连续性

文章目录 一. 题型与解题方法1. 题型2. 求极限2.1. 常见等价无穷小2.2. 利用基本极限2.3. 极限的有理运算法则2.4. 洛必达2.5. 利用泰勒公式 二. 习题1. 函数间断点的考察3. 极限 一. 题型与解题方法 1. 题型 题型函数- 函数有界性、单调性及其奇偶性的判定- 复合函数极限- 无…

【C语言】解决C语言报错:Uninitialized Variable

文章目录 简介什么是Uninitialized VariableUninitialized Variable的常见原因如何检测和调试Uninitialized Variable解决Uninitialized Variable的最佳实践详细实例解析示例1&#xff1a;局部变量未初始化示例2&#xff1a;数组未初始化示例3&#xff1a;指针未初始化示例4&am…

Flink 命令行提交、展示和取消作业

Apache Flink 是一个流处理和批处理的开源框架&#xff0c;用于在分布式环境中执行无边界和有边界的数据流。你可以使用 Flink 的命令行界面&#xff08;CLI&#xff09;来提交、展示和取消作业。 提交作业 使用 Flink CLI 提交作业的命令格式通常如下&#xff1a; ./bin/fl…

C#中数组ProtoBuf使用问题

使用 C# 类库 Google.Protobuf 包&#xff0c;进行协议定义&#xff0c;当给数组属性赋值默认值时&#xff0c;出现反序列化以后&#xff0c;数组长度翻倍&#xff0c;多的一部分在最前面&#xff0c;而且都是数组元素的默认值 Code: // 类定义 [ProtoContract] public class…

Redis内存数据库

Redis是一个开源的内存数据库&#xff0c;它可以用作缓存、数据库和消息中间件。Redis支持多种数据结构&#xff0c;包括字符串、哈希表、列表、集合、有序集合等&#xff0c;这使得它非常灵活且适用于多种用途。 以下是关于Redis的一些重要特点和功能&#xff1a; 内存存储&a…

Nginx负载均衡之动态更新upstream

Nginx 的配置是启动时一次性加载到内存中的&#xff0c;在实际的使用中&#xff0c;对 Nginx 服务器上游服务器组中节点的添加或移除仍需要重启或热加载 Nginx 进程。在 Nginx 的商业版本中&#xff0c;提供了 ngx_http_api_module 模块&#xff0c;可以通过 API 动态添加或移除…

【C++】内存管理

内存管理整理 1 释放内存 在C中&#xff0c;delete操作符的底层实现并不直接调用C语言中的free函数。尽管它们的目的都是为了释放动态分配的内存&#xff0c;但delete在C中有更多的语义和复杂性&#xff0c;因为它涉及到调用对象的析构函数。 以下是delete操作符在C中大致的…

dvadmin 调试问题

链接&#xff1a;django-vue3-admin: django-vue3-admin 是一套全部开源的快速开发平台&#xff0c;毫无保留给个人免费使用、团体授权使用。 django-vue3-admin 基于RBAC模型的权限控制的一整套基础开发平台&#xff0c;权限粒度达到列级别&#xff0c;前后端分离&#xff0c;…