目录
一、版本控制
1. 概念
2. 功能
01 - 不同版本的存储管理
02 - 重大版本的备份维护
03 - 恢复之前的项目版本
04 - 记录项目的点点滴滴
05 - 多人开发的代码合并
3. 历史
01 - 版本控制的史前时代(没有版本控制)
02 - CVS(Concurrent Versions System)
03 - SVN(Subversion)
04 - Git(Linus的作品)
4. 集中式版本控制
01 - 概念
02 - 优点
03 - 缺点
5. 分布式版本控制
二、准备 Git
1. 安装
2. Bash – CMD – GUI 区别
3. Git 的配置分类
01 - 仓库的通用配置
02 - 针对当前用户,所有的仓库生效
03 - 针对该仓库
4. Git 的配置选项
01 - 设置用户名
02 - 设置邮箱
03 - 检测配置信息
5. Git的别名(alias)
三、Git 操作本地仓库
1. 获取Git仓库
01 - 初始化Git仓库
02 - Git拉取远程仓库
2. 文件的状态划分
3. git status
4. git add
5. git commit
6. git merge
7. git log
8. git reflog
9. git reset
10. Git 的忽略文件 GitHub - github/gitignore
11. git 底层原理
四、Git 远程仓库和本地仓库建立联系
1. 概念
2. 本地无仓库,远程有仓库
01 - 远程仓库的验证 – 凭证
拉取代码
输入账号密码
提交代码
删除凭证
windows
mac
02 - 远程仓库的验证 – SSH密钥
one 生成公钥和私钥 生成/添加SSH公钥 - Gitee.com
two 拿到公钥
three 把公钥放置在服务器中
fore拉取代码
3. 本地有仓库,和远程仓库建立连接
01 - 添加远程地址
02 - 建立连接 ( 重要 )
本地有分支,远程有分支
本地有分支,远程没分支
03 - 查看远程仓库地址
04 - 重命名远程仓库别名
05 - 移除远程地址
五、Git 操作远程仓库
1. git clone
2. git push
3. git fetch
4. git merge
5. git pull
六、git tag
1. 创建标签
01 - 轻量标签
02 - 附注标签
2. 查看标签
3. 把打的标签推送到远程仓库中
4. 删除本地tag
5. 删除远程tag
6. 检出tag,回退到打tag的版本
七、git 分支
1. 创建分支
2. 查看分支
3. 切换分支
4. 分支所在HEAD
5. 创建分支并同时切换
6. 在分支上提交图解
01 - 初始状态在master上提交
02 - 创建新分支testing,并在新分支上继续提交
03 - 切换回master分支上,并继续提交
04 - 在master分支上创建新分支dev,并继续提交
7. 分支的开发与合并
01 - 遇到线上bug
02 - 解决完后合并hotfix分支
8. 删除分支
9. 修改分支名称
10. git merge
八、git rebase
1. 使用了merge
2. 使用了rebase
3. 原理
4. rebase和merge的选择
九、总结操作
十、Git常见命令速查表
版本控制在软件开发中,可以帮助程序员进行代码的追踪、维护、控制等等一系列的操作
人们通常通过文件备份的方式来进行管理,再通过diff命令来对比两个文件的差异
由荷兰阿姆斯特丹VU大学的Dick Grune教授实现的,也算是SVN的前身(SVN的出现就是为了取代CVS的)
相较于老式的本地 管理来说,每个人都可以在一定程度上看到项目中的 其他人正在做些什么
是集中式版本控制有一个核心的问题:中央服务 器不能出现故障
Git是属于分布式版本控制系统(Distributed Version Control System,简 称 DVCS)
集中式版本控制 : 将仓库放到服务器,一旦服务器崩溃可能会导致代码及记录都消失
分布式版本控制 : 通过git clone把仓库完全镜像到本地,就算服务器出现问题也没有关系,记录和代码会在本地仓库保存一份,提交到远程仓库时会进行同步刷新
git : Git - Downloads
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量
地址 : /etc/gitconfig => 包含系统上每一个用户及他们仓库的通用配置
地址 : ~/.gitconfig => 只针对当前用户
地址 : 当前使用仓库的 Git 目录中的 config 文件,即.git/config => 针对该仓库
设置Git的 用户名和邮件地址
git config --global user.name 'coderstar'
git config --global user.email'[email protected]'
git config --list
如果不想每次都输入完整的 Git 命令
可以通过 git config 文件来轻松地为每一个命令设置一个别名
命令 : git checkout
设置别名 : git config --global alias.co checkout
使用 : git co
需要一个Git来管理源代码,本地也需要有一个Git仓库
通常有两种获取 Git 项目仓库的方式:
git init
git clone 地址
需要对文件来划分不同的状态,以确定这个文件是否已经归于Git仓库的管理:
通过使用 ( git add . ) 命令,可以使得文件被git跟踪,文件状态变为暂缓区
ps : 但是此时的文件并没有和commit对象建立联系,git log查看不到更改的记录
已跟踪的文件又可以进行细分状态划分:
Modified:修改了某个文件后,会处于Modified状态
不管是新增的文件、修改的文件,都需重新让 add && commit
git status => 检测文件的状态
git status -s || git status --short => 文件状态的简洁信息
git add => 文件添加到暂存区
git add 文件 => 跟踪新文件,并将其加入到暂存区
git add . => 将所有文件加入到暂存区
git commit => 文件更新提交,将暂存区的文件提交,和commit对象联系在一起
git commit –m "提交信息" => 提交文件,并写上记录
git commit --no-verify -m "XXX" => 忽略提交限制,一般eslint有
git commit -a -m "haha" => 相当于 git add. -> git commit -m 'haha' 的简写
git merge => 合并两分支代码 => git merge xxx分支名称
git merge dev --allow-unrelated-histories ( 该参数为了使得两毫不相干的分支合并,可加 )
git log => 查看一下所有的历史提交记录
git log => 详细记录
git log --oneline => 好看一点的记录
git log --pretty=oneline => 更好看一点的记录
git log --pretty=oneline --graph => 可以看到多分支的记录
ps : 空格继续看记录,q是退出键
git reflog => 不仅可以查看历史提交记录,而且切换版本的记录也会留下来
git reset => 版本回退
Git通过HEAD指针记录当前版本 :
可以通过HEAD来改变Git目前的版本指向( 切换版本 )
新建.gitignore文件 => 有些文件无需纳入Git 的管理,不需增加到缓存区
例如 vue 项目的.gitignore文件
在进行提交操作时,Git 会保存一个提交对象(commit object)
项目通常是多人开发的,所以会将本地仓库中管理的代码共享到远程仓库中
常见的远程仓库 :
不管是用哪个仓库,验证的方式都基本一样,这里使用gitee为例
对于私有的仓库需要进行验证
ps : 如果git bash中拉取不下来,记得在cmd环境中再试试
目前Git服务器验证手段主要有两种 :
拉取 : 测试仓库 => git clone 地址
ps : 一旦拉取仓库下来成功,就已经和远程仓库建立起了连接,可直接进行git操作
git add . => git commit -m 'change' => git push
在系统用户的钥匙串中(加密的),删除即可
Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。
SSH以非对称加密实现身份验证
0. 步骤
1. 用户在命令行输入命令,会生成公钥和私钥
2. 把公钥放在远程仓库中
ssh-keygen -t ed25519 -C “your email"
.pub文件中的内容就是公钥,复制下来即可
git clone 地址
ps : 一旦拉取仓库下来成功,就已经和远程仓库建立起了连接,可直接进行git操作
ps : 如果git bash中拉取不下来,记得在cmd环境中再试试
添加远程地址:添加远程服务器(让本地的仓库和远程服务器仓库建立连接)
git remote add 远程仓库别名( 默认是origin ) 远程仓库地址
地址为HTTPS
验证方式则为 用户名 + 密码 > git remote add origin https://gitt.com
地址为SSH
验证方式则需配公钥和私钥 > git remote add origin [email protected]
ps : 一个本地仓库可以和多个远程仓库建立连接
origin => 远程仓库名称,一个本地仓库可以和多个远程仓库连接,所以要指定是哪个
ps :
建议 远程仓库分支名字 和 本地仓库分支名 保持一样
否则拉取和推送时,可能需要多敲些许命令
0. 前提是拥有本地仓库
git init => git add . => git commit -m 'message'
1. 添加远程仓库地址
git remote add origin [email protected]
2. 触发输入账号密码 || 验证密钥,并拉取远程分支到本地
git pull
3. 分支关联,建立跟踪分支 ( 上游分支 ) =>
=> git branch --set-upstream-to=远程仓库名字/远程分支的名字 本地分支的名字
git branch --set-upstream-to=origin/master master
4. 把远程仓库代码和本地代码合并 => git pull 远程仓库名字 远程仓库分支
git pull origin master --allow-unrelated-histories ( 该参数为了使得两毫不相干的分支合并 )
5. 把代码推送到远程仓库中 --- 如果本地分支和远程分支名称不一样
git push ---- git push 远程仓库名字 远程仓库分支
3. 推送本地分支到远程,并建立远程跟踪分支 =>
=> git push --set-upstream 远程仓库名字 远程分支
git push --set-upstream origin dev || git push -u origin dev ( 简写 )
4. 若想要和远程的其他分支代码合并 => git merge 远程仓库名字/远程仓库分支
git merge origin/master --allow-unrelated-histories ( 该参数为了使得两毫不相干的分支合并,如果有关系可以不写 )
查看远程地址:比如上面从GitHub上clone下来的代码,它就是有自己的远程仓库的
git remote => 简洁信息
git remote –v => 详细信息
git remote rename 原仓库名 新仓库名
git remote rename origin gitlab
git remote remove 仓库名
git remote remove gitlab
git clone 地址 => 把远程仓库克隆到本地
git push => 将本地仓库的代码推送到远程仓库中
git push
git push -u 远程仓库名字 远程仓库分支
git push -u origin dev
git fetch => 从远程仓库获取最新的代码
git fetch
git fetch 远程仓库名字 远程仓库分支
git fetch origin dev
git merge => 合并两分支代码
git merge
git merge 远程仓库名字 远程仓库分支 允许两毫不相干的分支合并 ( 看情况加 )
git merge origin dev --allow-unrelated-histories
git pull => 从远程仓库pull代码,拉取远程代码到本地,并且合并
git pull => 相当于 git fetch + git merge
git pull 远程仓库名字 远程分支 允许两毫不相干的分支合并 ( 看情况加 )
git pull origin master --allow-unrelated-histories
对于重大的版本我们常常会打上一个标签,以表示它的重要性
创建tag标签 : git tag 标签名 (xxx版本号)
git tag v1.0.0
创建附注标签:通过-a选项,并且通过-m添加额外信息 => git tag -a 版本号 -m 信息
git tag -a v1.1.0 -m 'message,我干了什么'
基本查看 : 只能看到打的版本信息
git tag
详细查看 : 可以看到附注标签写的内容以及更改的代码内容 => git show 版本号
git show v1.1.0
默认情况下,git push 命令 并不会 传送标签到远程仓库服务器上
推送指定tag到远程仓库中 => git push 远程仓库名 xxx版本号
git push origin v1.0.0
推送全部tag到远程仓库中 => git push 远程仓库名 --tags
git push origin --tags
删除本地tag => git tag -d 版本号
git tag -d v1.0.0
删除远程tag => git push 远程仓库名 --delete 版本号
git push origin -d v1.0.0
回退到打tag的地方 => git checkout 版本号
git checkout v1.1.0
回退回来后,不要直接修改,若要修改,创建个新分支即可
git checkout -b '新分支名'
Git 的分支,其实本质上仅仅是指向提交对象的可变指针
master分支
Git 是怎么创建新分支的本质 => 只是创建了一个可以移动的新的指针
创建分支 => git branch xxx分支名
git branch testing
查看当前所有的分支
git branch
同时查看最后一次提交
git branch –v
查看所有合并到当前分支的分支
git branch --merged
查看所有没有合并到当前分支的分支
git branch --no-merged
切换分支 => git checkout xxx分支名
git checkout testing
Git 通过一个名为 HEAD 的特殊指针 知道当前在哪一个分支上
创建分支并同时切换 => git checkout -b 'xxx分支名'
git checkout -b testing
推送到远程仓库中 => git push -u 远程仓库名 远程分支
git push -u origin testing
或者
git push origin testing + git branch --set-upstream-to=origin/testing testing
删除远程分支
git push -d origin 分支名
删除本地分支
git branch -d 分支名
修改本地分支名称
git branch -m 原分支名 新分支名
修改远程分支名称
1.删除远程分支
git push --delete origin 分支名
2.修改本地分支名称
git branch -m 原分支名 新分支名
3.推送到远程仓库中
git push -u origin 分支名
git merge => 合并两分支代码 => git merge xxx分支名称 || git merge 远程仓库/远程分支
git merge dev --allow-unrelated-histories ( 该参数为了使得两毫不相干的分支合并,可加 )
在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase
在master上直接使用merge
git merge experiment
在experiment上直接使用rebase
git rebase master
再次执行master上的合并操作
git checkout master
git merge experiment
rebase是如何工作的 :
rebase和merge是对Git历史的不同处理方法:
rebase有一条黄金法则:永远不要在主分支上使用rebase
远程仓库有项目 ( 公司 )
0. git服务器验证,看上面文章内容
1. 克隆项目到本地
git clone xxxxxxxx地址
2. 一般在master分支上创建自己的分支或者功能分支 dev-star
git checkout -b dev-star
3. 把创建好的分支推送到远程仓库,建立跟踪分支 dev-star
git push -u origin dev-star
4. 编写代码
阿巴阿巴阿巴阿巴阿巴
5. 把本地代码添加到暂存区
git add .
6. 把暂存区代码和commit对象关联,生成提交记录
git commit -m 'feat: messsage'
7. 从远程拉取最新代码到本地
git pull
8. 推送本地代码到远程仓库
git push
9. 合并代码到master分支上
01 - 切换回主分支
git checkout master
02 - 合并最新的master代码
git pull
03 - 自己的分支或者功能分支
git merge dev-star
04 - 解决可能存在的冲突,提交合并的代码
git commit -a -m ' ' => git push