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。
查看文件状态 :
查看指定文件状态 :
|
|
查看所有文件状态 : (untracked文件显示为红色)
|
|
查看commit日志 :
|
|
在untracked状态下查看修改的文件与原文件的不同 :
|
|
重要指令 :
添加所有文件到暂存区 :
|
|
提交暂存区中的内容到本地(-m表示提交信息) :
|
|
远程提交 :
|
|
忽略文件 :
可以在项目根目录下创建.gitignore文件,并在其中添加要忽略的文件/文件夹名称。
如果是mac用户,建议第一次上传远程仓库之前都在.gitignore中加入.DS_store(系统自带的存储路径的文件)
Git 工作区创建
本地仓库搭建 :
|
|
克隆远程仓库 :
|
|
克隆远程仓库后,默认就与之产生了联系,也就是本地有.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 –> 文件内容
|
|
refs
- Branch 一般用于开发阶段,是可以不断添加 Commit 进行迭代的
- Tag 一般表示一个稳定版本,指向的 Commit 一般不会变更
|
|
- Annotation Tag 是一种特殊的 Tag,可以给 Tag 提供一些额外的信息
|
|