一、GIT 的使用
一、What is git ?
简言之:git就是 一个 分布式 – 版本控制 – 软件
1、软件 :
安装到电脑里的工具
2、版本控制 :
版本控制的发展历程:
文件版本控制、本地版本控制、集中式版本控制、分布式版本控制
文件版本控制:
起初是文件版本控制,开发者都是通过ctrl+c\ctrl+v进行文件备份,所以电脑里会保存所有历史版本的文件。
这样就造成了一个问题,占用空间。
本地版本控制:
后来出现了本地版本控制,本地只保留一个文件,然后通过软件回滚到历史版本
但这样也只能是满足一个开发者的开发需要,如果要合作开发,就无法胜任。
集中式版本控制:
于是集中式版本控制出现了,最早的集中式版本控制工具是SVN。
所有用户将历史版本存储在中心数据库,所有用户就能通过中心数据库完成历史版本的下载。
不过一但中心数据库挂掉,开发人员依然无法进行版本控制
3、分布式
分布式版本控制:
最终出现了我们现在使用的分布式版本控制工具GIT。
所有用户首先将项目提交到本地版本控制工具,然后通过本地版本控制工具提交到中心数据库,
这样每一个用户的本地仍然存储着历史版本。如果哪一天中心服务器出现故障,用户仍然可以从本地获取版本,等着中心数据库修好了,再上传过去。
注意:本地安装GIT,使用GIT只能在自己的电脑上实现本地版本控制。没有办法实现上传到中心仓库(GitHub)
二、本地版本控制工具——git 的使用
0、个人信息配置
-- 老师的名字、代号–-
在使用 git 进行本地版本是需要声明使用者的信息
$ git config --global user.email "1257144957@qq.com"
$ git config --global user.name "Acheng"
1、进入要管理的文件夹
-- 老师进教室 --
类似于老师开门进教室,只有进教室才能对教室里面的同学们进行调教
windows
直接在要管理的项目文件夹上右键 git bash here
linux
直接 cd files
2、初始化
-- 老师接管全班 --
生成.git 文件夹,所有的版本信息、配置都在里面
$ git init
// initial empty ....... 表示初始化成功
3、查看文件状态
-- 看看哪些学生没有服从管理 / 新来的学生没有进群--
检测当前文件夹的文件状态
$ git status
// 红色字代表git 没有管理的文件、绿色字表示git 已经管理起来的文件
-- 班里又来了新的同学 / 老同学有所改变 --
如果该项目文件有所改动,会在 git status 中会有所体现
$ git status
// modified : 被修改的文件
// untracked: 新增加的文件
4、将红字文件管理起来
-- 将学生纳入自己的课堂氛围--
将指定文件加入git的管理范围内
$ git add [文件名]
$ git add .
// .代表 所有文件
5、生成版本
-- 从现在开始我们就是一个班的啦 ,我们班级的名称是什么bilibili--
将当前管理起来的文件生成一个版本
$ git commit -m '版本的描述信息'
//这个项目的版本名字
【小结】 生成一个版本 & 版本更新
// 初次使用配置开发者信息
$ git config -global user.email "1257144957@qq.com"
$ git config -global user.name "Acheng"
// git 的初始化
$ git init
// 查看当前文件夹的文件状态
$ git status
// 将该文件加入缓存区
$ git add [文件名]
// 生成版本
$ git commit -m '版本的描述信息'
// 查看当前文件夹的文件状态,于是发现文件更新,生成新的版本
$ git status
$ git add [新文件名]
$ git commit -m '新版本的描述信息'
6、无视某些文件的存在
-- 老师不想看见你,给你列入黑名单--
git 的.gitignore文件可以帮助你无视掉你不可描述的哪些秘密
6.1 使用方式
应用场景:
只希望上传项目,不希望上传数据库内容,这个时候就可以将数据库的文件/文件夹的名字放入.gitignore文件中
- 在git 本地新增一个.gitignore文件,
- 编辑文件添加要忽略的文件名/文件夹。
- git 在 git status 和 add的时候就会自动忽略这些文件。
.gitignore文件
=======================================
*.txt //忽略所有txt文件
!a.txt //从*.txt中忽略 a.txt 文件
files/ //忽略files文件夹
*.py[c|a|d] //忽略 pyc pya pyd后缀的文件
【注意】一定要将敏感文件ignore掉
在gitHub中会提供建议ignore的文件,这些文件下载后可以帮我们提前编译好哪些文件需要忽略。
7、查看历史版本 & 版本回滚
-- 看看我们班走过的里程碑 & 想在回到哪些年的日子--
7.1 回滚到当前版本之前的版本
生成了新的、旧的这么多的版本,我们当然也想查看一下历史版本
$ git log
*******************************************************
回滚到当前版本之前的版本
$ git log //查看要回到版本的版本号
$ git reset --hard 版本号
7.2 回滚到当前版本之后的版本
生成了新的、旧的这么多的版本,我们当然也想查看一下历史版本
$ git reflog
*******************************************************
回滚到当前版本之前的版本
$ git reflog //查看要回到的版本号
$ git reset --hard 版本号
7.3 log日志的格式化输出
有的时候生成的版本多了,繁多的log打印消息就容易造成视觉混乱。这个时候就需要用到格式化打印
打印log 显示版本更替路径
$ git log --graph
编辑一个规则,输出时按照规则输出
$ git log --graph --pretty=format:"%h %s"
三、单人本地开发——分支结构
1、git 的逻辑是怎么实现的?
git 实际上主干保存的是 版本1 的快照,
然后 版本2 存储的是取出版本1 变更的部分生成一个快照,其余未修改的部分是从版本1 中取出来
以此类推
于是一个主干可以分出很多小主干,这也就出现了分支结构
2、分支结构可以干什么
在使用git 进行版本控制时,**【标准】**除主分支(master)之外至少使用两个分支。
-
master 分支
所有已经完成并且正式上线的程序
-
development 分支
专门进行程序开发的,一个功能开发过程都在dev分支里实现
-
bug 分支
专门用来修复master上的bug 的
比如要开发一个项目的功能2,那么给功能1新建两个分支,dev和 bug 分支。dev分支上的程序测试欧耶了,这个功能没啥错误了,才会向master分支里合并生成正式版本的功能2 ,每一次开发都是遵循这种模式。这是git使用的一个规范。
-- 这就类似于公测版和正式服的区别,所有的正式服都在master,所有的公测版都在相应的dev里面。--
如果按照上面所说的顺序来,我们在开发版本3的过程中,版本2的一部分功能出现问题了,怎么办,如果直接回滚修改完版本2的功能之后就会将之前的版本3覆盖掉。同时我们也能够在该bug的同时在dev分支上进行开发,而且两个工作不会发生冲突
3、分支结构的实现
Ⅰ、在master 分支上分出两个分支
一个进行master 分支的 bug 修复 BUG分支
一个进行新功能 开发 Dev分支
3.1 查看分支
查看当前所在的分支 & 当前项目有哪些分支。程序主干默认名为 master
$ git branch
3.2 创建新的分支
创建新分支
$ git branch 新分支名
在master 分支上分出两个分支
> $ git branch bug
> $ git branch dev
Ⅱ、进行程序开发就只在dev分支上进行,dev分支上测试直到可以正式运行
3.3 切换分支
如果要对新的分支进行开发就要切换到这个分支
$ git checkout 新分支名
在dev分支上进行
> $ git checkout dev
3.4 开发完成
> [测试代码] //假装测试已经成功了,进行下一步
Ⅲ、将dev分支上的代码合并到master分支上。生成新的版本
3.5 切换回主分支
切换回主分支
$ git checkout master
3.6 分支合并
完成代码合并
$ git merge 新分支名
将dev分支的代码合并到master分支中
$ git merge dev
Ⅳ、之后就可以考虑是否删除这个dev分支
3.7 删除分支
合并完分支之后,如果这个分支就没有用了,删掉
$ git branch -d 新分支名
删除dev分支
$ git branch -d dev
【总结】 分支结构用到的命令
$ git branch // 查看当前所在的分支
$ git branch 新分支名 // 创建新分支 分支名任意,主分支名默认master
$ git checkout 分支名 // 切换到开发工作区 master 代表主分支
$ git checkout -b dev // 创建dev 并切换到dev
$ git merge 分支名 // 完成代码合并,分支和并时一定要确定哪一个分支合并哪一个分支
$ git branch -d 分支名 //删除分支 分支合并完成可以选择删除分支
【注意】:
每次使用development分支进行开发的时候,延申出他的主分支一定要是最新版本的,否则开发时会缺少功能
先将让development 合并 master(合并不是吞并,dev分支事后仍然存在)
$ git merge master
这样 dev 现在的代码就时最新的master了,然后再开发就跟在master分支的基础上开发了
4、合并时的冲突解决
在分支合并时,有可能会出现冲突。这是由于两个分支共同修改了一个文件的某一行,导致git不确定按照哪一个标准进行合并,这时git会把两个结果放到同一个文件,并标记出来,让开发之自己手动进行取舍
===============
+ 待开发 +
================
二、GitHub的初体验
一、什么是GitHub?
也不用把GitHub想成一个多么神奇的东西,很简单,GitHub是一个代码仓库。现在的代码仓库有很多啊,码云、GitHub、gitlib的都是代码仓库。那么话说回来了,git 和 GitHub 是怎样的关系呢?他们之间的关系就是松花江和松花蛋的关系。git 是版本控制工具,GitHub是代码仓库。我们只是为了将代码存储到云端代码仓库,所以任何代码仓库都可以和git对接。但是GitHub现在最厉害。
github & gitlib 的区别
github 是一个代码仓库的开源网站
里面的代码都是开源的
如果要存放私有代码,就需要¥¥¥
gitlib 是一个工具,能都允许用户自己搭建代码仓库。
可以用来专门存放私有文件。
但是成本比较高,需要自己买一台服务器,专门人维护
二、上传到代码仓库的流程
1、在代码仓库注册账号
2、在我的代码仓库中创建一个专门放置一个项目的小箱子
3、将本地代码上传到代码仓库中的项目小箱子中
三、使用git将项目上传到github
1、将本地git 控制起来的项目上传到github
声明远程仓库,给远程仓库起个别名 origin。这个别名会给记录在本地上,以后再上传这个项目时就不需要重新声明别名。直接上传分支就行
$ git remote add origin https://github.com/auditoryHallucination/sprider_English.git //origin 后面网址的别名
重命名分支(不是必须的)
$ git branch -M master
上传指定分支
$ git push -u origin master // master是分支名称,如果要把其他分支上传上去就可以改成其他分支的名子
2、将项目从github下载到本地
将github 上的项目下载到本地
$ git clone 远程仓库的地址
下载完成后可能git branch 之后只有一个master分支,实际上它已经把所有分支下载下来了。但是仍然是可以完成其他分支切换的
3、本地存在项目,从GitHub上下拉项目
如果本地存在这个代码,就不需要clone了
$ git pull -u origin development(要拉下来的分支名)
4、为发布的版本打上版本号
为项目添加版本号
$ git tag -a project_V1 -m "第一版本"
上传项目,提交版本号
$ git push origin --tags
四、模拟实战
背景故事:
今天第一天上班写了一个项目,虽然到了下班时间但是那股继续开发的热血还在,怎么办,回家继续。
1、在公司开发项目之后上传到github仓库
初次使用配置开发者信息
$ git config -global user.email "1257144957@qq.com"
$ git config -global user.name "Acheng"
git 的初始化
$ git init
在master 分支上分出两个分支
$ git branch bug
$ git branch dev
切换到dev分支
$ git checkout dev
开发中。。。。。。开发了好多
$ [开发了很多代码]
下班了,怎么办上传到github吧,回家续上
$ [下班前几分钟,依然要保持队形]
查看当前文件夹的文件状态
$ git status
将该文件加入缓存区
$ git add [文件名]
生成版本
$ git commit -m '版本1.0'
声明远程仓库,给远程仓库起个别名 origin
$ git remote add origin https://github.com/auditoryHallucination/sprider_English.git
上传指定分支
$ git push -u origin master
2、回到家里变继续开发(这个时候家里的电脑还没有来)
将github 上的项目克隆到本地
$ git clone 远程仓库的地址
切换到dev 分支进行开发
$ git checkout dev
把master 分支合并到dev(仅一次)
$ git merge master
修改代码
提交代码
$ git add .
$ git commit -m "xxx"
$ git push -u origin dev
3、回到公司
切换到dev分支
$ git checkout dev
拉代码
$ git pull -u origin dev
继续开发
提交代码
$ git add .
$ git commit -m "xxx"
$ git push -u origin dev
4、回到家里
切换到dev分支进行开发
$ git checkout dev
拉代码
$ git pull -u origin dev
继续开发
提交代码
$ git add .
$ git commit -m "xxx"
$ git push -u origin dev
5、在公司
终于有一天master 线上代码跑着呢,dev开发完成了,要合并到master 分支
切换到master 分支
$ git checkout master
将dev分支合并到master 分支
$ git merge dev
将完整版 master 上传到仓库
$ git push -u origin master
dev也是最新的了,将dev也上传到仓库
切换到dev 分支
$ git checkout dev
将 master 分支合并到 dev 分支 时刻保持同步
$ git merge master
将完整版 dev 上传到仓库
$ git push -u origin dev
6、回到家中
将最新代码拉下来
$ git pull -u origin dev
$ git pull -u origin master
继续开发新功能
。。。。。
三、补充知识点
配置文件
本地项目配置文件项目:/.git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = https://github.com/auditoryHallucination/sprider_English.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
既然是文件,那么有些配置就也可手动添加了,但是这个文件毕竟是在当前项目里存在的,所以向这个文件添加配置,只在当前的项目配置生效,在其他项目下不生效
例如命令:
git config --local user.name "acheng"
git config --local user.email "123@qq.com"
全局项目配置文件目录:当前用户目录/.gitconfig
例如命令:
git config --global user.name "acheng"
git config --global user.email "123@qq.com"
免密码登录
当将本地项目上传到文件仓库时一次一次的输入密码就比较麻烦,怎么办。咱有免密登录的方法。
URL 中体现
原来的地址:https://github.com/auditoryHallucination/sprider_English.git
修改的地址:https://用户名:密码@github.com/auditoryHallucination/sprider_English.git
$ git remote add origin https://用户名:密码@github.com/auditoryHallucination/sprider_English.git
$ git push origin master
地址可以通过/.git/config文件进行修改
SSH实现
1、生成公钥和私钥
$ ssh-keygen
公钥默认放在 ~/.ssh/id_rsa.pub目录下,然后拷贝公钥的内容
私钥默认放在 ~/.ssh/id_rsa目录下
2、将公钥设置到github中
https://github.com
设置到github 中的settings设置SSH中
3、在本地git项目中添加ssh地址
$ git remote -u origin ssh地址
4、以后使用就不需要密码了直接↓↓↓
$ git push origin master
任务管理相关
1、issues
在公司里面有些内部问题不能再QQ 微信上面询问,公司会专门在github中设置一个issues 算是问题解决专区。
方便公司的问题总结
提出bug
2、Wiki
项目Wiki 【项目所需的知识点、项目介绍、文档说明】,方便和别人交流
变基(rabase)
===============
+ 待开发 +
================