【程序员必备】Git学习笔记

164 阅读19分钟

Git

笔记参考视频:【GeekHour】一小时 Git 教程

一、概述

  1. 版本管理工具分类:

    • 分布式版本控制系统--Git
    • 集中式版本控制系统--SVN
  2. 版本管理工具区别:

    • 集中式版本控制系统:版本记录存放在服务器,提交的时候版本记录需要从服务器中读取,服务器挂了就完蛋了。
    • 分布式版本控制系统:每台电脑都有一个完整的版本记录,即使服务器挂了也可以先提交到本地版本库,等中央服务器修好了在同步上去。

二、下载

官网:git-scm.com/

三、工作区域介绍

ef372805-54f1-4a10-82cd-bdbd5a6d07b5.png转存失败,建议直接上传图片文件

Git 工作区一共有三个:

  1. 本地工作区:我们能看到的文件就是本地工作区
  2. 本地暂存区:一个中间区域,临时存储即将要提交到本地仓库的代码
  3. 本地仓库:包含本地代码和版本信息

Git 的工作流程

  1. 文件在工作区修改完成后使用 git add ​提交到暂存区
  2. 确认暂存区的文件需要提交到本次仓库后,使用 git commit ​提交的到本地仓库

四、Git 管理文件的四个状态

image

  • 未跟踪:文件没有被 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 初始化仓库有两种方式:

  1. 本地新建仓库
  2. 克隆远程仓库
--方式一:本地新建仓库
	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 命令介绍:

  1. 作用:可以将本地仓库回退到之前的某个版本,但会丢失回退版本之后的版本【如果想要保存版本提交记录可以使用git revert 回退版本的下一个版本号​】

  2. 三种模式:

    image

    • 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

  1. 作用:

    • 可以查看工作区、暂存区、本地仓库之间的内容差异。
    • 可以查看在不同版本之间的内容差异。
    • 可以查看在两个分支之间的内容差异。
  2. 说明:

    • 无参数:比较工作区和暂存区的内容差异
    • 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 忽略文件

有些文件是系统自动生成的或者仓库中不需要的,那这个文件就可以不添加到版本管理。

例如:

  1. Vue 项目下载的依赖都会存在 node_modules ​里面,这个文件就可以忽略
  2. 使用 IDEA 开发 Java 项目会生成 idea 文件,这个就可以忽略
  3. 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.创建远程仓库

  1. 点击右上角的加号,选择 New Repository

    image

  2. 在页面中输入仓库名字,选择仓库权限,然后创建仓库

    image

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:会将当前分支的分叉点移动到指定分支最新提交的后面,这样两个分支就变成了一个分支。

image

image

--基本命令:
	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.创建仓库的两种方式

  • 创建本地仓库

    image

  • 从远程仓库克隆

    image

2.配置忽略文件

配置.gitignore​文件

3.提交代码到暂存区【可以不操作】

在IDEA使用Git时,可以跳过这一步操作,因为提交代码的时候他默认自己进行这一步操作

4.提交代码到版本库

  1. 点击左侧的commit​按钮,点击小眼睛,勾选上目录、模块,这样显示更清楚【说明:老版本在右上角,是一个绿色的对号】

    image

  2. 选中需要提交的代码【.gitignore文件需要提交​】,输入本次提交描述,然后按情况选择commit​或commit and push

    image

5.查看提交日志

  • 方式一:选中相应的文件或文件夹,然后右键,如下图选择

    image

  • 方式二:点击IDEA提供的图标

    image

6.版本回退

如果提交之后发现提交错了,需要回退版本,在版本日志界面选择对应的版本右键如图选择即可,回退的参数根据实际情况自己选择。

image

7.关联远程仓库

  • 没有远程仓库,直接分享

    没有远程仓库,则直接从IDEA分享后,他会自己在版本管理平台创建远程仓库

    image

  • 有远程仓库,关联仓库

    image

8.推送代码到远程仓库

image

9.拉取远程仓库代码

image

10.新建分支

image

11.切换分支

点击需要切换的分支,选择checkout

image

12.合并分支

将指定分支合并到当前分支。选择切换到主分支,将子分支合并到主分支。

image

13.冲突解决

当同一个文件的同一行同时改变时,会造成合并冲突,需要手动解决。

合并冲突页面双击冲突文件,合并到中间的文件上即可。

image

image

九、案例

  • 多人单分支开发

    如果多个人在同一个git分支提交,那么别人提交代码到远程仓库之后,就会导致我们的代码版本落后与远程仓库代码版本,这样当我们push自己的代码时会报错。然后我们会使用git pull​拉取远程仓库代码。但是这个操作会有如下问题:

    git pull​操作底层是git fetch​+git merge​(拉取代码并合并),这样查看操作日志git log​时就会很乱,查看分支状态时也会产生两个分支合并的效果,所以我们可以使用git pull --rebase​命令拉取远程代码,这个命令会不会产生分支合并效果,而是实现了rebase效果

    最后说明:如果多分支合并代码,推荐git merge​,如果单分支合并可以使用git pull​或git pull --rebase​,这个见仁见智,各有所好。