集腋成裘-21-git使用-03进阶篇
前言
集腋成裘-12-git使用-01创建库和 集腋成裘-13-git使用-02进阶篇 从使用层面进行了简单的介绍,下面从命令形式进行介绍
一、快速入门
1.1 Git与GitHub
Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。 Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。Git 是根据GNU通用公共许可证版本2的条款分发的自由/免费软件,安装参见:http://git-scm.com/
GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。
Git本身完全可以做到版本控制,但其所有内容以及版本记录只能保存在本机,如果想要将文件内容以及版本记录同时保存在远程,则需要结合GitHub来使用。使用场景:
- 无GitHub:在本地 .git 文件夹内维护历时文件
- 有GitHub:在本地 .git 文件夹内维护历时文件,同时也将历时文件托管在远程仓库
其他:
集中式:远程服务器保存所有版本,用户客户端有某个版本
分布式:远程服务器保存所有版本,用户客户端有所有版本
一言以蔽之:GitHub是文件远端存放的平台,Git是文件版本控制的工具
1.2 Hello Git
安装过程不再赘述,这里开始第一行代码,即检查Git是否安装成功
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
$ git --version
1.3 基本概念
我们先来理解下Git 工作区、暂存区和版本库概念
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
二、Git使用之小P创业史
假设小P准备创建一个《网上书城》的项目,
2.1 初创期:单枪匹马自己干
2.1.1 通过git控制代码
把文件纳入到版本控制大致分三步:
- 进入文件夹进行初始化
- 添加要管理的文件
- 生成版本
- 进入待管理文件夹
cd /文件路径
- 初始化
git init
- 查看管理目录下的文件状态
git status
- 管理指定文件(红变绿)
git add 文件名 git add .
-
生成版本
git commit -m '版本备注信息'
-
文件配置(如果是首次commit命令,需要通过以下命令配置跟人信息)
git config --global user.email "1692134188@qq.com" git config --global user.name "Yango"
- 查看日志
git log
git log --graph --pretty=format:"%h %s"
2.1.2 完善、拓展新功能
对历史功能的完善,如:完善了index.html首页功能
拓展新功能,添加了readme系统说明
此时两个文件都会变红,需要重新添加(git add .),并提交(git commit -m '备注')
git add . git commit -m '备注'
2.1.3 添加打折功能,到期后回滚
世界读书日,需要添加一个打5折优惠功能,假设需要修改到index页面和新增一个discount.py文件。
过了这天后,价格恢复原价,代码回滚
回滚流程:一、找到想要回滚的版本号。二、回滚
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
git add . git commit -m 'v4版本,世界读书日,全场五折'
git log查看日志,找到想要回滚的版本号 git log git reset --hard 要回滚的版本号
2.1.4 商城&紧急bug修复
正常开发一个功能(商城功能)是在dev分支上进行的,线上突然有一个紧急bug需要修复,
- 查看分支
git branch
- 创建分支
git branch dev
- 切换分支
git checkout dev
- 同样道理从master分支上切出一个bug分支,并在bug分支上修改相应的bug,并进行 commit提交
- 合并分支(可能会有冲突)
1:切换到mater分支并检查 git checkout master git branch 2:把bug分支merge到主干上 git merge bug_01
- 删除分支
-
git branch -d 分支名
-
- 继续在dev上分支开发,开发完成后提交
-
- 产生处理(此时再回到master分支 进行合并dev分支,由于共同修改了index.html文件,所以会发生冲突)
- 手动处理后并再次commit提交
2.2 GitHub
2.2.1 准备工作
- 申请账号
- 创建云端仓库
2.2.2 把代码推送到GitHub
-
1:给远程仓库起别名
git remote add origin https://github.com/1692134188/bookstore.git
2:向远程推送代码 git push -u origin master
2.2.3 初次在公司新电脑下载代码
1:克隆远程仓库代码(内部已实现git remote add origin 远程仓库地址) git clone 远程仓库地址 2:切换分支 git checkout 分支
2.2.4 在公司的dev上面开发代码,推送到远程
1:切换到dev分支 git checkout dev 2:把master分支合并到dev git merge master 3:修改代码 4:提交代码 git add . git commit -m '' 5:推送到远程 git push origin dev
2.2.5 回到家,获取远程代码,继续写
1:切换到dev分支 git checkout dev 2:从远端拉取代码 git pull origin dev 3:继续开发 4:提交代码 git add . git commit -m '' 5:推送到远程 git push origin dev
。。。。。周而复始,直到有一天,出了差错,
2.2.6 在公司写完代码没有及时提交到远程
1:切换到dev分支 git checkout dev 2:从远端拉取代码 git pull origin dev 3:继续开发 4:提交代码 git add . git commit -m '' 5:推送到远程 在公司继续写代码,但是忘记推送了!!!!!!!!!
2.2.7 回到家,发现公司写的代码没有提交,但是也只能再开发别的功能了
1:切换到dev分支 git checkout dev 2:从远端拉取代码 啊没有拉取到内容,倒霉忘记提交了 git pull origin dev 3:继续开发 4:提交代码 git add . git commit -m '' 5:推送到远程 git push origin dev
2.2.8 回到公司, 拉取代码,合并代码,如有冲突解决冲突
2.2.9 其他
git pull origin dev = git fetch origin dev + git merge origin dev
2.3 rebase 变基
使提交记录更简洁,不分叉
2.3.1 场景一:多次commit记录整合
举个例子,现在在一个新的future分支创建一个商城在线聊天室功能。假设第一天开发了前端,第二天开发了后台端40%,三天开发后端70%,第四天开发后台90%,第五条开发后端100%。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
应用场景一:合并多次提交记录,更简洁 1:切换到master分支, $ git checkout master 2:把dev分支合并到master $ git merge dev 3:从master上切一个新的future分支,用于开发聊天室ChatRoom git branch ChatRoom 4:回到ChatRoom开始开发 git checkout ChatRoom 5:开发第一天 $ git add . $ git commit -m 'ChatRoom V1:前端开发完成' 6:开发第二天 $ git add . $ git commit -m 'ChatRoom V2:后端完成40%' 7:开发第三天 $ git add . $ git commit -m 'ChatRoom V3:后端完成70%' 8:开发第四天 $ git add . $ git commit -m 'ChatRoom V4:后端完成90%' 9:开发第五天 $ git add . $ git commit -m 'ChatRoom V5:后端完成100%'
我们需要把V2和V5版本统一整合成一次提交记录:后端开发完成 ,按照截图标识修改一些文件内容
10:开始变基(方式一) git rebase -i 版本号:表示要合并的起始位置 $ git rebase -i 08131d08ac095679d7bad5517cdc406e2da254a4 11:开始变基(方式二) git rebase -i HEAD~n n:表示把最近的n次进行合并 git rebase -i HEAD~4
再次查看日志记录
2.3.2 场景二:合并多个分支
从master上切出三个分支featureA和featureB和featureC,分别由三个开发人员开发;
A分支率先开发完成,并提交到master,
此时B分支再想同步master分支,git merge master。此时查看日志
如果C分支想同步master分支,git rebase master。此时查看日志
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1:从master切出3个分支 $ git branch featureA $ git branch featureB $ git branch featureC 2:回到A分支上开发,开发完成并提交。推送到远程 $ git checkout featureA $ git add . $ git commit -m 'A分支,版本A-1,A功能开发完成' $ git push origin featureA 3:合并A分支到master上 $ git checkout master $ git merge featureA 4:分支B正常开发:提交,推送到远程 $ git checkout featureB $ git add . $ git commit -m '分支 B,版本B-1,开发50%' $ git add . $ git commit -m '分支 B,版本B-2,开发80%' $ git push origin featureB 5:分支C正常开发:提交,推送到远程 $ git checkout featureC $ git add . $ git commit -m '分支 C,版本C-1,开发60%' $ git push origin featureC $ git add . $ git commit -m '分支 C,版本C-2,开发70%' $ git push origin featureC
此时是B分支没有从master上merge的log日志
6:分支B采取直接从master上merge $ git checkout featureB $ git log $ git merge master $ git log
此时是B分支没有从master上rebase的log日志
7:分支C采取从master上rebase $ git checkout featureC $ git log $ git rebase master $ git log
2.4 多人开发
2.4.1 创建组织
2.4.2 基于组织创建项目
2.4.3 邀请成员进组织
2.4.4 给成员分配权限
2.4.5 管理员代码上传
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/YangoCity/BookStore.git
git push -u origin master
2.4.6 开发获取代码
三、Git使用
3.0. 把gitlab远程remote的http修改成ssh
3.1. GitLab免密登录
第一步:检查是否存在SSH秘钥
第二步:生成SSH key
![](https://img2020.cnblogs.com/blog/1126880/202007/1126880-20200721094218379-1527299150.png)
第三步:在gitlab用户设置ssh密钥填写公钥
3.2. 忽略本地修改,强制拉取远程到本地
主要是项目中的文档目录,看的时候可能多了些标注,现在远程文档更新,本地的版本已无用,可以强拉
git fetch --all git reset --hard origin/dev git pull