目录
11.将本地分支push到远程仓库(暂时还没学远程仓库,先记着)
Git初识
1.为什么使用Git?
之前做开发的时候,如果需要更新代码的内容,上线新的版本,需要手动复制,就是这样
既麻烦又不清楚每一次更新了什么内容
2.Git是什么?有什么用?
- Git是一款软件,一款免费开源,分布式的代码版本控制系统,帮助开发团队维护代码
- 作用:记录代码内容,切换代码版本,多人开发时高效合并代码内容
3.需要学习Git的什么?
- 如果是个人开发使用:Git基础命令和概念
- 如果是多人共享使用:团队开发同一个项目的代码版本管理
Git安装
1.下载
本章节使用的版本是 v2.44.0 -64bit.exe
官网:Git - Downloading Package (git-scm.com)
2.安装
无脑安装就行,全部默认下一步,有好多选项乱七八糟的英文看不懂就不看了
安装结束后,多了一个控制台,应该是bash终端(git专用)
3.检验安装
VSCode检验安装(老师推荐使用这个终端)
安装成功后,重启VSCode发现多了一个控制台选项Git Bash
Bash终端检验安装
控制台检验安装
4.Git配置用户名信息
配置:用户名和邮箱,应用在每次提交代码版本时表明自己身份
git config --global user.name "用户名"
git config --global user.email "邮箱"
5.教Git认识中文(黑马删视频了,唉)
参考教程:GIT使用log命令显示中文乱码 - 颜子歌 - 博客园 (cnblogs.com)
不配置这一步的话,Git不认识中文就乱码
解决方案:
- 首先,让Git学会怎么解码中文
// 提交信息时,Git 会使用 UTF-8 编码来保存这些信息 git config --global i18n.commitencoding utf-8 // 在输出日志(例如 git log 命令输出)时使用 UTF-8 编码 git config --global i18n.logoutputencoding utf-8
- 然后,让系统知道怎么解码中文
$ export LESSCHARSET=utf-8
- 再教Git Bash解码中文
然后就没问题啦
6.Git Bash设置右键菜单栏(否则不能粘贴)
ctrl/shift + insert 复制/粘贴
7.Git Bash文件目录切换
cf 文件夹/
8.检验配置
git config -l
9.账号密码持久化
输入这行后,以后还会再输入一次
git config --global credential.helper store
Git仓库
Git 仓库(repository):记录文件状态内容的地方,存储着修改的历史记录
就是一个隐藏的.git文件夹
1.创建Git仓库
有两种方式
- 将本机的一个文件夹转换为Git仓库:命令 git init
- 从其他服务器上克隆Git仓库
暂时先使用第一种:在本地创建Git仓库
git init
Git三个区域
工作区:实际开发时操作的文件夹
暂存区:保存之前的准备区域(暂存改动过的文件),在 .git/index中
版本库:提交并保存暂存区中的内容,产生一个版本快照,在 .git/objects中
命令 | 作用 |
---|---|
git add 文件名(相对路径) | 暂存指定文件 |
git add . | 暂存所有改动的文件 |
git commit -m "注释说明" | 提交并保存,产生版本快照 |
1.将要更新的文件添加至暂存区
版本库 .git/objects中产生一个 40为hash值命名的文件
我并没有提交只是做一次保存,也产生了版本快照?怎么跟老师说的有点不一样呢?
2.更改文件内容
3.保存
- 可以只保存一个改动过的文件 git add 文件名
- 也可以保存目录中所有改动过的文件 git add .
git add webpack_code/public/index.html
4.查看暂存区列表
git ls-files
5.确认产生一次版本记录,commit提交
6.查看效果
版本库里多了一堆版本快照
还多了一个文件记录每次更改的内容
双击打开文件
还多了HEAD日志
7.查看提交历史
git log --oneline
8.查看提交列表
git ls-tree -r HEAD
Git文件状态
Git 文件 2 种状态:
未跟踪:新文件,从未被 Git 管理过
已跟踪:Git 已经知道和管理的文件
第一列是暂存区状态
第二列是工作区状态
文件状态 | 概念 | 场景 |
---|---|---|
未跟踪(U) | 从未被 Git 管理过 | 新文件 |
新添加(A) | 第一次被 Git 暂存 | 之前版本记录无此文件 |
未修改('')【为空】 | 三个区域统一 | 提交保存后 |
已修改(M) | 工作区内容变化 | 修改了内容产生 |
案例阐述:新建一个CSS文件(U),修改后 git add保存到暂存区,此时这个文件从U变成A,因为是第一次被暂存,还未提交过,没有产生版本记录,那么此时误删CSS文件,不好意思,无法恢复。
没有被git add过的文件会一直显示U,文件只有在第一次git add过的时候才会显示A,再存就不显示了
1.查看文件状态命令
创建一个css文件,git add保存到暂存区后,启动命令
git status -s // 查看暂存区和工作区所有文件的状态
修改css文件
Git暂存区作用
暂存区:暂时存储,可以临时恢复代码内容,与版本库解耦
如果没有暂存区就会多次commit提交,正常情况下,我们只会多次修改,到最终才会提交一次,这就是暂存区的作用
1.暂存区恢复文件
将文件git add到暂存区后,再次更改工作区文件,改了半天突然不想改了,怎么办呢?
通过这行命令将暂存区的旧文件覆盖工作区刚改的新文件。
git restore 目标文件
2.移除暂存区文件
之前git add存的文件不想要了怎么办?
git rm --cached 目标文件
Git忽略文件
概念:.gitignore 文件可以让 git 彻底忽略跟踪指定文件
目的:让 git 仓库更小更快,避免重复无意义的文件管理
例如:
1.系统或软件自动生成的文件
2.编译产生的结果文件
3.运行时生成的日志文件,缓存文件,临时文件等
4.涉密文件,密码,秘钥等文件
创建:
1.项目根目录新建 .gitignore 文件
2.填入相应配置来忽略指定文件
注意:如果文件已经被暂存区跟踪过,可以从暂存区移除即,所以尽量.gitignore文件在项目刚开始就写好
.gitignore
# 忽略 npm下载的第三方包 node_modules # 忽略分发文件夹 dist # 忽略VSCode配置文件 .vscode # 忽略秘钥文件 *.pem *cer # 忽略日志文件 *.log # 忽略.history历史文件夹(可能是一个插件生成的) .history
Git提交所有文件
也不是所有文件啦,就是给一整个前端项目提交上去,除了.gitignore文件里忽略的
Git换行符问题
参考我的这篇博客:Git win与linux换行符转换的问题-CSDN博客
Git还原版本 (难点)
黑马老师讲的不清楚,也可能是我脑子有问题,最后找到了一个视频,通俗易懂的:Git reset三种常用模式区别和用法_哔哩哔哩_bilibili
概念:把版本库某个版本对应的内容快照,恢复到工作区/暂存区
还原命令有三个:
- git reset --soft
- git reset --mixed
- git reset --hard
后面的参数可以是版本号(推荐),还有其他等等,反正我也不用
- git reset HEAD~<n>
git reset的三个模式,都能达到这种目的,不过不同的模式对于工作区和暂存区的影响是不同的
假如只提交一个文件 README.md,修改了两次,保存了三次,提交了三次
1.soft模式
只会覆盖HEAD的文件集合,只会将版本库(HEAD)里的 被reset的文件的版本回退到了v2版本,工作区和缓存区的版本依旧是最新版
如果想回到reset之前的状态,也就是全部最新版,只需要再次执行commit,将HEADv2升级到v3
2.mixed模式(默认模式)
保留了工作区的文件版本不回退了,但是将缓存区和版本库里的文件版本回退了
如果想回到reset之前的状态,也就是全部最新版,需要先git add将缓存区v2 升级到 v3,再commit将HEADv2升级到v3
3.hard模式
工作区、缓存区和HEAD全部还原旧版本,就是说,重新开发,之前的不要了
Git删除文件
不想让自己的项目中出现某个文件了,怎么办呢?
需要保证工作区、缓存区和HEAD中都不在出现这个文件
- 第一步,先手动删除工作区的文件
- 第二步,有两种办法,第一种,直接git add .覆盖缓存区;也可以手动删除缓存区的文件【git rm -cached 文件名】
- 第三步,此时工作区和缓存区都没有那个文件了,直接commit
1.Git删除缓存区命令
git rm -cached 文件名
Git分支(重点)
1.什么是分支?
什么是分支呢?在电影中常常有平行宇宙这个概念,而分支就像是平行宇宙,不同的分支互不影响。
分支常用于多人协作开发时,每个开发人员在自己的分支上实现相应功能,当功能实现后,再将分支内容合并到主分支上,这样大大提高了开发效率。
在初始化本地Git仓库时,Git已经默认帮我们创建了一个名字叫master/main分支,通常我们把这个master分支叫做主分支。
开发的时候,可能不止master/main一个指针,还可能有public、content什么的
2.分支的使用场景
1.开发新需求:我正在开发登录页面,开发完成后,公司招了一个新前端,要他继续开发新功能,我不想让他影响我已经开发好的部分,就会创建一个新分支给他,他将在我开发好的那一版本C5接着开发,等他开发完成,就合并
2.修补bug,同上,最终合并
3.初步使用
- 假设已经开发了一部分了,并add到缓存区,commit到HEAD了
- 创建并切换到content分支
- 开发新功能,开发哈哈哈页面
- 添加到缓存区
- commit到HEAD
- 再开发一个css样式表,同样的操作
- 切换master分支,回到最初的样子(重点)
说明,分支可以保证多人协同开发互不影响
4.查看分支列表
// 查看本地分支
git branch
// 查看远程分支
git branch -r
// 查看本地分支 和 远程分支
git branch -a
5.创建新分支(功能分支)
专门用来开发新功能的分支,临时从master主分支上分叉出来的。当分支被合并时,功能分支就不在有意义了。所以功能分支的生命周期短
git branch 分支名称
6.切换分支
当我们需要写编写功能代码时,我们就需要切换到该分支上书写,如果直接在主分支上写会不利于代码的维护。
git checkout 分支名称
7.创建并切换分支
git checkout -b 分支名称
8.合并分支
在功能分支上书写完全部代码后,我们需要将功能分支上的内容合并到主分支上,让主分支拥有该功能。注意:在合并分支时,我们不能处于需要合并的分支上。例如想要将C分支合并到A分支上,必须先切换到A分支上,再合并C分支。
而且,合并的分支并不会被删除,只是将功能合并
git merge 分支名称
双人协同开发
三人协同开发
教程(这个黑马老师讲的比较清楚):Git-13.分支-合并与提交_哔哩哔哩_bilibili
9.合并冲突
需求1:基于 master 新建 content分支,完成发布文章业务,然后修改内容页面的 html 文件的 title 标签,并提交一次
需求2:切换到 master,也在修改内容页面的 html 文件的 title 标签,并提交一次
冲突:把 content分支合并到 master 回来,产生合并冲突
概念:不同分支中,对同一个文件的同一部分修改,Git 无法干净的合并,产生合并冲突
制作一个合并冲突
解决方案
1.跟小组成员讨论一下,到底要哪个,还是都保留,然后用VSCode提供的工具处理
2.保存提交,合并成功删除content
10.删除分支
当功能分支被合并后,该分支就没有意义了,此时需要删除分支。删除时也不能处于即将被删除的分支上。例如想要将C分支删除,当前不能处于C分支上。
git branch -d 分支名称 // 若还有未被合并的分支会提示
git branch -D 分支名称 // 强制删除分支
11.将本地分支push到远程仓库(暂时还没学远程仓库,先记着)
第一次将本地分支推送到远程仓库:
// -u表示把本地分支和远程分支进行关联,只在第一次推送的时候需要带 -u参数
git push -u [远程仓库的别名] [本地分支名称]:[远程分支名称]
// 实际案例:
git push -u origin payment:pay
// 如果希望远程分支的名称和本地分支名称保持一致,可以对命令进行简化
git push -u origin payment
12.查看远程仓库中所有的分支列表
git remote show 远程仓库名称
13.跟踪分支
git checkout 远程分支的名称
14.拉取远程分支的最新版代码
git pull
15.删除远程分支
git push 远程仓库名称 --delete 远程分支名称
16.总结
其实在真正进行项目开发时,我们并不会只开一个核心分支,一般是master分支和develop两个核心分支,在必要时还会开启relase分支进行bug测试。在实际开发中按需要创建、合并分支。
另外在团队协作开发时,我们每天都需要将本地git仓库上传到远程仓库。
Git远程仓库
通俗来说,就是将本地仓库复制一份到网络服务器上
概念:托管在因特网或其他网络中的你的项目的版本库
作用:保存版本库的历史记录,多人协作
创建:公司自己服务器 / 第三方托管平台(Gitee,GitLab,GitHub...
1.本地Git仓库添加远程仓库
本章节使用Gitee码云来管理仓库
// 本地Git仓库添加远程仓库原点地址, 别名随便写
git remote add 远程仓库别名 远程仓库地址
// 例如:git remote add origin https://gitee.com/lidongxu/work.git
// 本地Git仓库推送版本记录到远程仓库
git push --set-upstream 远程仓库别名 本地分支名:远程分支名
// 例如:git push -set-upstream origin master:master
// 关联多个远程时,通过 -u 指定默认分支,则可以使用 git push 直接推送指定的默认分支
简写:git push -u origin master
第一次使用会弹出登录框,填写gitee账号密码,给邮箱私有化关掉,否则不等登录
建立成功
2.查看本地Git仓库有哪些远程仓库地址
git remote -v
3.移除添加过的远程仓库地址
git remote remove 远程仓库别名
4.gitee许可证我选择哪个?
5.开源自己的仓库
开发完后,可以开源什么的
6.如果Gitee网站换号了,如何继续使用原来的仓库?
win10搜索,凭据管理器(我也没经历过,先记下来)
给这个删了,再访问远程仓库就可以重新输入新的账号密码了
7.远程仓库-克隆(重点)
克隆:拷贝一个Git仓库到本地,进行使用
// 例如 git clone https://gitee.com/lidongxu/work.git
git clone 远程仓库地址
效果:在运行命令所在文件夹,生成work项目文件夹(包含版本库,并映射到暂存区和工作区)
前提
- Git本地仓库与远程仓库建立连接
- 仓库公开随意克隆,推送(push)需要身为仓库团队成员
- 新建一个空白文件夹
- 打开Gitee随便找一个项目复制.git地址
- 在空白文件夹右键打开Git Bash,输入git clone
- 项目下载下来了,进入有.git的目录查看日志
- 用VSCode打开项目
8.模拟多人协作开发(重点)
1.02开发代码 -> 工作区 -> 暂存区 -> 提交 -> 拉取(可选)-> 推送
2.01 -> 拉取(后续也可以开发代码 -> ... -> 推送)
3.想要看到别人同步上去的最新内容:git pull origin master 等价于
git fetch origin master:master(获取远程分支记录到本地,未合并)
git merge origin/master (把远程分支记录合并到所在分支下)
推送与拉取
// git push 远程仓库别名 远程仓库主分支:本地分支
git push origin master:content
// git pull 远程仓库别名 远程仓库主分支:本地分支
git pull origin master:content
// 本地Git仓库推送版本记录到远程仓库
git push --set-upstream 远程仓库别名 远程分支名:本地分支名
// 例如:git push -set-upstream origin master:master
// 关联多个远程时,通过 -u 指定默认分支,则可以使用 git push 直接推送指定的默认分支
简写:git push -u origin master
创建两个空文件夹
分别克隆Gitee上的项目
02开发一个模块后保存提交推送
02开发 -> 工作区更新 ->暂存区同步更新 ->本地版本库同步更新 ->远程版本库同步更新
之后01开发另一个模块,拉取达到同步的目的
第二天01接着开发,要先拉取
此时01的代码也会同步更改
9.Git标签
10.IDEA中集成Git
确保本地安装了Git,再进行配置
解除Git对项目的管理
- 手动删除.git
- IDEA设置
将锐鸡歪麦交给新远程仓库管理
- 由于 本地仓库与远程仓库没有共同的提交历史,而远程仓库已经存在文件(readme.md),为了防止这两个仓库的历史不会交叉,需要先拉取,加上参数:--allow-unrelated-histories
- 当你从一个完全独立的 Git 仓库(如新创建的远程仓库)拉取内容时,通常会导致 Git 报错,提示无法合并,因为没有共同的父提交。加上
--allow-unrelated-histories
参数可以绕过这个限制,使得 Git 允许合并这些不相关的历史记录
1.创建一个远程仓库
2.给本地项目初始化一个本地仓库
3.将本地仓库添加到远程仓库
git add remote [给远程仓库起个别名] [远程仓库链接]
4.检查是否添加成功
git remote -v
5.确认win凭证
6.将项目添加本地仓库的暂存区
git add *
7.检查是否添加成功
git ls-files
8.将本地暂存区提交到本地版本库
git commit -m "description ..."
9.检查是否提交成功
git log --oneline
10.无障碍拉取远程仓库
git pull [远程仓库别名] [远程仓库分支]:[本地仓库分支] --allow-unrelated-histories
11.将本地版本库提交到远程仓库
git push [远程仓库别名] [远程仓库分支]:[本地仓库分支]
Git命令合集
命令 | 作用 | 注意 |
---|---|---|
git -v | 查看 git 版本 | |
git init | 初始化 git 仓库 | |
git add 文件标识 | 暂存某个文件 | 文件标识以终端为起始的相对路径 |
git add . | 暂存所有文件 | |
git commit -m '说明注释' | 提交产生版本记录 | 每次提交,把暂存区内容快照一份 |
git status | 查看文件状态 - 详细信息 | |
git status -s | 查看文件状态 - 简略信息 | 第一列是暂存区状态,第二列是工作区状态 |
git ls-files | 查看暂存区文件列表 | |
git restore 文件标识 | 从暂存区恢复到工作区 | 如果文件标识为 . 则恢复所有文件 |
git rm --cached 文件标识 | 从暂存区移除文件 | 不让 git 跟踪文件变化 |
git log | 查看提交记录 - 详细信息 | |
git log --oneline | 查看提交记录 - 简略信息 | 版本号 分支指针 提交时说明注释 |
命令 | 作用 | 注意 |
---|---|---|
git reflog --oneline | 查看完整历史 - 简略消息 | 包括提交,切换,回退等所有记录 |
git reset 版本号 | 切换版本代码到暂存区和工作区 | --soft 模式保留暂存区和工作区原本内容 --hard 模式不保留暂存区和工作区原本内容 --mixed 模式不保留暂存区,工作区保留(默认) 先覆盖到暂存区,再用暂存区对比覆盖工作区 |
git branch 分支名 | 创建分支 | |
git branch | 查看本地分支 | |
git branch -d 分支名 | 删除分支 | 请确保记录已经合并到别的分支下,再删除分支 |
git checkout 分支名 | 切换分支 | |
git checkout -b 分支名 | 创建并立刻切换分支 | |
git merge 分支名 | 把分支提交历史记录合并到当前所在分支 |
命令 | 作用 | 注意 |
---|---|---|
git remote add 远程仓库别名 远程仓库地址 | 添加远程仓库地址 | 别名唯一,地址是 .git 结尾的网址 |
git remote -v | 查看远程仓库地址 | |
git remote remove 远程仓库别名 | 删除远程仓库地址 | |
git pull 远程仓库别名 分支名 | 拉取 | 完整写法:git pull 远程仓库别名 远程分支名:本地分支名 等价于:git fetch 和 git merge |
git push 远程仓库别名 分支名 | 推送 | 完整写法:git push 远程仓库别名 本地分支名:远程分支名 -u:建立通道后以后可以简写 git push |
git pull --rebase 远程仓库别名 分支名 | 拉取合并 | 合并没有关系的记录 |
git clone 远程仓库地址 | 克隆 | 从0得到一个远程的Git仓库到本地使用 |