目录
创建、配置本地仓库
创建本地仓库
我们通常可以通过以下两种方式之一获取 Git
存储库:
-
自己在本地目录创建一个本地仓库
-
从其它服务器 克隆 一个已存在的 Git 仓库。
一、在现有目录中初始化存储库
我们可以在本地创建一个目录用来存放 Git
存储库,并且输入:
git init // 初始化本地仓库
我们发现创建一个新子目录.git
,这个是 Git 版本控制系统的核心部分。它就像是一个项目版本历史的 "数据库" 和 "管理中心",存储了用于跟踪项目文件版本变化的所有必要信息。对于一个受 Git 管理的项目,.git
目录是必不可少的,它使得开发人员能够回溯文件的修改历史、管理分支、合并代码等操作。
查看 .git 子目录内的文件
ls .git
查看 .git 子目录树状结构
tree .git
- 配置文件
- **config 文件:**存储仓库的用户信息(如用户名、邮箱)、行为选项(如换行符转换方式)和远程仓库配置等。
- description 文件:包含对仓库的简短描述
- 钩子脚本
- hooks 目录 :有客户端钩子(如
pre - commit
、commit - msg
)和服务器端钩子(如pre - receive
、post - receive
)脚本,用于在特定 Git 操作阶段自动执行,实现如代码检查、自动化部署等功能。
- hooks 目录 :有客户端钩子(如
- 对象存储
- objects 目录:存放版本控制对象,包括 blob(文件内容)、树(目录结构)和提交对象,用于记录文件版本变化和历史。
- 引用信息
- refs 目录 :主要存储分支(
refs/heads
)和标签(refs/tags
)引用,确定分支和版本标记。 - HEAD 文件:指向当前分支,用于指示当前工作位置。
- refs 目录 :主要存储分支(
- 其他辅助信息
- info 目录 :有
exclude
文件用于指定本地不被 Git 管理的文件,还可能包含 GitWeb 相关信息。
- info 目录 :有
配置本地仓库
初次使用 git 需要设置你的用户名以及邮箱,这将作为当前机器 git 的标识,如果你用它来下载远程仓库一些需要登录权限的仓库会要求登录,git默认使用配置邮箱以及用户名登入,但会要求你手动输入密码
用户名配置
// 在当前本地仓库生效
git config user.name "自己的用户名"
// --global 代表当前机器所有的本地仓库生效
git config --global user.name "自己的用户名"
邮箱配置
// 在当前本地仓库生效
git config user.email "自己的电子邮件地址"
// --global 代表当前机器所有的本地仓库
git config --global user.email "自己的电子邮件地址"
删除用户名配置和邮箱配置
// --unset 代表删除当前配置
git config --unset user.name
git config --unset --global user.name
git config --unset user.email
git config --unset --global user.email
查看配置信息
git config -l // 查看配置信息
我们配置完用户名和邮箱地址后,再次查看发现已经成功添加
认识工作区、暂存区、版本库
工作区(Working Directory)
- 工作区是开发者在本地计算机上实际操作文件的区域,也就是项目的本地文件夹。
- 它包含了项目的所有文件和子目录,这些文件可以是源代码、配置文件、文档等任何与项目相关的内容。
- 例如,对于一个软件开发项目,工作区可能包含了项目的源文件(如
.cpp
、.java
等)、资源文件(如图像、音频等)以及构建脚本等。
版本库(Repository)
- 版本库是 Git 用于存储项目所有版本信息的地方,它位于项目的
.git
目录下。 - 版本库包含了一系列的提交(
commit
)对象、树(tree
)对象和二进制大对象(blob
)等,这些对象共同构成了项目的版本历史。 - 例如,每一次
git commit
操作都会在版本库中创建一个新的提交对象,这个对象记录了提交的作者、日期、消息以及当时项目的目录结构(通过树对象表示)。
暂存区(Staging Area)
- 暂存区也被称为索引(Index),它是一个介于工作区和版本库之间的中间区域。
- 暂存区的主要作用是用于挑选工作区中的哪些文件变更需要被包含在下一次提交(
git commit
)中。 - 当执行
git add
命令时,文件从工作区被添加到暂存区。 - 例如,在修改了多个文件后,开发者可以使用
git add
有选择性地将部分文件添加到暂存区,准备进行提交,而未被添加的文件变更则暂时不会进入版本库。
如果我们想要使用git 进行版本控制:
- 使用
git add
命令将工作区中的文件添加到暂存区。 - 在将文件添加到暂存区后,使用
git commit
命令将暂存区的文件提交到版本库。
添加文件
将工作区中的文件添加到暂存区
git add test // 添加一个文件
git add file1 file2 file3 // 也可以使用空格连续添加多个文件
将暂存区的文件提交到版本库
// -m 表示对添加到版本库文件的解释
git commit -m "添加3个文件"
查看历史提交记录
git log
git log --pretty=oneline // 想要简介点,只要一行的
简介版,只要一行的
我们再来看看 .git 子目录,看看添加文件后发生了什么变化
COMMIT_EDITMSG
COMMIT_EDITMSG
是 Git 中的一个文件,位于本地 Git 仓库的.git/COMMIT_EDITMSG
路径下。- 这个文件在每次执行
git commit
操作且需要用户编辑提交消息时发挥关键作用。 - 当我们使用
git commit
而没有通过-m
选项直接提供提交消息时,Git 会打开一个文本编辑器(编辑器由core.editor
配置项决定,如可以是vim
、nano
等),此时文本编辑器中加载的内容就来自于这个COMMIT_EDITMSG
文件,或者在编辑完成后会将内容保存到这个文件中。
index
- 在 Git 中,
index
(也称为暂存区,英文是 Staging Area)是一个关键的中间区域,它由.git
目录下的相关文件和数据结构来表示。 - 这个区域在工作区(包含项目实际文件的目录)和版本库(存储所有提交历史和相关对象的区域)之间起到了承上启下的作用。
logs
- 在 Git 的
.git
目录中,logs
子目录用于存储提交(commit
)相关的日志信息。 - 这些日志提供了关于仓库中每次提交的详细记录,包括提交的时间顺序、作者、提交消息以及提交之间的关联信息等。
- 它是 Git 用于跟踪版本历史和操作记录的重要部分,与
git log
命令查看的信息密切相关。 - refs子目录 :在
logs
目录下,refs
子目录是一个关键部分。它主要用于存储与引用(如分支和标签)相关的日志信息。- heads子目录 :其中的
heads
子目录存储了各个分支的提交日志。例如,对于一个名为master
的分支,会有一个logs/refs/heads/master
文件(或者目录,取决于具体的 Git 实现),这个文件记录了master
分支上所有提交的历史顺序、作者、日期和提交消息等内容。每次在master
分支上进行新的提交时,相关信息都会被添加到这个文件中。 - tags子目录 :
tags
子目录用于存储与标签相关的日志信息。标签是对特定提交的标记,通常用于标识重要的版本(如发布版本)。logs/refs/tags
下的文件记录了标签的创建时间、关联的提交以及相关的操作历史等。
- heads子目录 :其中的
- HEAD文件 :在
logs
目录下可能还会有与HEAD
文件相关的日志信息。HEAD
文件用于指示当前分支,logs
中的相关内容可能记录了HEAD
文件的变化历史,例如何时切换分支,以及每次切换分支时的具体情况等。
objects
- 在 Git 的
.git
目录中,objects
子目录是存储版本控制对象的核心区域。 - 它保存了 Git 用于记录项目版本信息的各种对象,这些对象是 Git 版本控制系统能够跟踪文件变更和历史版本的基础。
refs
查看 Git 对象的内容
git cat-file -p
修改文件
查看工作区和暂存区的状态:它会告诉你哪些文件被修改了、哪些文件是新添加的、哪些文件已经被放入暂存区准备提交,还有哪些文件没有被跟踪等信息
git status
查看文件内容的差异。它主要用于比较不同版本的文件之间的变化情况,这些版本可以是工作区与暂存区、暂存区与最近一次提交、或者两个不同提交之间的文件内容差异。
git diff 文件名
版本回退
版本回退使用的命令
git reset [--soft][--mixed][--hard] HEAD
// --soft: 仅回退版本库的,暂存区和工作区的内容保持不变
// --mixed:回退版本库和暂存区,工作区的内容保持不变
// --hard: 版本库、暂存区和工作区全部回退(尽量不要使用)
// HEAD: 要重置到的提交标识
HEAD: 要重置到的提交标识,就是下图的标示
我们来实现一个版本回退,我们有两个版本:
- hello git 版本
- hello git + haha 版本
我们发现文件确实从 hello git + haha 版本回退到hello git 版本了
[--soft][--mixed][--hard]参数的区别
|---------|------------------|------------------|-----------|
| | 工作区 | 暂存区 | 版本库 |
| --soft | hello git + haha | hello git + haha | hello git |
| --mixed | hello git + haha | hello git | hello git |
| --hard | hello git | hello git | hello git |
我们想要撤销修改怎么办呢 ?
查看本地仓库的引用日志
git reflog
找到其中的提交标示,并且回退到之前版本
撤销修改
如果我们想要在工作区、暂存区和版本库撤销修改
一、工作区
将工作区中指定文件恢复到最近一次提交(commit
)时的状态,或者如果该文件已被添加到暂存区(即执行过git add
操作),则恢复到暂存区中的状态。
例如,你在工作区对example.txt
文件做了一些修改,之后又觉得这些修改不太合适,想要放弃这些修改,恢复到之前最后一次提交时的样子,就可以执行git checkout -- example.txt
命令。
git checkout -- <file>
// <file>代表具体的文件名
二、暂存区
从暂存区回退
git reset HEAD test
再回退工作区
git checkout -- <file>
// <file>代表具体的文件名
三、版本库
工作区、暂存区和版本库都回退到上个版本
git reset --hard HEAD^
删除文件
如何删除我们已经上传版本库的文件
方法一
1、 rm // 删除文件
2、git add
3、git commit
方法二
1、git rm [文件名] (相当于rm + git add)
2、git commit