一、什么是Git
Git是分布式管理控制系统
版本控制器:记录每次的修改以及迭代的一个管理系统
可以控制电脑上的所有格式的文档
它能高效管理项目开发过程中的代码变更,追踪文件修改历史,支持多人协作开发
基本概念
- 仓库(Repository):这是存储项目文件和版本历史的地方,分为本地仓库和远程仓库。
- 提交(Commit):它代表文件状态的一次快照,是版本控制的基本单位。
- 分支(Branch):分支是独立的开发线路,可用于开发新功能或者修复 bug。
- 合并(Merge):将不同分支的修改整合到一起。
- 远程(Remote):远程指的是远程服务器上的仓库,像 GitHub、GitLab 等
二、常用命令
1.仓库操作
# 创建新的本地仓库
git init
# 克隆远程仓库到本地
git clone <远程仓库URL>
2.文件命令
# 添加文件到暂存区
git add <文件名>
git add . # 添加所有文件
# 提交暂存区的文件到本地仓库
git commit -m "提交说明"
# 查看文件状态
git status
# 查看提交历史
git log
3.分支操作
# 创建新分支
git branch <分支名>
# 切换分支
git checkout <分支名>
# 创建并切换到新分支
git checkout -b <分支名>
# 列出所有分支
git branch
# 合并指定分支到当前分支
git merge <分支名>
# 删除分支
git branch -d <分支名>
4.远程操作
# 添加远程仓库
git remote add <远程仓库名> <远程仓库URL>
# 推送本地分支到远程仓库
git push <远程仓库名> <分支名>
# 拉取远程仓库的更新
git pull <远程仓库名> <分支名>
# 获取远程仓库的更新但不合并
git fetch <远程仓库名>
三、Git安装和配置
1.Git工具安装
centos
//查看Git版本
git --version
//卸载Git
sudo yum remove git -y
//安装Git
sudo yum install git -y
ubuntu
//查看git版本号
git --version
//卸载git
sudo apt-get remove git -y
//安装git
sudo apt-get install git -y
2.创建本地仓库

1.先创建一个文件夹 (mkdir gitcode)
2.在文件夹里创建一个git仓库(git init)
初始化完git仓库会有一个.git文件
使用tree可以查看.git目录

不要手动的去修改这个目录里的内容,修改了可能会导致git不可用
3.Git基本配置
//查看当前本地仓库的配置项
git config -l
//添加姓名配置
git config user.name "cml" cml是你要添加的姓名
//添加邮箱配置
git config user.email "5666456@qq.com"
//删除配置
git config --unset user.name
git config --unset user.email
//添加全局配置项
git config --global user.name "cml"
git config --global user.email "5666456@qq.com"
//删除全局配置
git config --global --unset user.name
git config --global --unset user.email
四、认识工作区

在gitcode文件夹中创建一个ReadMe文件,这时git能管理ReadMe文件吗?
答案是不能的
.git才是我们的git仓库,也不能进入.git创建ReadMe让git对ReadMe进行管理,千万不要对.git文件进行手动修改,ReadMe所在的文件称为工作区
• 工作区:是在电脑上你要写代码或文件的目录。
• 暂存区:英⽂叫 stage 或 index。⼀般存放在 .git 目录下的 index ⽂件(.git/index)中,我们把暂存区有时也叫作索引(index)。
• 版本库:又名仓库,英文名 repository 。工作区有⼀个隐藏目录 .git ,它不算⼯作区,⽽
是 Git 的版本库。这个版本库里面的所有文件都可以被 Git 管理起来,每个⽂件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原"。

五、Git基本操作
1.添加文件

//编写文件
vim 文件名
//查看文件内容
cat 文件名
//add将工作区的内容提交到暂存区
git add 指定要add的文件名 (提交工作区指定文件)
git add . (提交工作区的所有内容)
//从暂存区中提交
git commit -m "" (" "中写提交内容的一个备注)
//打印提交记录
git log
//每条记录一行打印
git log --pretty==oneline

但我们add完成后,tree查看一下.git,会发现多了一个index,index就是暂存区

这里我们能打印master的内容,以及日志,会发现master里面的内容是我们最后一次提交的commitID,而在Objects里面,这个commitID的前两位作为文件夹名称,后面的字符串作为文件名
也就证明了暂存区和master里面存的是Objects里面对象的索引

//查看索引内容
git cat-file -p 索引字符串
- tree:表示该提交对应的目录树对象(tree object)的哈希值,它指向了项目在该提交时的目录结构和文件内容。
- author :表示该提交的作者信息,包括作者用户名(
cml
)、邮箱(2782328212@qq.com
)以及提交时间(1752901713 +0800
,1752901713
是 Unix 时间戳,+0800
表示时区为东八区)。 - committer:表示该提交的提交者信息,这里提交者信息和作者信息相同。

将HEAD一层层打印出来,就会发现是我们最后一次提交的内容

2.修改文件
Git追踪管理的其实是修改,而不是文件
//查看暂存区和工作区的状态
git status
//查看工作区和暂存区文件的不同
git diff 文件名
//查看工作区和版本库的差异
git diff HEAD
//查看暂存区存在未提交和版本库的差异
git diff --staged
# 或
git diff --cached

修改工作区中ReadMe后,查看暂存区和工作区文件的不同

diff --git a/ReadMe b/ReadMe
:表示比较的是ReadMe
文件的两个版本,a/ReadMe
通常代表文件的旧版本,b/ReadMe
代表文件的新版本。index 2b6b32d..6a0192d 100644
:显示了文件在索引中的哈希值变化,2b6b32d
是旧版本的哈希值,6a0192d
是新版本的哈希值,100644
表示文件的权限模式。--- a/ReadMe
和+++ b/ReadMe
:分别表示旧版本和新版本的文件路径。@@ -1,4 +1,2 @@
:表示变更的范围,旧版本从第 1 行开始的 4 行内容,新版本从第 1 行开始的 2 行内容。-hello
、-hfdsjkfh
、-fgshdjfhs
:这些行以红色减号开头,表示在新版本中这些行被删除了。+hello word
:这行以绿色加号开头,表示在新版本中添加了这行内容。

3.版本回退
//版本回退
git reset [--soft | --mixed | --hard] [HEAD]
//查看每次提交的命令
git reflog
这个命令本质是回退版本库中的内容
--soft只回退版本区
--mixed回退版本区和暂存区
--hard回退版本区,暂存区,工作区


版本回退的速度是非常快的原因是:
master里面存放着commitID,每次回退只需要修改masterID就可以
4.撤销修改
撤销修改是将工作区,暂存区,版本库中修改的内容回退到上一个版本
//撤销修改
git checkout --文件名

1.情况1(修改了工作区的内容,未add)
想要将工作区的修改内容撤销
//撤销修改
git checkout --文件名
2.情况2(想要将工作区和暂存区的内容都撤销,未commit)
//先撤销暂存区
git reset -- 文件名
//再撤销工作区
git checkout -- 文件名
3.情况3(将工作区,暂存区,版本库中都撤销)
git reset --hard HEAD^
5.删除文件
方法一:
先删除工作区的文件,再add提交到暂存区,在commit提交到版本库

方法二:
//删除工作区和暂存区的文件,相当于方法一的第一第二步
git rm 文件名

六、分支管理

//查看仓库里有哪些分支
git branch
//创建分支
git branch 分支名
//切换分支
git checkout 分支名
//创建并切换分支
git checkout -b 分支名
//合并分支,想要master合并dev分支,就将工作分支切换到master上,然后合并,其他同理
git merge
//删除分支,不能在本分支删除本分支
git branch -d 分支名
//强制删除分支
git branch -D 分支名
//查看分支管理情况
git log --graph --abbrev-commit
//解决fast forword问题
git merge --no-ff -m "描述" 合并分支名

刚创建完dev分支,打印一下历史记录,可以看见HEAD同时指向master和dev,也就是master和dev处于同一个节点

1.合并冲突

切换到dev,对ReadMe文件进行修改,add,commit

且回master,对ReadMe文件也进行修改 add ,commit,然后合并dev

这时需要手动解决冲突,就是修改想要的文件,使两条分支冲突的文件相同才能进行合并,然后再对修改后的内容进行add 和commit

2.fast forword模式
在 Git 中,"Fast-forward"(快进)是一种在分支合并时的特殊情况。当要合并的分支(例如 feature
分支)的提交历史是当前分支(例如 master
分支)的直接延伸,没有分叉的情况下,Git 会执行快进合并。
也就是创建一个dev分支,然后在dev分支上提交,之后在master分支上合并dev分支,这时就是master模式
不过这种模式不能很好的查看是谁提交的
解决方法;
git merge --no-ff -m "dev2" dev2

七、远程操作
//查看远程仓库
git remote -v
//添加远程仓库
git remote add <远程名称> <远程仓库URL>
//删除远程仓库
git remote remove <远程名称>
//重命名远程仓库
git remote rename <原名称> <新名称>
//查看远程仓库信息
git remote show <远程名称>
//更新远程仓库URL
git remote set-url <远程名称> <新URL>
1.克隆操作
https克隆

git clone 仓库地址

ssh克隆
在主目录下找到.ssh

复制公钥信息填写如gitee中
如果没有.ssh文件,自己创建一个,使用下面这条命令,邮箱需要与gitee中保持一致
ssh-keygen -t rsa -C "268979@qq.com"


然后进行克隆就好了


2.push到远程仓库

3.拉取远程仓库(pull)

4.忽略特殊文件
在⽇常开发中,我们有些⽂件不想或者不应该提交到远端,⽐如保存了数据库密码的配置⽂件,那怎么让 Git 知道呢?在 Git ⼯作区的根⽬录下创建⼀个特殊的 .gitignore ⽂件,然后把要忽略的⽂件名填进去,Git 就会⾃动忽略这些⽂件了。
不需要从头写 .gitignore ⽂件,gitee 在创建仓库时就可以为我们⽣成,不过需要我们主动勾选⼀
下:

如果当时没有选择这个选择,在⼯作区创建⼀个也是可以的。⽆论哪种⽅式,最终都可以得到⼀个完整的 .gitignore ⽂件,例如我们想忽略以 .so 和 .ini 结尾所有⽂件, .gitignore 的内容如下:
创建.gitignore文件
vim .gitignore

这时我们创建一个a.so文件,并对其进行修改,查看状态时发现a.so并没有改变而是.gitignore工作区发生了变化


保留被忽略的文件
方法一:如果想要将忽略的文件进行添加
使用
git add -f 被忽略文件名
方法二:我们尽量不要去破坏.gitignore的规则,所以我们可以编辑.gitignore

这样就可以让c.so被追踪管理
查看某文件为什么被忽略
git check-ignore -v 被忽略文件名
5.给命令起别名
//全局生效的别名,想要在本仓库生效,其他仓库不生效,将--global去掉就行
git config --global alias.st status
这样就git status 就等效于git st
八、标签管理
1.什么是标签
Tag(标签)是一种用于快速分类、标记和检索内容的关键词或短语,不依赖固定层级结构(区别于传统的 "文件夹分类")。Tag 标签管理则是通过规范的规则和工具,对标签的创建、使用、维护等全流程进行管理,以提升内容组织效率和检索准确性。
本地操作:
//打标签 针对最新的一次提交,进行打标签
git tag 标签名
//对特定提交打标签
git tag 标签名 commitID
//添加标签描述
git tag -a 标签名 -m "标签描述" commitId
//查看标签
git tag
//查看标签详情
git show 标签名
//删除标签
git tag -d 标签名
除了通过git tag查看标签,也可以通过tree .git 查看标签
git tag查看标签:

tree .git查看标签:

我们查看提交记录和打印tags v1.0的内容就可以发现标签指向的是最新一次提交

对特定的commit进行打标签:
找到对应的commitid

git tag进行打标签

添加标签描述:
git tag -a 标签名 -m "标签描述" commitId

git show 标签名,查看标签详情

删除标签:

远程操作:
推送本地标签:
//将本地标签推送至远程仓库
git push origin 本地标签名

推送所有的标签至远程:
//推送本地所有的标签
git push origin --tags

删除远程标签:
方法一(不建议):

方法二:
//删除标签
git tag -d 标签名
//将其推送到远端
git push origin :标签名

九、多人协作
1.多人协作开发一
背景:

1.1协作开发
在远程仓库创建分支

//查看远程仓库分支
git branch -r
//拉取远程仓库
git pull
//打印本地和远程的分支
git branch -a
1.在linux上模拟用户1

2.在windows上模拟用户2
在文件夹打开powershell窗口,鼠标右键,没有就按住Shift+鼠标右键,或者地址栏输入powershell

在linux创建dev分支并与远程分支关联
git checkout -b dev origin/dev

查看分支与远程分支关系
git branch -vv

建立连接后,就可以直接使用pull短命令了

用户2:

此时就建立连接完成

在用户2上修改文件,push到远程仓库
这时在用户1修改文件,push到远程仓库,这时就会出现提交失败

这时需要git pull,将远程仓库拉取下来,然后修改文件完成合并冲突那一套之后进行提交(push)


这时就成功提交到dev
1.2将内容合并进master
方法一:由pr提交给审查员进行合并(建议)

方法二:

第一步:从远程仓库拉取pull
第二步:切换到dev分支,合并(merge)master分支,有冲突在dev解决
第三步:切换到master,合并(merge)dev分支
第四步:push到远程仓库
2.多人协作开发二


两个开发者在不同的分支进行开发,在自己的分支下进行开发,push是不会产生冲突的
当开发者2时,需要由开发者1对开发者2的代码继续进行开发,这时需要开发者1将开发者2的分支拉取1下来,对其进行开发
细节:
git pull
1.拉取分支内的内容
2.拉取仓库的内容

细节:
当远程仓库删除不需要的分支

使用git remote show origin查看分支情况,这时他提示dev是陈旧的分支,不想让已删除的分支使用git branch -a查看到,我们就可以使用git remote prune origin 删除
