Git
笔记参考视频:【GeekHour】一小时 Git 教程
一、概述
-
版本管理工具分类:
- 分布式版本控制系统--Git
- 集中式版本控制系统--SVN
-
版本管理工具区别:
- 集中式版本控制系统:版本记录存放在服务器,提交的时候版本记录需要从服务器中读取,服务器挂了就完蛋了。
- 分布式版本控制系统:每台电脑都有一个完整的版本记录,即使服务器挂了也可以先提交到本地版本库,等中央服务器修好了在同步上去。
二、下载
官网:git-scm.com/
三、工作区域介绍
Git 工作区一共有三个:
- 本地工作区:我们能看到的文件就是本地工作区
- 本地暂存区:一个中间区域,临时存储即将要提交到本地仓库的代码
- 本地仓库:包含本地代码和版本信息
Git 的工作流程
- 文件在工作区修改完成后使用
git add提交到暂存区- 确认暂存区的文件需要提交到本次仓库后,使用
git commit提交的到本地仓库
四、Git 管理文件的四个状态
- 未跟踪:文件没有被 Git 管理起来的文件,这些文件修改,不会有版本记录
- 未修改:文件已经被 Git 进行版本管理,但是文件内容没有变化
- 已修改:文件已经被 Git 进行版本管理,且文件内容有变化,同时还没有提交到暂存区的文件
- 已暂存:文件修改后,被添加到暂存区内的文件
五、基本使用
1.初始化 Git 设置
设置这些属性可以区分代码是谁提交的
--配置用户名
git config --global user.name "用户名"
--配置邮箱
git config --global user.email "邮箱"
--存储配置(没必要弄,可以略过)
git config --global credential.helper store
--查看配置信息
git config list --global
2.初始化仓库
Git 初始化仓库有两种方式:
- 本地新建仓库
- 克隆远程仓库
--方式一:本地新建仓库
git init [仓库地址]
--方式二:克隆仓库
git clone git仓库地址
--案例:
--案例1:在当前文件夹新建仓库
git init
--案例2:在指定文件夹新建仓库,如果文件夹不存在就创建文件夹
git init ./project/cangqiongwaimai
--案例3:拉取远程仓库
git clone https://github.com/deepseek-ai/DeepSeek-V3.git
3.本地仓库操作
--查看仓库状态[可以查看当前仓库的基本信息:是哪个分支,有哪些文件,这些文件的状态]
git status
--将本地修改的文件从工作区提交到暂存区[红色文件:已修改,未暂存 绿色文件:已修改,已暂存]
--方式一:添加指定文件
git add [需要提交的文件名]
--方式二:添加当前目录下所有未被忽略管理的文件
git add .
--方式三:以通配符方式添加【例如:只添加以.txt结尾的】
git add *.txt
--将暂存区中的文件从暂存区中删除
git rm --cached 文件名
--将本次修改的内容从暂存区中删除【不会删除暂存区的文件,只会删除本次修改的内容】
git restore --staged 文件名
--将暂存区中的文件提交到本地仓库[只会提交暂存区中的文件,不会提交没有添加到暂存区中的文件]
git commit -m '本次提交描述'
--查看本地仓库提交记录 [可选参数:--oneline 只显示简洁的提交信息]
git log [--oneline]
----------------------------------------------------------------------------------
--案例:
--第一步:在仓库中创建一个文件 1.txt 随便输入一点内容
--第二步:查看仓库状态,可以看到有一个红色的文件
git status
--第三步:将文件添加到本地暂存区
git add 1.txt
或者
git add .
--第四步:查看仓库状态,可以看到有一个绿色的文件
git status
--第五步:将暂存区中的文件提交到本地仓库
git commit -m '提交了1.txt文件'
4.本地版本回退
如果我们某次提交到本地仓库的文件有问题,有问题的这个文件怎么撤回呢?
reset 命令介绍:
作用:可以将本地仓库回退到之前的某个版本,但会丢失回退版本之后的版本【如果想要保存版本提交记录可以使用
git revert 回退版本的下一个版本号】三种模式:
-
git reset --soft 版本id:回退到某一个版本,但保存之前提交的工作区和暂存区的修改内容。-
git reset --hard 版本id:回退到某一个版本,并丢弃工作区和暂存区的修改内容。-
git reset [--mixed] 版本id:回退到某一个版本,保存工作区修改内容,丢弃暂存区的修改内容。
--案例一:使用soft参数回退
--1.提交三个版本,每个版本都修改一点内容
git commit -m "提交文件1.txt"
git commit -m "提交文件2.txt"
git commit -m "提交文件3.txt"
--2.查看版本号
git log --oneline #第一次版本号:c7a35dd 第二次版本号:3558610 第三次版本号:dc96171
--3.回退到第二次提交的状态
git reset --soft 3558610
--4.查看文件是否存在3.txt #存在
--5.查看暂存区文件是否存在文件3
git status #存在
--查看提交记录
git log --oneline #只有两条记录c7a35dd、3558610;当前版本号3558610
--案例一结论:使用soft参数回退,提交的文件依旧在工作区、暂存区中存在,不会丢失
----------------------------------------------------------------------------------
--案例二:使用hard参数回退
--1.提交三个版本,每个版本都修改一点内容
git commit -m "提交文件1.txt"
git commit -m "提交文件2.txt"
git commit -m "提交文件3.txt"
--2.查看版本号
git log --oneline #第一次版本号:c7a35dd 第二次版本号:3558610 第三次版本号:cbc9c6f
--3.回退到第二次提交的状态
git reset --hard 3558610
--4.查看文件是否存在3.txt #不存在
--5.查看暂存区文件是否存在文件3
git status #不存在
--查看提交记录
git log --oneline #只有两条记录c7a35dd、3558610;当前版本号3558610
--案例二结论:使用hard 参数回退,提交的文件工作区、暂存区都会删除,文件丢失
----------------------------------------------------------------------------------
--案例三:使用默认回退[和使用--mixed参数效果一样]
--1.提交三个版本,每个版本都修改一点内容
git commit -m "提交文件1.txt"
git commit -m "提交文件2.txt"
git commit -m "提交文件3.txt"
--2.查看版本号
git log --oneline #第一次版本号:c7a35dd 第二次版本号:3558610 第三次版本号:cbc9c6f
--3.回退到第二次提交的状态
git reset 3558610
--4.查看文件是否存在3.txt #存在
--5.查看暂存区文件是否存在文件3
git status #不存在
--查看提交记录
git log --oneline #只有两条记录c7a35dd、3558610;当前版本号3558610
--案例三结论:使用默认回退[和使用--mixed参数效果一样],提交的文件工作区会存在、暂存区会删除,文件丢失
5.查看操作日志
如果我们使用上面的本地版本回退命令时,不小心输错了参数,导致文件丢失了怎么办?
Git 所有的操作都会被记录下来,所以如果我们真的误操作了,可以使用 reflog 查看操作日志,回退到对应版本就可以了。
git reflog:查看所有 Git 操作,并显示对应版本号。与git log不同,git log只会记录有效提交的版本信息,而git reflog会记录所有提交的版本信息。
--案例:使用回退操作时,参数用错了,导致文件3从本地工作区中删除了
--1.提交三个版本,每个版本都修改一点内容
git commit -m "提交文件1.txt"
git commit -m "提交文件2.txt"
git commit -m "提交文件3.txt"
--2.查看版本号
git log --oneline #第一次版本号:c7a35dd 第二次版本号:3558610 第三次版本号:80c7873
--3.误操作,回退到第二次提交的状态是使用了hard参数
git reset --hard 3558610
--4.查看全局操作日志[可以看到第一条是误操作命令,那么可以回退到第二条对应的版本]
git reflog
--5.回退到误操作之前的一个版本
git reset --hard 80c7873
6.差异对比
git diff
作用:
- 可以查看工作区、暂存区、本地仓库之间的内容差异。
- 可以查看在不同版本之间的内容差异。
- 可以查看在两个分支之间的内容差异。
说明:
- 无参数:比较工作区和暂存区的内容差异
-
HEAD 参数:比较工作区和本地版本库的差异【HEAD 指向最新的本地版本】-
cached 参数:比较暂存区和本地版本库的差异-
版本id1 版本id2 参数:比较两个版本的差异-
分支1 分支2参数:比较两个分支的差异
--案例一:不加参数[比较本地跟暂存区的差异]
--1.前面的操作我们已经提交了文件1、2、3.txt
--2.现在我们修改文件3,但是不提交到暂存区,这样文件3在工作区和暂存区就出现了差异
--3.对比工作区和暂存区的差异
git diff --显示文件3有区别
--案例二:加head参数【比较工作区和本地版本库的差异】
git diff head
--案例三:加cached参数【比较暂存区和本地版本库的差异】
git diff cached
--案例四:比较两个版本的差异
git diff 3558610 80c7873
--案例五:比较本地仓库最新版本和某个版本的区别[head:指向最新版本]
git diff head 3558610
--案例六:比较当前版本和上一个版本的区别[head:指向最新版本 head~:指向上一个版本]
git diff head head~
--案例七:比较当前版本和之前第3个版本的区别[head:指向最新版本 head~N:指向上N个版本]
git diff head head~3
--案例八:查看两个版本之间某个文件的差异
git diff head head~3 3.txt
--案例八:查看两个分支的差异
git diff 分支1 分支2
7.删除文件
--命令:
git rm 文件名 --文件从工作区和暂存区同时删除
git rm --cached 文件名 --把文件从暂存区中删除,但保留在工作区中
git rm -r * --递归删除某个目录下的所有子目录和文件
----------------------------------------------------------------------------------
--案例一:传统删除流程:删除上面提交的1.txt文件
--第一步:删除本地工作区中的1.txt文件
--第二步:将暂存区的1.txt文件删除
git add .
--第三步:查看暂存区中的文件
git ls-files
--第四步:删除本地仓库中的1.txt文件
git commit -m "删除了1.txt"
--案例一回顾:虽然这样操作可以删除文件,但是太麻烦了
--案例二:使用git提供的本地仓库删除命令
--1.删除工作区和暂存区文件
git rm 2.txt
--2.提交操作,这样就会同步删除文件
git commit -m "删除了2.txt"
六、.gitignore 忽略文件
有些文件是系统自动生成的或者仓库中不需要的,那这个文件就可以不添加到版本管理。
例如:
- Vue 项目下载的依赖都会存在
node_modules里面,这个文件就可以忽略- 使用 IDEA 开发 Java 项目会生成 idea 文件,这个就可以忽略
- SpringBoot 项目的配置文件会包含密钥信息,这个文件可以忽略
--案例:.gitignore忽略文件实际操作
--1.创建.gitignore文件
--2.将需要忽略的文件写入
idea/
*.class
target/
application.yaml
--3.将.gitignore忽略文件提交
git add .gitignore
git commit -m "添加忽略文件"
七、GitHub/Gitee
1.GitHub 介绍
GitHub、Gitee 是两个远程托管平台。他们的作用一样,只不过 Github 是国外的,Gitee 是国内的。Github 的用户远超 Gitee,但是由于国外网站,国内访问会很慢。
我们可以将本地仓库的代码上传到远程仓库,这样自己可以随时随地访问代码,同时也可以实现多人协作。
2.GitHub 账号注册
GitHub 地址:GitHub
3.创建远程仓库
-
点击右上角的加号,选择
New Repository -
在页面中输入仓库名字,选择仓库权限,然后创建仓库
4.创建 SSH 配置
--1.移动到用户根目录【第一次创建不用这一步】
cd ~
--2.删除原本的.ssh文件夹
rm -rf .ssh
--3.输入下面的命令,生成密钥
ssh-keygen -t rsa -b 4096 -C "邮箱"
--4.执行上面的命令后会让输入东西,这里直接敲回车即可,直到结束
--5.查看.ssh文件夹,会发现生成了两文件 xxx 和 xxx.pub
cd .ssh
ll
xxx 是私钥文件
xxx.pub 是公钥文件,需要上传到github
--6.打开xxx.pub文件,复制里面的内容
cat xxx.pub
--7.回到Github,点击头上角自己的头像,选择Settings,进入后页面左侧有一个SSH and GPG keys,新建key,将密钥粘贴进去保存即可
5.克隆远程仓库到本地
--方式1:配置SSH后使用ssh链接拉取
git clone 远程仓库SSH地址
--方式2:直接使用HTTPS链接拉取
git clone 远程仓库HTTPS地址
5.关联远程仓库
--命令一:设置本地仓库关联的远程仓库
git remote add 远程仓库别名 远程仓库链接
--命令二:查看当前仓库关联的远程仓库情况
git remote -v
----------------------------------------------------------------------------------
--案例:给本地仓库关联远程仓库
--1.本地创建一个仓库,没有关联远程仓库
--2.github创建一个仓库
--3.查看本地仓库是否关联远程仓库
git remote -v
--4.本地仓库关联github仓库
git remote add origin git@github.com:JunQingYang/GitHubStudy.git
6.更新/推送本地仓库代码
在多人写作开发中,每个人都会将自己修改后的代码提交到远程仓库上,我们每次提交代码前都要保证当前的版本跟远程仓库的版本一致
--命令一:拉取代码
--拉取远程代码合并到本地[中括号里面的内容可以省略]
git pull [远程仓库别名] [远程仓库分支]:[本地仓库目标分支]
--拉取远程代码但不合并差异
git fetch
--命令二:推送代码
--推送本地仓库代码到远程仓库[如果本地分支名和远程仓库分支名一样可以省略本地仓库分支名]
git push [远程仓库别名] [远程仓库分支]:[本地仓库目标分支]
----------------------------------------------------------------------------------
--案例:提交本地代码origin分支到远程仓库origin分支
--1.拉取并合并代码【因为只有一个远程仓库链接并且本地目标分支名一样,所以可以省略参数】
git pull
或
git pull origin master
--2.提交本地仓库代码到远程仓库【因为只有一个远程仓库链接并且分支名一样,所以可以省略参数】
git push
或
git push origin master
7.分支
--命令:
--1.查看仓库分支信息
git branch --前面带有*就是当前所处的分支
--2.创建分支
git branch 分支名 --这个命令只会创建分支,但不会切换到新建的分支
--3.切换分支
git checkout 目标分支 --这个命令是老命令,有两个功能,所以2.23版本后提供了一个新命令专门切换分支
git switch 目标分支 --git 2.23 版本之后 新出的专门用来切换分支的命令
--4.合并分支
git checkout -b 目标分支 --创建目标分支,并切换到目标分支上
git merge 被合并分支 --将目标分支的修改合并到当前分支
--5.删除分支
git branch -d 被删除分支名 --删除已经合并完成的分支
git branch -D 被删除分支名 --强制删除没有合并的分支
----------------------------------------------------------------------------------
--案例:新建一个仓库,新建分支son,修改son分支内容,将son分支修改信息合并到main分支
--1.新建仓库
git init
--2.在main分支随便创建一点文件,并提交
--3.创建son分支
git branch son
--4.切换到son分支,修改一点文件,并提交
git switch son
xxx
git commit -m "son分支修改内容"
--5.切换到main分支,将son分支修改的内容合并到son分支上
git switch main
git merge son
--说明:被合并的分支并没有消失,如果需要删除合并完的分支可以使用 git branch -d 分支名
8.解决分支合并冲突
如果两个分支同时修改了同一个文件的同一行代码,那么git就不知道保存哪一个的代码了,这时就需要手动合并
--合并分支
git merge 被合并分支 --将目标分支的修改合并到当前分支
--终止合并
git merge --abort --提交代码前终止本次合并
9.变基rebase
rebase:会将当前分支的分叉点移动到指定分支最新提交的后面,这样两个分支就变成了一个分支。
--基本命令:
git rebase 目标分支 --将当前分支从分叉点开始合并到目标分支最新节点后
--案例:以上面两个图为例
--1.创建三个main提交
git commit -m "main:1"
git commit -m "main:2"
git commit -m "main:3"
--2.创建son分支,并提交两次
git branch son
git switch son
git commit -m "dev:1"
git commit -m "dev:2"
--3.切换到main分支,提交两次
git switch main
git commit -m "main:4"
git commit -m "main:6"
--4.将dev分支嫁接到main分支上,实现上面两个图的效果
git switch son
git rebase main
--总结:Rebase和Merge的区别
Merge:
优点:不会破坏原分支的提交历史,方便回溯和查看
缺点:会产生额外的提交节点,分支图比较复杂
Reabse:
优点:不会新增额外的提交记录,形成线性历史,比较干净
缺点:会改变提交历史,改变当前分支branch out的节点
10.标签
标签就相当于给某个分支的某个节点创建一个快照,即使后续分支的代码变了,这个快照的内容也不会改变,当我们需要回到某个时间点时,可以直接查找标签,从而快速跳转到某个时间点。
例如:我们发布版本的时候都会给某个版本打一个标签V1.0,V2.0等。
--相关命令:
--1.列出已有标签
git tag
--2.创建标签
git tag 标签名
--3.将标签推送至远程仓库
git push 远程仓库别名 标签名
--4.检出标签(将标签的代码拿出来,创建一个新的分支)
git checkout -b 分支名 标签名
--案例:
--1.创建标签
git tag v1.0
--2.查看标签
git tag
--3.将标签v1.0推送到远程仓库
git push origin v1.0
--4.将标签v1.0的内容检出到一个新的分支sss中
git checkout -b sss v1.0
八、IDEA 中使用 Git
1.创建仓库的两种方式
-
创建本地仓库
-
从远程仓库克隆
2.配置忽略文件
配置
.gitignore文件
3.提交代码到暂存区【可以不操作】
在IDEA使用Git时,可以跳过这一步操作,因为提交代码的时候他默认自己进行这一步操作
4.提交代码到版本库
-
点击左侧的
commit按钮,点击小眼睛,勾选上目录、模块,这样显示更清楚【说明:老版本在右上角,是一个绿色的对号】 -
选中需要提交的代码【
.gitignore文件需要提交】,输入本次提交描述,然后按情况选择commit或commit and push
5.查看提交日志
-
方式一:选中相应的文件或文件夹,然后右键,如下图选择
-
方式二:点击IDEA提供的图标
6.版本回退
如果提交之后发现提交错了,需要回退版本,在版本日志界面选择对应的版本右键如图选择即可,回退的参数根据实际情况自己选择。
7.关联远程仓库
-
没有远程仓库,直接分享
没有远程仓库,则直接从IDEA分享后,他会自己在版本管理平台创建远程仓库
-
有远程仓库,关联仓库
8.推送代码到远程仓库
9.拉取远程仓库代码
10.新建分支
11.切换分支
点击需要切换的分支,选择
checkout
12.合并分支
将指定分支合并到当前分支。选择切换到主分支,将子分支合并到主分支。
13.冲突解决
当同一个文件的同一行同时改变时,会造成合并冲突,需要手动解决。
合并冲突页面双击冲突文件,合并到中间的文件上即可。
九、案例
-
多人单分支开发
如果多个人在同一个git分支提交,那么别人提交代码到远程仓库之后,就会导致我们的代码版本落后与远程仓库代码版本,这样当我们push自己的代码时会报错。然后我们会使用
git pull拉取远程仓库代码。但是这个操作会有如下问题:
git pull操作底层是git fetch+git merge(拉取代码并合并),这样查看操作日志git log时就会很乱,查看分支状态时也会产生两个分支合并的效果,所以我们可以使用git pull --rebase命令拉取远程代码,这个命令会不会产生分支合并效果,而是实现了rebase效果最后说明:如果多分支合并代码,推荐
git merge,如果单分支合并可以使用git pull或git pull --rebase,这个见仁见智,各有所好。