Git学习笔记 -- 理论篇 | 来自缤纷多彩的灰

Git学习笔记 -- 理论篇 @ WHlcj | 2022-12-23T20:09:10+08:00 | 4 分钟阅读

2023.12.14更新:将该笔记分为理论和实战两篇,实战部分见Git学习笔记 – 实战篇

Git 是什么?

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency

版本控制是什么?

一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统

为什么需要版本控制?

更好地关注变更,了解每个版本的改动是什么,方便对改动的代码进行检查,预防事故发生;也能够随时切换到不同的版本,回滚误删误改的问题代码

Git与SVN

  • SVN是集中式管理系统,而Git是分布式版本控制系统。
  • SVN的版本库是集中放在中央服务器的,本地不保存代码版本,而Git每个人的电脑都是一个完整的版本库。
  • SVN需要联网才能工作,对网络带宽要求较高,而Git工作时不需要联网。

Windows的一些说明

  • Git Bash是Unix与Linux风格的命令行。
  • Git CMD是Windows风格的命令行。
  • Git GUI是图形界面的Git,不建议初学者使用,尽量先熟悉常用命令。

Git 基本理论

Git本地有四个工作区域 :

  • 工作目录(Working Directory) : 就是你平时存放代码的地方。

  • 暂存区(Stage/Index) : 用于临时存放你的改动,保存即将提交到文件列表信息。

  • 仓库区(Repository或Git Directory) : 就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。

  • 远程仓库(Remote Directory) : 托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。

Git 文件操作

文件四种状态 :

  • Untracked : 未跟踪,此文件在文件夹中,但没有加入到Git库,不参与版本控制。通过git add .命令可将其状态变为staged。

  • Unmodify : 文件已经入库,未修改,即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两种去处,如果它被修改,而变为Modified;如果使用git rm,则成为Untracked文件。

  • Modified : 文件已修改,没有进行其他操作。这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout filename则丢弃修改过,返回到unmodify状态。

  • Staged : 暂存状态,执行git commit将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为unmodify状态。执行git reset HEAD filename取消暂存,文件状态为modified。

查看文件状态 :

查看指定文件状态 :

1
git status filename

查看所有文件状态 : (untracked文件显示为红色)

1
git status

查看commit日志 :

1
git log

在untracked状态下查看修改的文件与原文件的不同 :

1
git diff filename

重要指令 :

添加所有文件到暂存区 :

1
git add .

提交暂存区中的内容到本地(-m表示提交信息) :

1
git commit -m "消息内容"

远程提交 :

1
git push

忽略文件 :

可以在项目根目录下创建.gitignore文件,并在其中添加要忽略的文件/文件夹名称。

如果是mac用户,建议第一次上传远程仓库之前都在.gitignore中加入.DS_store(系统自带的存储路径的文件)

Git 工作区创建

本地仓库搭建 :

1
git init

克隆远程仓库 :

1
git clone url

克隆远程仓库后,默认就与之产生了联系,也就是本地有.git的信息以及连接信息,后面可以直接push上传代码!如果使用的是ssh协议还需本地的SSH密钥在远程库有效。 需要注意的是,如果通过下载zip文件解压到本地是没有.git这个文件的,也就是没有关联远程库。

.git 结构

首先说明,这部分内容很抽象,且不影响实际使用,我这里只做个人能看懂的笔记,若读者想要深入学习git的结构建议自查资料。.git 文件默认情况是隐藏的,Mac 通过 ⌘ + shift + . 来显示隐藏文件夹。使用 tree .git 命令更加直观

Objects

commit / tree / blob / tag 在 git 中统一称为 Objects

  • Blob:存储文件的内容
  • Tree:存储文件的目录信息
  • Commit:存储提交信息,一个 Commit 对应唯一版本的代码

通过 Commit 寻找到 Tree –> Blob –> 文件内容

1
2
3
4
eg:
git cat-file -p commitID    # 得到treeID
git cat-file -p treeID      # 得到blobID
git cat-file -p blobID      # 查看文件内容

refs

  • Branch 一般用于开发阶段,是可以不断添加 Commit 进行迭代的
  • Tag 一般表示一个稳定版本,指向的 Commit 一般不会变更
1
git tag v0.0.1
  • Annotation Tag 是一种特殊的 Tag,可以给 Tag 提供一些额外的信息
1
git tag -a v0.0.2 -m "add feature 1"