1、git
1.1 什么是git
Git是目前世界上最先进的分布式版本控制系统(没有之一).简单来说,它是控制项目版本的一个工具
- 服务器保存文件的所有更新版本
- 客户端是服务器的完整备份,并不是只保留文件的最新版本
优点 =>
- 联网运行,支持多人协作开发
- 客户端断网后,支持离线本地提交版本更新
- 服务器故障或损坏后,可以用任何一个客户端的备份进行恢复
托管中心维护远程库
- 内网:可以自己搭建一个GitLab服务器
- 外网:可以使用码云、Github
1.2. 基本工作流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uaulNIaA-1631242704266)(F:\web前端\笔记\img\git资料\git流程.png)]
工作区(Workspace):平时存放项目代码的地方
暂存区(Index/Stage):用于临时存放改动信息
本地仓库(Repository):存放所有提交的版本数据
远程仓库(Remote):托管代码的服务器,如gitee,github
git的工作流程一般是这样的:
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
1.3 安装并配置git
1.3.1 下载git
https://git-scm.com/,下载git对应操作系统的版本。
官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/
vscode安装gitlens插件和git history插件
安装好gitlens后设置好git路径,文件–首选项–设置,点右上角有个小箭头进入设置编辑模式,在里面添加路径,路径在git的安装目录里的bin目录下的git.exe文件,这里切记电脑路径中反斜杠\ 要变成正双斜杠。
"git.path": "D://Program Files//Git//bin//git.exe"
1.3.2常用的Linux命令
平时一定要多使用这些基础的命令!
1)、cd : 改变目录。
2)、cd . . 回退到上一个目录,直接cd进入默认目录
3)、pwd : 显示当前所在的目录路径。
4)、ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。
ls -lA列出隐藏文件
ll .git/: 展示.git目录的子目录和文件
5)、touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
6)、rm: 删除一个文件, rm index.js 就会把index.js文件删除。
7)、mkdir: 新建一个目录,就是新建一个文件夹。
8)、rm -r : 删除一个文件夹, rm -r src 删除src目录
rm -rf / 切勿在Linux中尝试!删除电脑中全部文件!
9)、mv 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。
10)、reset 重新初始化终端/清屏。
11)、clear 清屏。
12)、history 查看命令历史。
13)、help 帮助。
14)、exit 退出。
15)、#表示注释
vim相关操作
vim good.txt
:set num //显示行号
i // 插入编辑
esc // 键盘左上角按钮esc, 退出编辑模式
:wq // 保存退出
1.3.3 配置用户信息
第一件事情,设置自己地用户名和邮箱
-
项目(仓库)级别
仅在当前本地库有效
git config user.name tom #设置用户名tom git config user.email liu@qq.com #设置用户邮箱
信息保存位置:
~/.gitconfig 文件
-
系统用户级别
仅在当前登录的操作系统用户有效
git config --global user.name tom git config --global user.email liu@qq.com
信息保存位置:C:\Users\xxxx\.gitconfig
如果使用了 --global 选项,那么该命令只需要执行一次,即可永久生效
1.3.4 git的全局配置文件
通过 git config --global user.name “” 和 git config --global user.email “” 配置的用户名和邮箱地址,会被写入到 C:\Users\dell.gitconfig 文件中
# 查看所有的全局配置项
git config --list --global
git config -l --global
# 查看指定的全局配置项
git config user.name
git config user.email
1.3.5 获取帮助信息
# 要打开 git config 命令的帮助手册
git help config
# 在终端里面打开
git config -h
1.4 git基本操作
Ctrl+ins 复制 (ins 键盘右上角的Insert)
Shift+ins 粘贴 (shift 键盘上最左下角CTRL键的上面一个上档转换键,也可用于中英文转换)
1.4.1本地仓库搭建
创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。
1、创建全新的仓库,需要用GIT管理的项目的根目录执行:
# 在当前目录新建一个Git代码库$ git init
2、执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面。
1.4.2克隆远程仓库
1、另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地!
# 克隆一个项目和它的整个代码历史(版本信息)$ git clone [url] # https://gitee.com/kuangstudy/openclass.git
2、去 gitee 或者 github 上克隆一个测试!
1.4.3 git状态查看
文件的四种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
- Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
- Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
- Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !
- Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
查看文件状态
上面说文件有4种状态,通过如下命令可以查看到文件的状态:
#查看指定文件状态git status [filename]
#查看所有文件状态git status
# git add . 添加所有文件到暂存区#
git commit -m "消息内容" 提交暂存区中的内容到本地仓库 -m 提交信息
忽略文件
有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等
在主目录下建立".gitignore"文件,此文件有如下规则:
- 忽略文件中的空行或以井号(#)开始的行将会被忽略。
- 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,…})代表可选的字符串等。
- 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
- 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
- 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
#为注释
*.txt #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt #但lib.txt除外
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
1.4.4 添加
git add fileName #指定文件
git add . #所有
说明:将工作区的文件添加到暂存区
1.4.5 提交
git commit -m 'commit message' fileName
说明:将暂存区内容提交到本地库
1.4.6 查看历史记录
git log
git reflog #常用
git log --greph #图形显示,更直观
git log --pretty=oneline #漂亮一行显示
git log --oneline #简洁显示
说明:HEAD@{移动到当前版本需要多少步}
1.4.7 前进后退
-
基于索引值
推荐
git reset --hard 指针位置 例子:git reset --hard a6ace91 #回到这个状态
-
使用 ^ 符号
只能后退
git reset --hard HEAD^ 例子:git reset --hard HEAD^^ 注意:几个 ^ 表示后退几步
-
使用 ~ 符号
只能后退
git reset --hard HEAD~n 例子:git reset --hard HEAD~3
-
reset三个参数比较
soft:
- 仅本地库移动HEAD 指针
mixed:
- 在本地库移动HEAD指针
- 重置暂存区
hard:
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区
1.4.8 删除文件找回
- 相当于建立一个快照,虽然删除了,但只要添加到暂存区,就能找回
git reset --hard 指针位置
1.4.9 文件差异比较
git diff 文件名 #将工作区的文件和暂存区比较
git diff 哈希值 文件名 #和本地库历史中的一个版本比较
git diff #不带文件名,则比较多个文件
1.4.10 git tag 用法
(1) 显示所有标签
git tag或者git tag -l
(2) 新建标签
git tag -a v1.01 -m “Relase version 1.01”
注解:git tag 是打标签的命令,-a 是添加标签,其后要跟新标签号,-m 及后面的字符串是对该标签的注释。
vim apple.txt
git add .
git commit -m "知识点1"
git tag 01_知识点1
(3) 删除标签
git tag -d v1.01
注解:-d 表示删除,后面跟要删除的tag名字
(4) 提交所有标签到远程仓库
git push origin --tags
(5) 删除远程标签
git push origin :refs/tags/2.0
注解:就像git push origin :branch_1 可以删除远程仓库的分支branch_1一样, 冒号前为空表示删除远程仓库的tag。
git push origin :refs/tags/2.0
1.4.11 小结
初始化git仓库的命令
git init
查看文件状态的命令
git status 或者 git status -s
一次性将所有新增和修改的文件加入暂存区的命令
git add .
将暂存区的文件提交到 git 仓库的命令
git commit -m “提交信息”
跳过暂存区 ,直接提交
git commit -a -m “提交信息”
1.5 git分支
git分支中常用指令:
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
1.5.1 什么是分支管理
- 在版本控制中,使用推进多个任务
1.5.2 分支的好处
- 同时并行推进多个功能开发,提高开发效率
- 某一分支开发失败,不会对其它分支有任何影响
1.5.3 分支操作
- 创建分支
git branch 分支名
- 查看分支
git branch
git branch -v
-
切换分支
Git社区发布了Git的新版本2.23。在该版本中,有一个特性非常引人瞩目,就是新版本的Git引入了两个新命令 git switch 和 git restore,用以替代现在的 git checkout。换言之,git checkout 将逐渐退出历史舞台。
git checkout 分支名
git checkout -b 分支名 #创建分支并直接切换到该分支
git switch 分支名
git switch -b 分支名
- 合并分支
相当于把修改了的文件拉过来
git merge xxx
注意:合并分支的时候要明确谁谁合并
我在a分支里面修改了。要合并到master,就先切换到master,然后合并b
- 删除分支
git branch -d 分支名
1.5.4 解决冲突
- 冲突的表现
- 冲突的解决
- 第一步:编辑,删除特殊标记
<<<
===
- 第二步:修改到满意位置,保存退出
- 第三步:添加到缓存区
git add 文件名
- 第四步:提交到本地库
git commit -m '日志信息' ``注意:后面一定不能带文件名
- 第一步:编辑,删除特殊标记
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vYieOYN9-1631242704277)(C:\Users\25468\AppData\Roaming\Typora\typora-user-images\image-20210719225642559.png)]
2. Git 结合Github
别分手` `别名 分支名
2.1 创建远程库地址别名
git remote -v #查看远程地址别名
git remote add 别名 远程地址
例子:git remote add origin https://xx
2.2 推送
开发修改完把本地库的文件推送到远程仓库` `前提是提交到了本地库才可以推送
git push 别名 分支名
git push -u 别名 分支名 #-u指定默认主机
例子:git push origin master
2.3 克隆
完整的把远程库克隆到本地` `克隆下来后不要在主分支里面做开发` `clone进行一次,从无到有的过程,更新用pull
git clone 远程地址
例子:git clone https://xx
2.4 拉取
本地存在clone下来的文件 就用pull更新
pull = fetch + merge
git fetch 别名 分支名
git merge 别名 分支名
git pull 别名 分支名
2.5 解决冲突
注意:解决冲突后的提交是不能带文件名的
如果不是基于远程库最新版做的修改不能推送,必须先pull下来安装冲突办法解决
2.6 rebase
提交记录简洁不分叉` `没学懂,感觉有点鸡肋` `混眼熟
git rebase -i 索引号
git rebase -i HEAD~3 #合并最近三条记录
说明:在vim编辑里面改成s
2.7 beyond compare
用软件解决冲突1.安装 : beyond compare 2.配置: git config --local merge.tool bc3 #合并名称 git config --local mergetool.path '/usr/local/bin/bcomp' #软件路径 git config --local mergetool.keepBackup false #False不用保存备份3.应用: git mergetool说明:--local指只在当前操作系统有效
2.8 跨团队合作
代码review之后合并
-
适用于个人
邀请成员:
Settings
-->Collaborators
-->填写用户名
-->打开链接接受邀请
-
企业
创建一个组织
方便管理
-
review
组织做review
通过Pull request
-
给开源社区共享代码
点击别人仓库的fork 到自己的仓库
– >然后clone下来 修改后推送到远程库
-->点击Pull Request请求
-->Create pull request发消息
2.9 Tag标签
为了清晰的版本管理,公司一般不会直接使用commit提交
git tag -a v1.0 -m '版本介绍' #创建本地tag信息
git tag -d v1.0 #删除tag
git push origin --tags #将本地tag信息推送到远程库
git pull origin --tags #拉取到本地
git checkout v.10 #切换tag
git clone -b v0.1 地址 #指定tag下载代码
2.10 SSH 免密登录
- 输入:
ssh-keygen -t rsa -C GitHub邮箱地址
- 进入
.ssh
目录,复制id_rsa.pub
文件内容 - 登录GitHub。
Settings
-->SSH and GPG keys
–>New SSH Key
- 回到git通过ssh地址创建。
git remote add 别名 SSH地址
3. Git工作流
3.1 概念
在项目开发过程中使用Git的方式
3.2 分类
3.2.1 集中式工作流
像SVN一样,集中式工作流有一个中央仓库,所有的修改都提交到了Master分支上
3.2.2 GitFlow工作流 *
主干分支master
开发分支develop
修复分支hotfix
预发布分支release
功能分支feature
GitFlow 有独立的分支,让发布迭代过程更流畅。
3.2.3 Forking 工作流
在 GitFlow 基础上, 充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。
安全可靠地管理大团队的开发者
3.git结合vscode
注意:解决冲突后的提交是不能带文件名的
如果不是基于远程库最新版做的修改不能推送,必须先pull下来安装冲突办法解决
拉取下来后如果进入冲突状态,则按照解决冲突后再提交
问题1:使用vscode 用git 拉取代码,提示:在签出前,请清理存储库工作树
解决方法:
\1. 手动解决:
①git stash 先将本地修改存储起来
②git pull 拉取远程
③git stash pop 还原暂存内容
\2. 放弃本地修改,直接覆盖
①git reset --hard
②git pull