版本控制系统——Git教程
版本控制系统——Git教程
版本控制系统是软件开发中不可或缺的工具,它可以帮助开发者追踪代码变更、协作开发以及回溯历史版本。Git作为当今最流行的分布式版本控制系统,被广泛应用于各种规模的项目中。本文将从Git的基本概念开始,详细介绍其安装配置、仓库管理、文件操作、版本回溯、差异比较以及忽略文件配置等多个方面,帮助读者快速掌握Git的使用方法。
1. 初识版本控制系统
1.1作用
- 使用一个名为“仓库(Repository)”的数据库来记录文件的变化
- 仓库中的每个文件都有一个完整的版本历史记录
- 通过这些文件可以看到谁在什么时间修改了那些文件的那些内容
1.2分类
集中式版本控制系统(如SVN、CVS):
- 所有文件都保存在中央服务器上。
- 每个人的电脑上只保存了一个副本。
- 工作流程:从中央服务器下载最新版本 -> 添加修改内容 -> 上传回中央服务器。
- 过于依赖中央服务器。
分布式版本控制系统(如Git、Mercurial):
- Git是一个免费开源的分布式版本控制系统。
- 每个人的电脑上都有一个完整的版本库(本地仓库)。
- 可以在本地修改,不需要考虑网络问题。
- 通过仓库同步分享修改内容。
1.3Git安装
下载链接:Git - Downloads
在Windows下验证是否成功安装:
# 打开git bash
git -v
1.4Git使用方式
- 命令行
- 图形化界面(GUI)
- IDE插件/扩展
1.5Git配置
# 设置用户名
git config --global user.name "你的用户名"
# --global: 对所有仓库生效
# --system: 对所有用户生效,一般不使用
# 设置邮箱
git config --global user.email 你的邮箱
# 保存用户名和密码
git config --global credential.helper store
# 查看配置信息
git config --global --list
2. 初始版本库
2.1版本库
- 又叫仓库Repository(Repo)
- 可以理解为一个目录,目录中的所有文件都可以被git管理起来
- 每个文件的增删改查等操作,都可以被git跟踪到
2.2创建仓库的方式
- git init:在本地创建仓库
# 创建一个实例目录
mkdir learn-git
cd learn-git
git init
# 验证是否生成仓库,看有无.git目录
ls -a
cd .git
# 查看.git目录
# “-l” 选项以长格式显示文件信息,包括文件的权限、所有者、所属组、文件大小、修改时间等详细信息。
# “-t” 选项按照文件的修改时间对结果进行排序,最新修改的文件排在最后。
# “-r” 选项以相反的顺序显示结果,即最早修改的文件排在最前面。
# “-a” 选项显示所有文件,包括隐藏文件。
ls -altr
# 删除.git目录
\rm -rf .git
# 在learn-git目录中生成一个.git目录
git init my-repo
ls -al
- git clone:从远程服务器克隆仓库
git clone https://github.com/BackhimNiu/misc.git
ls -ltr
2.3Git的工作区域和文件状态
2.3.1git 的本地工作区域分为三个:
- 工作区 (Working Directory):在资源管理器中能看到的文件夹,.git所在的目录
- 暂存区 (Staging Area /Index):一种临时存储区域,用于保存即将提交到Git仓库的内容
- 本地仓库 (Local Repository):就是通过git init 创建的本地仓库,包含了完整的项目历史和元数据。是git存储代码和版本信息的主要位置。
2.3.2git在本地提交的流程
- 当修改完工作区的文件之后,需要将它们添加到暂存区
- 再将暂存区的修改提交到本地仓库中
- 此过程可以使用git命令来查看比较或撤销修改,保证准确性和完整性
2.3.3Git中的文件存在的几种状态
- 未跟踪 (Untrack):新创建的,未被git管理起来的文件
- 未修改 (Unmodified):已经被Git管理起来的,但是文件的内容没有发生变化,没有被修改过的
- 已修改 (Modified):已经修改,但没有添加到暂存区里面的
- 已暂存 (Staged)
3. 文件的添加与提交(本地仓库)
3.1添加一个文件
- git status:查看当前仓库的状态
git status
# 查看状态的简略模式
git status -s
# 生成一个示例文件(使用Linux命令),并添加到仓库
echo "这是第一个文件" > file1.txt
cat file1.txt
git status
git add file1.txt
经过上述操作生成了一个未被跟踪状态的file1.txt文件
- git 只会提交暂存区中的文件,不会提交其他工作区的文件
# -m :参数用来指定提交的信息
git commit -m "第一次提交"
file1.txt已经被提交到Git仓库中,显示状态命令看不到了
3.2添加多个同类型的文件
同上述方法创建下面几个文件,将所有.txt文件提交到暂存区
git add *.txt
3.3接收文件夹作为参数
将当前文件夹下的所有文件都添加到暂存区里面
git add .
使用 Vim编辑器代替 -m 参数指定提交的信息
git commit
# 输入i表示insert插入内容,再输入要提交的信息
i
# 按ESC键,输入以下进行保存
:wq
4.4 查看提交记录
git log
查看简洁的提交记录
git log --oneline
用于撤销之前的一些修改内容,回退到之前的某个版本
4. 版本回溯
4.1 git reset --soft
回退到某一个版本,并且保留工作区和暂存区的所有修改内容
git reset --soft cac1fc8
查看工作区和暂存区,第四次提交的东西都在
工作区和暂存区的内容都在
4.2 git reset --hard(谨慎使用)
回退到某一个版本,并且丢弃工作区和暂存区的所有修改内容
cd ../
cd repo-hard
# 使用 HEAD^ 表示上一个版本
git reset --hard HEAD^
工作区和暂存区的内容都被清空了
4.3 git reset --mixed(默认)
回退到某一个版本,只保留工作区的修改内容,丢弃暂存区的修改内容
git reset HEAD^
此时工作区还存在,但是暂存区已经没有了
回溯操作
git reflog
git reset --hard 9edc4c3
平时使用图形化工具如 SourceTree 来代替 git diff 这个用来查看差异的命令
5. 差异比较
vi file7.txt
i
# 随便插入一些内容,按ESC键
:wq
# 查看修改前后的差异
git diff
git diff命令下
# a为修改前的内容,b为修改后的内容
diff --git a/file7.txt b/file7.txt
# git将文件的内容使用哈希算法生成一个40位的哈希值
# 10064表示的是文件的权限
index 6e68a0f..bbc29a1 100644
# 将修改的内容添加到暂存区
git add .
git diff
回显为空,表示工作区和暂存区的内容是相同的
5.2比较工作区和版本库之间的差异
git diff HEAD
因为还没有执行提交操作,所以工作区和版本库的内容是不相同的
5.3比较暂存区和版本库之间的差异
git diff --cached
5.4比较两个版本之间的差异
git diff 后面加上两次版本的提交ID
5.5.HEAD参数的使用
HEAD表示当前分支的最新提交节点
5.5.1使用某一个版本的提交ID和HEAD比较(不常用)
使用上一个提交的ID和HEAD进行比较:
比较commit4与HEAD的差异:
git diff 9edc4c3 HEAD
5.5.2 比较当前版本和上一个版本的差异
# HEAD~ 表示上一个版本或使用 HEAD^
git diff HEAD~ HEAD
git diff HEAD^ HEAD
5.5.3 比较当前版本和前几个版本的差异
# ‘~’后面加上数字,表示HEAD之前的第几个版本.('^'无法使用)
git diff HEAD~2 HEAD
5.5.4只查看当前文件的差异内容
# 只查看file7当前版本和两个版本前的内容的差异
git diff HEAD~2 HEAD file7.txt
5.5.5查看两个分支之间的差异
……
6. 文件删除
6.1普通的删除文件的步骤
# 查看
ls -ltr
# 删除file1.txt,使用的是Linux的命令
rm file1.txt
此时提示提示需要输入添加到暂存区的指令,因为使用上述命令删除的是本地工作区的文件,而暂存区的文件还没有被删除。
# 查看暂存区中的文件
git ls-files
# 更新当前目录暂存区的内容
git add.
6.2常用的删除文件的步骤
此命令用来删除工作区和暂存区的内容,而不会删除版本库中的内容
git rm file2.txt
# 从版本库中删除,而不从暂存库中删除
git rm --cached “文件名”
# 删除之后需要提交,删除版本中的内容
git commit -m "delete file1.txt and file2.txt"
7. .gitignore文件
- 忽略日志文件和文件夹
- 忽略所有.class文件
- 或略所有.o文件
- 忽略所有.env文件
- 忽略所有.zip和tar文件
不应该被纳入版本库的文件:
- 系统或软件自动生成的文件
- 编译产生的中间文件和结果文件
- 运行时生成的日志文件、缓存文件、临时文件等
- 设计身份、密码、口令、密钥等敏感信息文件
echo access.log > gitignore.log
此时的other.log文件已经在仓库中了,但是.gitignore生效的前提是:
文件不能是已经被添加到版本库中的文件。
如果此时在other.log中追加内容,使用git diff等命令还是可以看到这个文件发生的变化,说明没有被“忽略”。
7.1忽略所有的日志文件
# 在bash中打开.gitignore
vi .gitignore
# 输入 i 进行插入
*.log
# 按ESC键,保存退出
:wq
7.2忽略已经在版本库中的文件
例如:other.log文件已经在版本库中
# 从版本库中删除,而不从暂存库中删除
git rm --cached other.log
# 再次提交
git commit -am "说明"
# 向other.log中追加内容的命令
echo "追加内容" >> other.log
7.3在.gitignore中配置文件夹的名称
Git不会将空文件夹添加到仓库
# 创建一个temp文件夹
mkdir temp
echo "hello" > temp/hello.txt
# 将temp文件夹添加到.gitignore
vi .gitignore
# "/"必须要加
temp/
第一个问号表示:暂存区的状态
第二个问号表示:工作区的状态
M表示:.gitignore文件被修改过
7.4 .gitignore文件的匹配规则
- 按行从上到下进行规则匹配的
- Glob模式匹配:
- *匹配任意个字符
- ?匹配单个字符
- [ ]表示匹配列表中的单个字符
- **表示匹配任意的中间目录
例如: 在.gitignore文件中加入:doc/**/*.pdf
忽略doc/目录及其所有子目录下的.pdf文件
- ! 表示不忽略哪些内容