Git常用操作与深入理解

摘要:学习Git的基本用法,发掘内部原理,理解与GitHub的关联流程,以及优雅地解决连接GitHub失败的问题

一、Git本地操作与内部原理

1. init、add、commit背后的原理

  1. git init :拿到一个新文件夹,希望将其交给git管理,在该目录下执行init,创建一个.git文件夹,里面即存储文件及对应版本信息
  2. git add xxx.txt:将一个txt文件纳入当前版本的管控之下。git会计算该文件的SHA1值做该文件及该版本的唯一身份证,当修改该文件后,这个SHA1值就变更了,对git来说就是一个新文件。
  3. git commit:首先将当前版本的所有文件的目录结构做一个快照,记录每个文件的权限、文件名、SHA1值等;然后新建一个commit节点指向该快照,这个节点记录了本次提交的信息(快照的SHA1值)、上次commit的信息(便于回溯)、备注等。

本质上git仓库就是一个key-value的数据库加上默克尔树形成的有向无环图(DAG)

可视化:这才是真正的Git——Git内部原理揭秘!

图解Git (marklodato.github.io)

2. 操作指南

Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)

二、关联远程仓库GitHub

1. 关联远程仓库

git和GitHub是两回事,git是本地版本控制软件,GitHub是远程版本控制仓库。通俗理解就是,git安装在本地,权力范围只有本地被初始化git的文件夹,而GitHub存在在云端(且往往是分布式,可能在存在在好几个人的电脑上),只是个任人进出的仓库。

先本地创建仓库,再关联到云端

  • 准备好本地仓库,在某个文件夹下执行git init
  • 准备好远程仓库,在GitHub上新建一个仓库
  • 执行同步命令git remote add origin git@github.com:CZX-Yui/xxxx.git ,现在以及建立起本地文件夹和远程GitHub仓库的联系了
    • 远程库的名字就是origin,这是git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
  • 之后每次有文件更新,用git push origin main将本地更新同步到远程仓库
    • main是远程分支的名称

云端已有仓库,拉取到本地

  • 找到云端仓库的SSH链接
  • 在本地文件夹下执行git clone ssh://xxxx

远程仓库 - 廖雪峰的官方网站 (liaoxuefeng.com)

2. GitHub通信方式及断网问题总结

省流

  • 常见连不上报错(连不上server、超时等等),大概率都是因为采用HTTP协议连接远程仓库,如clone仓库时目标仓库地址是http打头、链接远程库时地址也是http打头等等
  • 一种解决策略是设置代理,但不是很稳定,建议用下面的方法
  • 另一种解决策略是花点时间配置SSH。养成好习惯,每次涉及到使用GitHub链接时都写成SSH形式。

原理分析

  • 在使用过程中,除了好几个与git管理版本相关的命令让人摸不着头脑外(主要是不太理解背后的原理),最让人头疼的就是本地git连接远程GitHub仓库频频报错的问题了(感谢防火墙)。

  • 为了彻底解决这个问题,还得从背后原理上搞明白。首先得明确访问远程Github仓库的几种通信协议:HTTPS和SSH。

    • HTTP/HTTPS是最基本的通信方式,方便快捷,不管收端是谁、在哪,只要能拿到发端的http链接,就能直接访问,因此也容易受到墙的限制,而SSH相比HTTP多加了一层“保护壳”,会在收发端通信的过程中自动加密和解密,这种安全传输(“隧道”)允许穿过防火墙,但是其灵活性较差,收端和发端固定只有那两个设备/地址。简单来说,举个例子,通过HTTP方式clone仓库可以在任意设备上克隆任意地址的仓库,而通过SSH方式只能在配置了密钥的两台设备间clone/push仓库。SSH的优势就在于连接稳定、push的时候不需要每次输入密码来证明我是该用户。

    • 网上一种说法“使用SSH的URL克隆的话,你必须是这个项目的拥有者“,这种表述不完全正确,对于GitHub上的公开库,你可能不是该项目的拥有者或管理员,但当你配置好本机和GitHub的SSH连接后,你依然可以通过SSH来clone所有的GitHub公开库。

SSH Tunnel绕过防火墙穿透内网 - 知乎 (zhihu.com)

配置HTTP代理(不推荐)

  • 首先得配置好梯子,查看本机梯子http走的端口

  • 使用下述命令配置全局代理

    1
    git config --global http.proxy http://127.0.0.1:7890

一文让你了解如何为 Git 设置代理 - Eric (ericclose.github.io)

配置SSH(推荐)

  • 本机查看私钥和公钥
  • 将公钥复制一份到GitHub的个人账号下

Github配置ssh key的步骤(大白话+包含原理解释)

设置代理解决github被墙 - 知乎 (zhihu.com)

三、Demo实践

抽空复习试一试,顺便做一下常用命令总结


Git常用操作与深入理解
https://github.com/CZX-Yui/2023/04/04/Git常用操作与深入理解/
Author
CZX-Yui
Posted on
April 4, 2023
Licensed under