问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

版本控制系统——Git教程

创作时间:
作者:
@小白创作中心

版本控制系统——Git教程

引用
CSDN
1.
https://blog.csdn.net/2302_76496424/article/details/142291252

版本控制系统是软件开发中不可或缺的工具,它可以帮助开发者追踪代码变更、协作开发以及回溯历史版本。Git作为当今最流行的分布式版本控制系统,被广泛应用于各种规模的项目中。本文将从Git的基本概念开始,详细介绍其安装配置、仓库管理、文件操作、版本回溯、差异比较以及忽略文件配置等多个方面,帮助读者快速掌握Git的使用方法。

1. 初识版本控制系统

1.1作用

  1. 使用一个名为“仓库(Repository)”的数据库来记录文件的变化
  2. 仓库中的每个文件都有一个完整的版本历史记录
  3. 通过这些文件可以看到谁在什么时间修改了那些文件的那些内容

1.2分类

  • 集中式版本控制系统(如SVN、CVS):

    1. 所有文件都保存在中央服务器上。
    2. 每个人的电脑上只保存了一个副本。
    3. 工作流程:从中央服务器下载最新版本 -> 添加修改内容 -> 上传回中央服务器。
    4. 过于依赖中央服务器。
  • 分布式版本控制系统(如Git、Mercurial):

    1. Git是一个免费开源的分布式版本控制系统。
    2. 每个人的电脑上都有一个完整的版本库(本地仓库)。
    3. 可以在本地修改,不需要考虑网络问题。
    4. 通过仓库同步分享修改内容。

1.3Git安装

下载链接:Git - Downloads

在Windows下验证是否成功安装:

# 打开git bash
git -v

1.4Git使用方式

  1. 命令行
  2. 图形化界面(GUI)
  3. 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版本库

  1. 又叫仓库Repository(Repo)
  2. 可以理解为一个目录,目录中的所有文件都可以被git管理起来
  3. 每个文件的增删改查等操作,都可以被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 的本地工作区域分为三个:

  1. 工作区 (Working Directory):在资源管理器中能看到的文件夹,.git所在的目录
  2. 暂存区 (Staging Area /Index):一种临时存储区域,用于保存即将提交到Git仓库的内容
  3. 本地仓库 (Local Repository):就是通过git init 创建的本地仓库,包含了完整的项目历史和元数据。是git存储代码和版本信息的主要位置。

2.3.2git在本地提交的流程

  1. 当修改完工作区的文件之后,需要将它们添加到暂存区
  2. 再将暂存区的修改提交到本地仓库中
  3. 此过程可以使用git命令来查看比较或撤销修改,保证准确性和完整性

2.3.3Git中的文件存在的几种状态

  1. 未跟踪 (Untrack):新创建的,未被git管理起来的文件
  2. 未修改 (Unmodified):已经被Git管理起来的,但是文件的内容没有发生变化,没有被修改过的
  3. 已修改 (Modified):已经修改,但没有添加到暂存区里面的
  4. 已暂存 (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文件

不应该被纳入版本库的文件:

  1. 系统或软件自动生成的文件
  2. 编译产生的中间文件和结果文件
  3. 运行时生成的日志文件、缓存文件、临时文件等
  4. 设计身份、密码、口令、密钥等敏感信息文件
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文件的匹配规则

  1. 按行从上到下进行规则匹配的
  2. Glob模式匹配:
    1. *匹配任意个字符
    2. ?匹配单个字符
    3. [ ]表示匹配列表中的单个字符
  3. **表示匹配任意的中间目录

例如: 在.gitignore文件中加入:doc/**/*.pdf

忽略doc/目录及其所有子目录下的.pdf文件

  1. ! 表示不忽略哪些内容

7.5常用语言的忽略文件的模板

https://github.com/github/gitignore

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号