Git学习笔记 #1 基础知识介绍

本文最后更新于:2022年5月19日 中午

无意中发现了清华贵系科协的暑培项目,内容都十分贴合计算机系学生的学习需求,正好下学期有「软件工程」课,就决定先把 Git 入门了。

本文大部分内容参考了 RCY 同学的教程,部分参考了 廖雪峰教程-Git菜鸟教程-Git,以及 Git 官网文档 Git-Documentation

版本控制软件

版本控制是合作开发、工程项目中必要的手段,考虑以下情况:

  • 需求模糊:不得不准备两种方案。
  • 伟大尝试:如果尝试失败,可以回到旧的版本。
  • 组员弃坑:删除掉难以开发的代码。
  • 并行开发:需要合并代码时,人工比对容易遗漏。

为了让这样繁琐的工作自动化,就有了以下的工具:

  • Git:行业内最为流行的版本控制软件,采用分布式
  • SVN(Subversion):较早期的版本控制软件,采用集中式

关于 Git

事实上,Git 仅在过去十年里,就以极快地速度占据了市场。与 SVN 的集中式不同的是,Git 采用的分布式,除了少数的交互步骤外,版本控制操作、历史记录都在本地,这保证了它极高的操作效率。

所谓集中式, 即所有人都把代码放到一个远程的服务器,要写代码时将远程资源拉取到本地,用一个同一的仓库来实现协同。

所谓分布式,即每个人都有自己的仓库,每个仓库都可能存放着最新的代码,需要修改时直接在本地修改(即使断网),需要同步时再与远程仓库交互。

模式

多数版本控制软件是基于差异的控制,即不同版本间记录的是文本的「变化」,版本切换时再根据 delta 前进和后退。

Delta-based

而 Git 采用的是「快照」的方法,对每个版本记录全部文件快照并建立索引(特别地,没有变动的文件只是创建一个链接指向之前的快照)。

Snapshot-based

这样做的好处是,Git 切换版本和分支的速度远快于第一种模式。因为 Delta-based 模式下,切换版本相当于一个线性遍历的过程,而 Git 相当于是在文件系统层面做了一个哈希索引。

此外,快照并不是以整个文件为单位的,否则修改一行就需要增量整个文件的大小,在 Git 中是以为单位进行 diff 的。因此对于二进制文件,Git 的功能就相对较差。

基本状态

Git 中用三个状态来区分文件,生成版本:

  • 已修改 (modified):你的文件修改了,但是没和 Git 发生关系,如同没有 Git 存在⼀般。
  • 已暂存 (staged):已修改文件被标记后的状态,下次提交 (commit) 时将为它生成快照,多数情况下处于暂存态后紧接着便被提交。
  • 已提交 (committed):已经安全地保存到本地数据库的数据,通常来说不手动清理则不会丢失。

这三个状态对应到了 Git 的三个区域:工作区、暂存区、Git 仓库:

三个区域

如果修改了一个已暂存的文件,它会同时出现在工作区和暂存区两个区域,此时可以选择再次暂存,覆盖掉暂存区的文件;也可以选择恢复工作,撤销后来的修改,覆盖掉工作区的文件(但暂存区的仍然保留)。

因此,我们可以对这三个区域加以定义:

  • 工作区是可以直接看到的文件,包括已修改和未修改;
  • 暂存区本身是个文件,记录了下次要提交(快照)的文件列表信息;
  • Git 仓库包含了数据库、元数据等,是 Git 最重要的部分,它的全部数据存储在项目根目录的 .git 路径下,其大小甚至会超过其他文件之和。

使用 Git

在官网的文档中有详细的介绍,这里仅介绍部分常用内容。

命令行界面

Git 同时提供了 GUI 和 Bash 的操作方式,但图形界面功能不够齐全,同时容易误触造成无法逆转的文件改动。

使用命令行界面 (Command Line Interface) 意味着:

  • 几乎放弃鼠标功效,最大化键盘作用;
  • 放弃炫酷的界面显示,用文本配合着色传递信息;
  • 你所学的操作到了服务器上仍然能流畅使用。

对 Windows 而言,cmd 、Power Shell、WSL、Git 都可以提供命令行界面,为了执行下列 Git 指令,需要使用 Git 提供的终端,在文件夹中右键选中 Git Bash Here 即可。

关于命令行界面,有这些常用快捷键:

  • Tab:实现对命令、参数或文件的内容补全。

  • Ctrl+C:终止当前进程的运行,重获终端的控制权。

  • Ctrl+D:结束键盘输入,即退出终端,相当于输入 exit()

  • Ctrl+I:清空当前终端中已有的内容,相当于输入 clear

  • <上下键>:翻看使用过的命令记录。

  • Shift+PgUp/PgDn:翻页终端。

  • Ctrl/Shift+Ins :复制粘贴文本,有的系统下可用 Ctrl+Shift+C/V

  • ‘’“”:命令是以空格来作为间隔符的,参数中若存在空格,必须用引号括起来。

一些在 Git 使用中会用到的 Shell 命令有:

  • ls:List,罗列当前文件夹下的文件和下级文件夹,并且会用颜色区分二者,如果用 dir 目录命令则无区分。
  • cd:Change Directory,改变目录,这里再介绍一下路径的表示:
    • . 代表当前目录,也可代表当前目录下所有文件。
    • .. 代表上级目录,cd .. 即回退上级。
    • / 代表盘符根目录,cd / 即切换到根目录。
    • 输入当前目录下的文件夹名,即可进入该文件夹,可以用 Tab 补全。
  • mkdir:Make Directory,在当前目录下新建文件夹
  • touch新建空文件或改变已有文件的时间戳属性。
  • echo:Echo Protocol(应答协议),强制显示文字,直接使用会将字符串显示在终端。
    • 利用该命令也可新建文件,如:echo ‘test’ > 1.txt,强制输出内容到一个记事本文件,如果没有该文件则强制创建一个。
    • 此外,新建文件还可以用其他重定向命令辅助完成,如cd . > 1.txttype NUL > 1.txtcopy NUL > 1.txt

Git 基本指令

这里先列举一些基本指令,它们的使用格式基本都是 git <instruction> <other-params-if-needed> 。以下列举的都是 <instruction> 项,对应的参数在后面介绍。

本地基本操作:

  • init:告诉 Git 你要让它接管这个文件夹。
  • config:做相关配置,告诉 Git 你是谁。
  • add:文件从工作区转到暂存区,即「跟踪」。
  • commit:文件从暂存区转到 Git 仓库,即「提交」。

远程基本操作:

  • clone:克隆远程仓库到本地。
  • push:本地数据库同步到远程,即「推送」。
  • pull:远程数据库同步到本地,即「拉取」。

分支操作:

  • branch:分支基本操作。
  • checkout:分支、版本的切换。

状态切换:

  • stash:⼀个栈式额外存储区。
  • reset:版本回退。

信息获取:

  • log:查看记录。
  • reflog:查看操作记录(常用于 reset 后撤销操作时寻找版本号)
  • status:查看已修改已暂存的文件。
  • diff:查看不同 区/版本 间的差异。

Git学习笔记 #1 基础知识介绍
https://hwcoder.top/Git-Note-1
作者
Wei He
发布于
2021年8月28日
许可协议