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

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 隐藏文件夹所在的目录下的其它文件和文件夹叫做工作区(workspace),就是我们日常修改文件的地方。

因此,git的使用流程通常如下:

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

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

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

创建账号、access token和repository

首先在github注册账号

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

生成access token

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

点击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.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

设置第一次输入用户名和密码后保存access token,免除后续输入,36000000表示每10000个小时以后需要重新输入密码。

git config --global credential.helper cache

git config --global credential.helper 'cache --timeout=36000000'

使用git的常用操作 (windows和linux相同)

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

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

git config --global user.name "SiJinmin"

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

git config --global init.defaultBranch main

查看注册的信息是否正确

git config --list

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

  1. git clone: 将远程repository拷贝到本地 (不支持断点续传)

cd /d/code

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

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

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

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

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

git init

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

git fetch

git checkout main

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

修改文件、查看状态

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

git status

上传到github

cd /d/code/buda

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

查看修改内容

git diff

初次上传时会提示输入密码

参考资料

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.com/.../'-CSDN博客

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

相关推荐
哈里谢顿17 小时前
使用kvm创建一台虚拟机
linux
hanyi_qwe18 小时前
文本三剑客--awk
linux·运维·服务器
Caven7719 小时前
【Linux 技巧】如何在登录时自动激活 Conda Base 环境
linux·运维·conda
凌寒1119 小时前
Linux(Debian)安装、卸载 MySQL
linux·运维·mysql·debian
IT小哥哥呀19 小时前
如何从 Windows SSH 进入 VirtualBox Ubuntu 虚拟机——密码认证(逐步指南)
linux·windows·ubuntu·ssh·教程·虚拟机
XI锐真的烦19 小时前
Flutter Windows 下“Running Gradle task ‘assembleDebug‘...” 卡住一整天的终极解决办法
windows·flutter
怀旧,20 小时前
【Linux系统编程】7. 进程的概念(上)
linux·运维·服务器
7***n7520 小时前
API网关设计模式
linux·服务器·设计模式
哈里谢顿21 小时前
环境变量 HTTP_PROXY/HTTPS_PROXY 深度解析:为什么 cURL 行,Docker 不行?
linux
馨谙21 小时前
使用 systemd 用户服务管理容器:从概念到实践
linux·容器