Git学习笔记 #1 基础知识介绍
本文最后更新于:2022年5月19日 中午
无意中发现了清华贵系科协的暑培项目,内容都十分贴合计算机系学生的学习需求,正好下学期有「软件工程」课,就决定先把 Git 入门了。
本文大部分内容参考了 RCY 同学的教程,部分参考了 廖雪峰教程-Git,菜鸟教程-Git,以及 Git 官网文档 Git-Documentation。
版本控制软件
版本控制是合作开发、工程项目中必要的手段,考虑以下情况:
- 需求模糊:不得不准备两种方案。
- 伟大尝试:如果尝试失败,可以回到旧的版本。
- 组员弃坑:删除掉难以开发的代码。
- 并行开发:需要合并代码时,人工比对容易遗漏。
为了让这样繁琐的工作自动化,就有了以下的工具:
- Git:行业内最为流行的版本控制软件,采用分布式。
- SVN(Subversion):较早期的版本控制软件,采用集中式。
关于 Git
事实上,Git 仅在过去十年里,就以极快地速度占据了市场。与 SVN 的集中式不同的是,Git 采用的分布式,除了少数的交互步骤外,版本控制操作、历史记录都在本地,这保证了它极高的操作效率。
所谓集中式, 即所有人都把代码放到一个远程的服务器,要写代码时将远程资源拉取到本地,用一个同一的仓库来实现协同。
所谓分布式,即每个人都有自己的仓库,每个仓库都可能存放着最新的代码,需要修改时直接在本地修改(即使断网),需要同步时再与远程仓库交互。
模式
多数版本控制软件是基于差异的控制,即不同版本间记录的是文本的「变化」,版本切换时再根据 delta 前进和后退。
而 Git 采用的是「快照」的方法,对每个版本记录全部文件快照并建立索引(特别地,没有变动的文件只是创建一个链接指向之前的快照)。
这样做的好处是,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.txt
,type NUL > 1.txt
,copy 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
:查看不同 区/版本 间的差异。