目录
1 git命令与状态
1.1 常用git命令
- git init 将当前目录转化为git仓库
- git statue -s 已精简的方式查看仓库状态,等同于git statue --short
- clear 清空终端显示结果
- git add . 添加该路径下的所有文件到暂存区
- git commit -m "描述提交信息" 提交暂存区的所有文件,-m如果不写会麻烦些,而且打几个空格是不会生效的,所以每一次提交必须写一点儿什么
- git reflog --pretty=format:"%h | %an | %ar | %s" 简要查看所有版本情况
- git clone 仓库地址 将仓库克隆到本地
- git remote add 仓库名 仓库地址 关联远程仓库,比如 git remote add origin git@gitee.com:Suyuo/css-notes.git
- git remote rm 仓库名 取消关联指定的远程仓库,比如 git remote rm origin
- git push -u 仓库名 分支名:远程仓库分支名 将本地仓库推送到远程仓库,:远程仓库分支名可以不写,比如 git push -u origin master
- git pull 在远程仓库中获取分支最新代码并搞到本地
1.2 不那么常用的git命令
- git config --global user.name "用户名" 设置用户名
- git config --global user.email "邮件地址" 设置右键地址
- git config --list --global 查看所有全局配置项
- git reset HEAD . 移除暂存区的所有文件
- git help 可以查看git的帮助,一般应该不会看这个,直接去百度看了。如果想查看config相关的帮助可以使用git help config,之后会跳出一个config信息相关的网页。也可以使用git config -h 获取简洁的帮助信息
- git config user.name 查看指定的全局配置项,前面那个是查看用户名,如果要查看email就是user.email
- git statue 查看git仓库状态
- git add 文件名 添加路径下指定的文件到暂存区
- git checkout -- 文件名 还原git仓库中所保存的版本,两个横杠与文件名之间有个空格
- git reset HEAD 文件名 取消指定已暂存的文件
- git commit -a -m "描述提交信息" 跳过暂存区直接提交到git仓库
- git rm --cached 文件名 从git仓库移除文件
- git rm -f 文件名 从git仓库与工作区中移除指定文件
- git reset --hard 版本哈希值 选择指定的版本
- git clone 远程仓库地址 将远程仓库克隆到本地
- git branch 查看所有分支列表
- git branch 分支名 创建新分支
- git checkout 分支名 切换到指定的分支
- git checkout -b 分支名 创建并切换到新创建的分支
- git merge 分支名 合并分支
- git brance -d 分支名 删除分支
- git remote show 远程仓库名称 查看远程仓库分支
1.3 常见状态
- 两个红色的问号 未处理
- 绿色的A 已暂存
- 红色的M 提交后又进行了修改,未加入暂存
- 绿色的M 提交后又进行了修改,已加入暂存
- 绿色的D 提交后从仓库移除的文件,且在缓存中
- 两个红色的U 合并冲突
2 一些概念
2.1 版本控制
如果将项目的所有文件都存在本地,有这么几个缺点
- 无法多人同时对项目文件进行修改,每个人修改后再粘贴进去比较麻烦
- 如果不写文档,无法得知具体做了那些修改
为解决种种的不方便可以使用版本控制软件,版本控制软件基本分为 本地版本控制系统,集中化版本控制系统与分布式版本控制系统,总的来讲分布式优于集中化,集中化优于本地
关于版本控制的更多理论可以看一下视频 01.版本控制的概念_哔哩哔哩_bilibili
2.2 git简介
git是版本控制软件之一,属于分布式版本控制系统。
区域分为工作区,暂存区与Git仓库。
状态分为 已被git管理与未被git管理。
已被git管理中包含三种状态,分别是已修改,已缓存,已提交
关于git详细介绍看一下这个 黑马程序员AJAX零基础到精通_整合Git核心内容全套教程_哔哩哔哩_bilibili P77-P78
2.3 开源许可协议
有很多开源许可协议,我们主要了解其中两种常见的协议需要注意的点
GPL
- 不允许修改后和衍生的代码作为闭源的商业软件发布和销售
- 如果你使用的GPL协议的源码,你的项目也必须遵循GPL
Linux遵循GPL协议,按照道理来讲,你使用了GPL的开源内容,你的项目就不许卖钱了
MIT
- 在修改后的代码或发行包中,必须包含作者的许可信息
像jQuery,Node.js都遵循MIT协议,当你使用了MIT的开源内容,你的项目卖出去后需要包含人家原作者的信息
3 常见git操作
3.1 下载git
之后下载一个git,地址 Git
我的是64位,我就选64位了
3.2 安装git
next
选择安装路径后点击next
next
next
右键任意文件夹空白处可以看到Git GUI Here与Git Bash Here就代表git安装成功了
3.3 配置用户信息
- git config --global user.name "用户名" 设置用户名
- git config --global user.email "邮件地址" 设置右键地址
用户名和邮件地址都是字符串,自己随便写就行,如果使用了--global那么在该机器上可以一直生效,我们搞一下,随便找个地方点击右键,然后点击Git Bash Here
点击后会显示一个终端
之后设置用户名为 Suyu
之后设置邮箱
git的配置会存在 C:\Users\MSI(计算机用户名)文件夹下的.gitconfig下
我当前的内容是这样的,下面credential gitee是我以前用过的痕迹
可以通过命令查看所有全局配置项
3.4 初始化仓库
初始化仓库就是自己的本地目录转换成git仓库,我们现在在这个目录下初始化一个git仓库
在当前目录下的空白处右键,然后点击git Bash打开git终端,之后输入git init
输入完毕后会多出一个.git的文件夹,这个就是我们的git仓库
这个文件夹是隐藏的,点击左上角的查看,勾选上隐藏的项目就可以看到这个文件夹了
3.5 查看git仓库状态
可以通过git status查看git仓库的状态,我当前的状态仓库是空的,什么都没有添加进去,他会告诉你在当前目录下,什么东西没有被添加进去(未被追踪),红色字代表未被追踪的东西
一般我们使用git status -s 来查看仓库各文件的状态,红色的两个问号就代表这个文件未被追踪
3.6 将文件添加到缓存区
可以使用git add + 文件名来跟踪一个指定的文件,比如当前我想跟踪.idea这个文件夹
- 输入文件名+尾缀可以添加单独文件
跟踪后可以再次查看状态,发现.idea下面的所有文件都被追踪上了,绿色的A表示文件处于暂存状态
3.7 提交暂存区内的所有文件
输入 git commit -m "提交了idea"
再次查看状态后发现暂存区的文件没有了,而且idea也不在红色的问号后
3.8 对已提交的文件进行修改
我们当前在.idea中加入一个123.txt
这个时候再检查状态就出现了添加的123.txt
由于是新的文件,所以会出现两个问号,我们可以将其暂存然后提交上去
现在我们修改一下123.txt的内容,修改后再次查询状态,发现123.txt的前面有一个红色的M,这个表示这个文件的内容发生了变化,而且还没有放入暂存区中
可以给123.txt再次加入暂存区,添加后会变成一个绿色的M
和以前方式一样提交就行了,提交后123.txt会消失
3.9 还原git仓库中所保存的版本
我当前的123.txt内容是这样的,这个也是git仓库中保存的版本
现在我给他改成这样
现在我想改回去,可以使用git checkout -- .idea/123.txt 命令
改回去就不能再改回来了,慎用
输入完之后这个123.txt就改回来了
3.10 将所有文件都加入暂存区
一个项目中的文件有很多,我们当前还要这些没添加,使用git add . 就可以将该路径的所有文件都加入到暂存区
- 红色的M,红色的问号,使用git add .都会变为绿色的
- 文件数量多的时候会等待一会儿
查看状态会发现所有的文件前面都有绿色的A(已被放入缓存区)
3.11 取消已暂存的文件
现在我们想取消1.py的暂存,斜杠注意要是左斜杠,取消之后再检查这个1.py就不在缓存区了
- 不需要输入转义后的中文字符,直接输入中文就可以了
可以使用 git reset HEAD . 移除所有已缓存的文件,这样缓存的操作就都被取消了
3.12 跳过暂存区直接提交到git仓库
未追踪的文件没法跳过,只能跳过已暂存的,我们修改一下123.txt,修改后123.txt就变成了未暂存状态
我们使用git commit -a -m "" 进行直接提交
再次查看状态发现已经没有123.txt这个文件了
.13 从git仓库移除指定文件
我们现在想从git仓库中移除123.txt
查看状态发现123.txt前面有绿色的D,也有两个红色的问号
在提交后,git仓库中的123.txt消失
此时工作区(文件夹)中的123.txt依然存在
3.14 从git仓库与工作区中移除指定文件
相当于把这个文件彻底删掉,这个文件必须在git仓库中,如果没在git仓库中会提示这个
将123.txt搞到缓存中,然后删除,查询状态发现是绿色的D,但并没有两个红色的问号
因为此时的123.txt已经被彻底删除了,而且你无法在回收站中找到它
再次提交后在git仓库中也删除掉
3.15 git忽略文件
有一些文件我们不想让其出现在未跟踪的文件列表中,我们可以创建一个.gitignore文件来忽略文件
.gitignore文件的常用语法如下
- 以#开头的是注释
- 以/结尾的是目录
- 以/开头的是防止递归,不递归就是只忽略当前路径文件,但并不忽略其他路径下同样名称的文件
- 以!开头的是取反,比如你已经忽略的所有的txt文件,但有一个123.txt文件是你想要的,那么你写!123.txt就可以取消忽略
- 可以使用glob模式(一种正则表达式)进行文件和文件夹的比配,下面说一下glob的常用正则表达式符号
- 星号*匹配一个或多个任意字符,比如你想忽略所有js文件,你就可以写 *.js
- 中括号匹配在中括号内的任意一个字符,比如[abc]就是匹配a,b,c中的任意一个字符
- 问号?只匹配一个任意字符
- 方括号的横杠表示范围,比如[0-9]就是匹配0,1,2,3,4,5,6,7,8,9中的任意一个字符
- 两个星号表示匹配任意中间目录,比如我现在想找这个目录中的文件 D:/Ajax_demo/8.跨域请求/2.JSONP/2.jQuery中的JSONP/1.默认情况.html 那么就可以写成 D:/**/1.默认情况.html 当然这样就要求你在D盘下不能有重复名称的文件
视频中做了几个例子非常直观,可以看一下
现在我们创建一个.gitignore,用新建文本文档的方式创建,然后把名称和后缀都改了
之后可以用记事本打开,现在我们想忽略jquery-3.6.1.min.js与2.jQuery中Ajax的get与post请求目录下的所有文件
那么我们可以这样写
当涉及到中文的时候,你需要将.gitignore另存为一下,注意编码一定为UTF-8,这样中文就能生效了
保存后再次查看状态发现 jquery-3.6.1.min.js与2.jQuery中Ajax的get与post请求目录下的所有文件 不在未追踪范围内了
3.16 查看提交历史
输入git log可以查看所有的提交历史,越近的提交越靠上
当不想看了的时候按q退出
可以通过git log -数字 查看最近的几次提交,比如我想看最近的5次提交,使用这个命令不需要按q退出
可以加入--pretty=oneline让日志都在一行进行显示
oneline也可以配合 -数字 使用
也可以对日志进行查询 git log --pretty=format:"%h | %an | %ar | %s"
- %h 是提交的简写哈希值
- %an 是作者
- %ar 是距离现在多长时间
- %s 是提交说明
同样可以加入 -数字 进行筛选
3.17 将项目回退到指定版本
首先先查看所有的版本
我现在想让其恢复到 e6aacef 直接提交这个版本,输入 git reset --hard e6aacef
- e6aacef 是该版本的哈希值,在版本不多的时候可以给简写,如果有两个的简写都是 e6aacef 那么通过pretty=oneline查看哈希的全貌
由于我们回退了版本,所以我们之前删除的123.txt这个文件回来了
可以通过 git reflog --pretty=format:"%h | %an | %ar | %s" 简要查看所有版本情况,这里面是有回退后的版本的,当前用的版本在最上面
现在我先换回 beca0ff 这个版本,我们再使用同样的方法切换回来
4 gitee
gitee是共享代码的平台,gitee是国内的,github是国外的,使用方法上类似,不仅是界面类似,上传,创建项目这些也类似,下面说几个常用的功能
4.1 常用功能
可以在Pull Requests中为项目做一些贡献,比如修bug之类的
可以在Issues提出一些自己的问题,作者及其他开发者可能会看到然后帮你搞定
可以使用Fork在别人代码的基础上做修改,并将其变为自己的项目
4.2 创建空白仓库
在右上角点击新建仓库
输入名称后会自动补全路径,之后点击创建
创建之后会跳转到这个页面
4.3 上传文件至仓库
我们可以通过HTTPS与SSH两种方式访问仓库,使用HTTPS是零配置,但是每一次都需要输入用户名与密码,使用SSH需要稍稍配置一下,之后每一次都不用输入用户名与密码,实际开发中建议使用SSH方式
https开头的是HTTPS方式
git@开头的是SSH方式
上传之前要设置用户名与邮箱,这个按照提示走就可以了
4.3.1 HTTPS上传文件至仓库
创建一个本地的git仓库
把文件加入缓存区
提交到本地
关联云端仓库
推送到云端仓库
再次点击代码就有了提交的东西了
如果你有所更改就再执行一遍上面的流程就可以了,最后只输入git push就可以了,比如我现在把工作区搞成这样,上面上传的所有内容都放在了代码中,然后又增加了一个名为分析的文件夹
先暂存
提交到本地
由于是非首次提交所以可以直接git push
发现工作区的东西已经上传上去了
4.3.2 SSH上传文件至仓库
我们再新建一个仓库
SSH方法需要SSH key ,SSH key由两部分组成分别是id_rsa(私钥文件,存放在客户端的电脑上),id_rsa.pub(公钥文件,需要配置在gitee上)
首先生成私钥在git bash中输入 ssh-keygen -t rsa -b 4096 -C "账号注册的邮箱地址"
- 如果没有用邮箱进行注册可以在gitee中绑定账号
- 如果实在不想用邮箱地址给个任意字符串也行
输入后会让你看这个私钥放在哪里,选择默认的地方就好了
之后让你确认密码,使用默认的就完了
再之后确认密码,依然是按一下回车
按三次回车后就创建完毕了
创建完毕后你就可以在指定的路径下看到这两个文件了
4.3.2.2 生成公钥
用记事本打开id_rsa.pub,复制其中的所有内容
之后点击个人中心的SSH公钥
粘贴进去后点击确定
输入你当前账号的密码
可以从本地检验一下公钥是否配置成功,输入 ssh -T git@gitee.com ,当提示是否连接的时候输入yes,出现下面这张图就表示配置成功了
- 如果是github就是 ssh -T git@github.com
4.3.2.3 上传
如果之前对邮箱做了修改这里需要重新配置邮箱的信息
剩下的操作就类似了
建立远程连接,远程连接的地址是与http方式不同的,在建立一个新的项目时会有提示
这个路径不用去记,在上传后点击 克隆下载 会出现一样的地址
上传
后面想再上传在本地提交后直接用git push就可以了
再次去看gitee上的仓库发现上传成功
4.4 将远程仓库克隆到本地
在仓库中点击下载可以下载一个压缩包,解压后就是仓库的内容
也可以使用git clone 仓库地址 将仓库下载下来,仓库地址就是 git@gitee.com:Suyuo/html5-notes.git 这个是SSH方式的地址,你也可以选择别的方式的地址
首先在想下载的地方打开git bash
然后输入 git clone git@gitee.com:Suyuo/html5-notes.git
- 如果仓库过大需要等待一会儿
下载完毕后就可以在指定的路径找到下载好的仓库了
5 分支
分支可以让多人开发而不相互干扰,比如说做登录功能的你就去做登录,做注册功能的你就去做注册,开发过程中互不干扰,到最后将分支合并会得到完整的项目
master是主分支,我们上面上传的文件都是上传到master中的
master用来保存与记录整个项目已经完成的功能代码,所以我们不允许每一个人都可以在master上修改代码。为了不影响最后的结果所以要每一个人都在各自的分支中进行开发
5.1 查看所有分支
可以使用 git branch查看git仓库中的分支列表,master前面有一个星号,这代表你当前所处的分支是master,命令行上的(master)也是提示你此时正在master分支
5.2 创建新分支
使用 git branch 分支名称 可以创建新的分支
我先在项目中创建一个123.txt但是不写内容
我们现在想创建一个名为login的分支
使用git branch 分支名称 创建分支完毕后,此时你依然在创建前的分支中
新分支的代码与当前分支的代码完全相同,比如我现在创建的login与master的代码就是相同的
5.3 切换分支
切换分支会导致工作区的文件内容发生改变
在master中搞一个123.txt,然后随便写一点内容
然后提交上去
之后使用 git checkout 分支名 切换到别的分支上
这个时候再打开123.txt里面就是空的,因为创建分支的时候就是空的,修改master中的123.txt不会对login中的123.txt造成影响
.4 创建并切换新分支
使用 git checkout -b 分支名 可创建并切换分支
新分支的代码依然与创建前分支的代码完全相同,比如我现在的payment就和login是一样的,而payment和master是没有关系的
所以payment中的123.txt也是空的
在创建分支的时候,我们建议都先切回到master,然后从master创建新分支
5.5 合并分支
在A中合并B会让A中包含B的内容,但并不会更改b的内容,我们先在login中创建一个456.txt,之后向456.txt中随便写点儿东西,让其大小不为0
然后提交
我们下面在master中合并login,们先切回master分支
切回master分支后发现456.txt这个文件消失了
之后将master与login合并到一起
- 我这里会跳出来个窗口问你为什么合并,直接:q就能退出
合并后被合并的分支依然存在
当前master就既有以前master的内容,也有login的内容
而login中的内容没有变化
5.6 删除分支
我们现在删除payment分支,输入 git branch -d payment
- 删除某一个分支不能自己在某一个分支上,比如要删除payment就要从payment上切出来,不切出来就会报错
- 在分支没有合并到主分支之前就删除分支会报错,同时也会给出提示,如果想要强制删除可以使用 git branch -D 分支名称
5.7 合并时发生冲突
刚刚合并master与login的时候,master中只有123.txt,login中只有456.txt(123.txt中没有内容不算),所以不会发生冲突,现在我们在login中的123.txt书写上不同的内容,之后提交,提交后切回master,再次进行合并,此时就会爆发冲突
这个时候你再搞别的操作是不好使的
打开123.txt,发现git把master和login的内容都放在了冲突的文件123.txt中
这个时候你要手动修改冲突的文件
保存后输入 git add . 以及 git commit -m "" 进行暂存与提交
之后你就可以进行其他的操作了
5.8 将分支推送到远程仓库
首先建立本地仓库与远程仓库的联系,如果之前已经建立完了联系可以不建立,我这里就提示origin这个联系已经存在了
我现在想把login分支推送到远程仓库,并在远程仓库中起名叫login_test
上面那个样子就表明已经推送成功了,这个时候去你的远程仓库看一下,发现会多了一个分支
login_test就是你刚刚推送上去的内容
之前推送的master还是原来的内容,此次的推送对master没有任何影响
第一次需要加 -u 以及后面的参数,后面就直接git push就可以了
5.9 查看远程仓库所有分支列表
确认建立本地与远程的联系后,输入 git remote show 远程仓库名称 查看远程仓库所有分支
5.10 将远程分支下载到本地分支
我们先删除本地的 login这个分支
之后再从远程分支上下载下来,输入git checkout login_test 就可以把远程分支的内容下载到本地
这样搞本地分支与远程分支的名称是相同的,也可以搞成不同的
5.11 从远程仓库拉取最新的代码
我们现在在远程仓库上传一个新的文件789.txt,里面随便写一些内容
然后我们输入 git pull ,想要获取哪个分支的最新情况就在哪个分支执行get pull
这样你就拿到了最新更新的内容了
5.12 删除远程分支
可以用可视化的页面来搞
也可以用git搞,现在我想删除 login_test 这个分支,本地你处于哪个分支都行,输入 git push origin --delete login_test
这样远程仓库的login_test分支就没了