文章目录
- Git(一):初识Git
- Git简介
- 核心功能
- 分布式特性
- 结构与操作
- 优势与适用场景
- 创建本地仓库
- git init
- 配置name与email
- --global
- 工作区、暂存区与版本库
- git add
- git commit
- commit后.git的变化
Git(一):初识Git
Git简介
Git 是一个分布式版本控制系统,由 Linus Torvalds 于 2005 年为管理 Linux 内核开发而创建 。其核心功能是跟踪文件的修改历史,并支持多人协作开发,使团队成员能够高效地管理代码变更、回溯版本、合并修改等
核心功能
- 版本控制:Git 通过记录文件的每次修改(称为“提交”),形成一个完整的版本历史。用户可以随时回溯到任意版本,甚至恢复早期的代码状态
- 分支与合并:Git 支持创建和管理多个分支(branch),允许开发者在独立的分支上开发新功能或修复问题,最终通过合并(merge)将更改整合到主分支中 。这种非线性工作流程(如“功能分支”模型)显著提升了协作效率
- 远程协作:Git 是分布式系统,每个开发者本地拥有完整的代码仓库(.git 目录),无需依赖中心服务器。团队成员可通过 git push 和 git pull 同步代码,实现跨设备的协作
- 差异比较:Git 可生成差异文件(diff),直观展示文件或版本之间的修改内容,便于审查和调试
分布式特性
- 本地副本:每个开发者拥有独立的本地仓库,即使在无网络连接时也能独立工作,增强了系统的鲁棒性
- 离线操作:开发者可在本地完成代码修改、提交和分支管理,仅在需要时将更改推送到远程仓库(如 GitHub、GitLab)
结构与操作
- 工作区:日常存放代码的目录,用户在此进行修改
- 暂存区(Staging Area) :用于准备提交的中间区域,通过
git add
将修改标记为待提交 - 版本库(.git) :隐藏的
.git
目录存储所有提交历史和元数据,用户不应直接修改该目录 - 远程仓库:托管在云端(如 GitHub、Gitee)的代码仓库,用于团队协作和代码同步
优势与适用场景
- 高效性:Git 的设计注重速度,尤其适合处理大型项目(如 Linux 内核)的频繁更新
- 灵活性:支持多种开发模式(如功能分支、特性分支),并提供丰富的命令(如
git rebase
、git stash
)以应对复杂需求 - 协作能力:通过
git pull
和git push
,团队成员可实时同步代码,减少冲突并确保代码一致性
创建本地仓库
git init
首先需要我们创建一个文件夹并进入该文件夹中,再执行git init
命令,此时文件夹中就会生成一个隐藏目录.git
,隐藏的 .git
目录用于存储所有提交历史和元数据,用户不应直接修改该目录
配置name与email
配置name和email是为了在远程仓库的提交记录中明确操作者。这有助于团队协作时追踪代码修改的来源,确保每个提交都能被正确归因,命令如下:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱地址"
配置成功后,可以使用如下命令查看配置项:
git config -l
同时,我们也可以删除配置项后再重新配置,用到的命令如下:
git config --global --unset user.name
git config --global --unset user.email
–global
在Git中,git config --global user.name "你的名字"
命令中的--global
选项表示将配置的用户名应用到当前用户的所有Git仓库中。具体来说,使用--global
选项时,Git会将用户信息保存在用户主目录下的.gitconfig文件中,这样无论你在哪个项目中使用Git,都会默认使用这个全局配置的用户名和邮箱地址进行提交
使用--global
配置,在删除时也需要带上--global
工作区、暂存区与版本库
我们在gitcode目录中新建一个ReadMe文件,不进行其他操作,此时Git就可以进行版本控制了吗?
答案是不能,因为ReadMe还没有被添加进版本库中,只是在工作区中
-
工作区:是在电脑上你要写代码或文件的目录。
-
暂存区:英文叫stage或index。⼀般存放在.git 目录下的index文件(.git/index)中,我们把暂存区有时也叫作索引(index)
-
版本库:又名仓库,英文名repository 。⼯作区有⼀个隐藏目录.git ,它不算⼯作区,而是Git的版本库。这个版本库里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”
下面这个图展示了工作区、暂存区和版本库之间的关系:
图中左侧为工作区,右侧为版本库。Git的版本库里存了很多东西,其中最重要的就是暂存区
- 在创建Git版本库时,Git会为我们自动创建⼀个唯⼀的master分支,以及指向master的⼀个指 针叫HEAD(分支和HEAD的概念后面再说)
- 当对工作区修改(或新增)的文件执行git add命令时,暂存区目录树的文件索引会被更新
- 当执行提交操作
git commit
时,master分支会做相应的更新,可以简单理解为暂存区的目录树才会被真正写到版本库中。
由上述描述我们便能得知:通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是 在⼯作区新增了文件。必须要通过使用git add和git commit命令才能将文件添加到仓库中进行管理!!
但是上图中并没有体现版本控制!我们每次**修改(新增、修改、删除)**的内容存放在那里呢?
原因是在版本库中还有一个名为Objects的对象库,里面包含了创建的各种版本库对象及内容。当执行git add
命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的⼀个新的对象中,就位于".git/objects"目录下
git add
git add
是 Git 中用于将文件修改添加到暂存区(Staging Area)的命令。暂存区是提交前保存更改的临时区域。通过git add
,可以将工作目录中的文件修改、新增或删除操作标记为“已暂存”,以便后续提交到版本库
我们执行git add
命令,将ReadMe文件添加到暂存区中,再查看一下.git的目录结构:
index与master中存放的都是索引,指向的是Objects中的对象
git add
命令执行时有两种方式:
-
git add
后面直接加上文件名表示只添加该文件到暂存区,可以同时添加多个文件 -
git add .
表示添加工作区中所有文件到暂存区
git add
其他常见选项
- 添加所有文件(包括删除的文件)
git add -A(all)
该命令会将当前目录下所有文件的修改、新增和删除操作添加到暂存区,适用于一次性处理所有变更
- 仅添加已跟踪文件的修改和删除
git add -u
该命令会将已跟踪文件的修改(modified)和删除(deleted)添加到暂存区,但不包括新增的文件(new)
- 撤销添加,若需撤销
git add
操作,可使用git reset
:
git reset
git commit
git commit
是 Git 中用于记录对存储库更改的核心命令。它将暂存区的内容(即通过git add
添加的文件)保存为一个新的提交,并附带描述更改的日志消息。新提交通常会成为当前分支的最新提交并更新分支指针指向它,格式如下:
git commit -m "日志信息"
同时我们可以使用git log
命令来查看提交记录,它会按时间倒序显示当前分支的提交记录,最近的提交在顶部。每个提交包含哈希值、作者、日期和提交信息
git log --pretty=oneline
可以按行打印
那一长串的数字就是每次commit生成的commit id,它是每次提交的唯一标识,可以用来进行版本追踪、数据完整性校验、协作开发、回滚操作、代码版本管理等
git commit
其他常见选项
- 修改最近一次提交,可以用来修正提交消息或添加遗漏的文件
git commit --amend -m "新的提交消息"
- 预览将要提交的内容,但不实际创建提交
git commit --dry-run
commit后.git的变化
在前面的图中,HEAD指向了master,我们来验证一下:
我们再来看一下master指向的是什么
我们发现master指向了一个commit id,我们再查看一下这个commit id指向的内容,命令如下:
git cat-file -p commit id
这时我们发现,它就是我们最近一次提交的日志信息,我们再来查看一下tree后面的commit id:
我们一直查看到底,就会发现,其中记录了我们在ReadMe中新增的内容,而上述所有的commit id均在Objects中有记录