Git
Git分布式版本控制工具
下载地址: https://git-scm.com/download
版本管理工具一般具有如下特性:能够记录历史版本,回退历史版本;团队开发,方便代码合并
企业中我们是如何开发的
1) 入职第一天,管理人员分配/git账号密码
2) 开发人员下载代码即文档/ 根据文档将环境搭建成功
3) 团队一般会给你讲讲项目相关的支持
----
4) 你接到第一个需求(或者某个功能,一般要经过沟通,分析,设计...等过程)
5) 创建feature分支(一般一个需求对应一个feature,命名格式上标注该需求的id)
6) 开发需求,本地测试,提交代码到当前需求对应的feature分支,
一般来讲为了避免将测试代码提交,需要提交前,检查如下步骤
6.1) 是否多提交了某个文件,比如测试文件
6.2) 是否漏提交文件
6.3) 打开每一个应该提交的文件,判断是否多提交了一行代码,是否少提交了一行代码,是否删除了本应该存在的代码
检查完毕提交代码
7) 合并分支至test分支-- 测试人员会在test分支中测试
8) 测试人员测试bug ,开发者在feature分支上继续修改,提交
9) 测试人员测试通过 ,test分支会被测试人员合并到develop开发分支,再次测试
10)develop分支最终会被合并到master主分支
SVN(SubVersion)
SVN是集中式版本控制系统,版本库是集中放在中央服务器的.
工作流程:从中央服务器远程仓库下载代码;修改后将代码提交到中央服务器远程仓库
优点: 简单,易操作
缺点:所有代码必须放在中央服务器;服务器一旦宕机无法提交代码,即容错性较差;离线无法提交代码,无法及时记录我们的提交行为
Git
Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS),分为两种类型的仓库:
本地仓库和远程仓库
工作流程如下
1.从远程仓库中克隆或拉取代码到本地仓库(clone/pull)
2.从本地进行代码修改
3.在提交前先将代码提交到暂存区
4.提交到本地仓库。本地仓库中保存修改的各个历史版本
5.修改完成后,需要和团队成员共享代码时,将代码push到远程仓库
git支持离线提交代码
工作流程

命令如下
1.clone (克隆) :从远程仓库中克隆代码到本地仓库
2.checkout (检出) :从本地仓库中检出一个仓库分支然后进行修订
3.add (添加):在提交前先将代码提交到暂存区
4.commit (提交):提交到本地仓库。本地仓库中保存修改的各个历史版本
5.fetch (抓取): 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
6.pull(拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于fetch+merge
7.push (推送) :修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
Git常用命令流程图

本地仓库:是在开发人员自己电脑上的Git仓库,存放我们的代码(.git 隐藏文件夹就是我们的本地仓库)
远程仓库:是在远程服务器上的Git仓库,存放代码(可以是github.com或者gitee.com 上的仓库,或者自己该公司的服务器)
工作区: 我们自己写代码(文档)的地方,(.git下的文件区域)
暂存区: 在本地仓库中的一个特殊的文件(.git/index) 叫做暂存区,临时存储我们即将要提交的文件
Clone:克隆,就是将远程仓库复制到本地仓库
Push:推送,就是将本地仓库代码上传到远程仓库
Pull:拉取,就是将远程仓库代码下载到本地仓库,并将代码克隆到本地工作区
操作本地仓库
Git工作目录下对文件的修改(增加,删除,更新)会存在几个状态

Git工作目录下的文件存在两种状态:
untracked未跟踪(未被纳入版本控制):
比如新建的文件(此时文件夹上没有图标或者有一个"问号")
tracked已跟踪(被纳入版本控制):
Staged 已暂存状态:添加 但未提交状态(此时文件夹上有一个"加号")
Unmodified 未修改状态:已提交(此时文件夹上有一个"对号")
Modified 已修改状态:修改了,但是还没有提交 (此时文件夹上有一个"红色感叹号")

初始化
#设置用户信息
git config --global user.name “itcast”
git config --global user.email “itcast@itcast.cn”
#查看配置信息
git config --list
git config user.name
#通过上面的命令设置的信息会保存在~/.gitconfig文件中
mkdir pro_git
cd progit
git init //让Git知道,它需要来管理这个目录
git init --bare # 初始化仓库不带工作区
添加工作区到暂存区
# 将未跟踪的文件加入暂存区
git add <文件名>
# 将暂存区的文件取消暂存 (取消 add )
git reset <文件名>
#可以添加一个文件,也可以同时添加多个文件。
git add 文件名
git add 文件名1 文件名2 文件名3 …
git add 单个文件名|通配符
# 添加当前目录到缓存区中;将所有修改加入暂存区
语法3:git add .
查看修改的状态
git status
git status –s #查看状态 使输出信息更加简洁
提交至版本库
git commit -m "日志信息" <文件名>
查看提交日志
git log [option]
--all 显示所有分支
--pretty=online 提交信息显示为一行
--abbrev-commit 输出的commitId更简短
--graph 以图的形式显示
版本回退
git log //查看版本,确定需要回到的时刻点
git log --pretty=oneline
git reset --hard 提交编号 //回到过去
git reflog //历史操作查看;回到未来;需要得到最新的commit id
删除
# 从本地工作区 删除文件
git rm <文件名>
# 如果本工作区库误删, 想要回退
git checkout head <文件名>
添加文件至忽略列表
般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以在工作目录中创建(touch)一个名为gitignore 的文件(文件名称固定) ,列出要忽略的文件模式。
规则对当前目录及其子目录生效。
# 所有以.a 结尾的文件讲被忽略(递归)
*.a
# 不管其他规则怎样,强制不忽略 lib.a
!lib.a
# 只忽略 文件 TODO (注意这里是文件)
/TODO
# 过滤某个具体文件
/mtk/do.c
# 忽略 build文件夹下所有内容(递归) 这里是文件夹
build/
#过滤整个文件夹
/mtk/
# 忽略 doc 目录下以 *.txt 结尾的文件 (不递归)
doc/*.txt
# 忽略 doc 目录下以 *.pdf 结尾的文件 (递归)
doc/**/*.pdf
命令行--分支
几平所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
查看
git branch #查看本地分支
git branch -r # 列出所有远程分支
git branch -a # 列出所有本地分支和远程分支
创建切换
git branch 分支名 #创建本地分支
git checkout 分支名 #切换分支
git checkout -b 分支名 #创建并切换分支
合并分支
一个分支上的提交可以合并到另一个分支;操作master可以把其他的合并过来
快进效果Fast-forward:要合并后提交的工作,会把后提交的工作直接复制给前面的工作
git merge 分支名称
删除分支;不能删除当前分支,只能删除其他分支。如果分支已经修改过,则不允许删除
git branch -d b1 删除分支时需要各种检查,有没有合并
git branch -D b1 不做任何检查强制删除
解决冲突先git pull
此时git已经将线上与本地仓库的冲突合并到了对应的文件中。
当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突决冲突步骤如下:
cat file01.txt
vim file01.txt
cat file01.txt
git add .
git commit
开发中分支使用原则与流程:
在开发中,一般有如下分支使用原则与流程:
master (生产) 分支
线上分支,主分支,中小规模项目作为线上运行的应用对应的分支
develop (开发) 分支
是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。
feature/xxxx分支
从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支。
hotfix/xxxx分支.
从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支.
还有一些其他分支,在此不再详述,例如test分支 (用于代码测试)、pre分支(预上线分支)等等.
企业开发流程:

命令行 --tag
如果你的项目达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以给它打上标签(tag)
比如说,我们想为我们的项目发布一个"1.0"版本。 我们给最新一次提交打上(HEAD)"v1.0"的标签。
标签可以理解为项目里程碑的一个标记,一旦打上了这个标记则,表示当前的代码将不允许提交
# 列出所有tag
git tag
# 查看tag详细信息
git show [tagName]
# 新建一个tag
git tag [tagName]
# 提交指定tag
$ git push [仓库简称] [tagName]
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
# 删除本地tag
$ git tag -d [tag]
# 删除远程tag (注意 空格)
$ git push origin :refs/tags/[tag]
图形管理工具
Github for Desktop
Github出品的软件,功能完善,使用方便。对于经常使用GitHub的开发人员来说是非常便捷的工具。界面干净,用起来非常顺手,顶部的分支时间线非常绚丽。
Source tree
老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。功能丰富,基本操作和高级操作都非常流畅,适合初学者上手。
TortoiseGit
对于熟悉SVN的开发人员来说,这个小乌龟图标应该是非常友善了。TortoiseGit 简称 tgit, 中文名海龟Git。它与其前辈TortoiseSVN都是非常优秀的开源版本控制客户端软件。
远程仓库------!!!
常用的托管服务(远程仓库)
我们可以借助互联网上提供的一些代码托管服务来实现远程仓库,其中比较常用的有GitHub、码云、GitLab等。
gitHub ( 地址: https://github.com) ) 是一个面向开源及私有软件项目的托管平台,只支持Git 作为唯一的版本库格式进行托管
码云(地址: https://gitee.com/ ) 是国内的一个代码托管平台,所以相比于GitHub,速度更快
GitLab (地址: https://about.gitlab.com/ ) 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服。
查看远程
# 查看远程 列出指定的每一个远程服务器的简写
git remote
# 查看远程 , 列出 简称和地址
git remote -v
# 查看远程仓库详细地址
git remote show <仓库简称>
添加/移除远程 仓库
# 添加远程仓库
git remote add <shortname> <url>
# 移除远程仓库和本地仓库的关系(只是从本地移除远程仓库的关联关系,并不会真正影响到远程仓库)
git remote rm <shortname>
从远程仓库获取代码
# 从远程仓库克隆
git clone <url远程Git仓库地址 >
# 从远程仓库拉取 (拉取到.git 目录,不会合并到工作区,工作区发生变化)
git fetch <shortname> <分支名称>
# 手动合并 把某个版本的某个分支合并到当前工作区
git merge <shortname>/<分支名称>
# 从远程仓库拉取 (拉取到.git 目录,合并到工作区,工作区不发生变化) = fetch+merge
git pull <shortname> <分支名称>
git pull <shortname> <分支名称> --allow-unrelated-histories # 强制拉取合并
注意:如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错(fatal: refusing to merge unrelated histories ),解决此问题可以在git pull命令后加入参数--allow-unrelated-histories (如上 命令)
# 将本地仓库推送至远程仓库的某个分支
git push [remote-name] [branch-name]
github仓库
ssh连接
实际上git 不仅仅支持用户名密码方式的配置,可以有另外一种相对更加安全的配置即ssh 方式配置
该方式与前面https方式相比,只是影响github对于用户的身份鉴权方式,对于git的具体操作(如提交本地、添加注释、提交远程等操作)没有任何影响。
ssh 方式的底层原理:
ssh连接地城是RAS加密算法,又称非对称加密,是一种现在公认的最安全的加密方式
数学基础好的同学可以研究一下
https://www.cnblogs.com/cjm123/p/8243424.html
公钥私钥加密可以看作古代 的"虎符" , 我们本地电脑有一份,远程服务器有一份, 只要 "虎符" 核对通过 表示身份无误,可以执行提交等操作,无需输入用户名密码
ssh 密钥的生成:
#生成公钥私钥
ssh-keygen -t rsa
一直回车即可
会默认用户目录 .ssh 目录生成一个默认的id_rsa文件 和id_rsa.pub
gitee仓库
搭建个人主页
将静态资源上传至仓库;择服务 pages 即可部署
必须有个index.html 文件
只能搭建静态网站,动态网站请租赁服务器搭建提供服务
Star:
点赞, 注意这里的并不像朋友圈那样容易获得点赞,圈内人还是很克制的
Watch:
如果你watch 了某个开源项目,那么这个项目后续所有的改动你将收到通知
Fork :
将别人的代码克隆到你自己的仓库
作用一: 如果担心某个优秀的项目别人突然有一天不开源了,你可以fork到自己的仓库
作用二: 修改别人的代码
以linux 为例,你其实不是linux 社区的开发人员,但是你 又想为linux 开发做贡献(维护代码)
你并没有权限,怎们办?
你可以先把linux 开源的代码 fork 到你自己的仓库,此时你就可以操作自己的仓库进行修改代码了
如何让别人合并你修改好的代码呢?
我们注意项目的上方有一个 " Pull Request" 这个按钮的意思是 "请求求别人合并你修改的代码"
当我们发起一个 Pull Request 时 , 项目的拥有者将收到 Pull Request请求,然后将根据你提交代码的质量决定是否合并
管理--仓库设置---基本设置
我们可以删除修改我们自己仓库的基本信息
我们可以邀请其他人成为项目的开发人员或者管理人员

浙公网安备 33010602011771号