代码管理工具git
1、git的概念
git:是一个代码协同管理工具
是一个开源分布式版本控制系统,可用于高效的管理大小项目,05年创造的,由林纳斯(linux之父)发明的
用的最多的两种管理工具:svn、git
代码管理工具的分类
分布式和集中式
分布式:每一个结点都保存完整的代码,没有统一的中央服务器,节点之间相互推送下载代码完成代码共享,例如git
集中式:代码集中管理,每次完成的代码上传到中央管理器,然后再统一从中央管理器中下载代码使用,例如svn
SVN(Subversion)是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就郁闷了。
下图就是标准的集中式版本控制工具管理方式:
集中管理方式在一定程度上看到其他开发人员在干什么,而管理员也可以很轻松掌握每个人的开发权限。
但是相较于其优点而言,集中式版本控制工具缺点很明显:
服务器单点故障
容错性差
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
下图就是分布式版本控制工具管理方式:
代码管理工具的作用:
防止代码丢失,可以做备份
代码版本的管理,可以进行多个版本之间的跳跃
可以方便的将代码在多人之间进行共享传输
多人开发时,有各种模式可以方便代码管理
git的特点
git可以管理各种文件,特别是代码项目,多在linux和unix系统中使用
是分布式管理,不同于集中式,这是git和svn的核心区别
git可以很好的支持分支,方便多人协作工作
git分布式代码更加安全,有全球唯一的commit版本号
git是开源的软件
使用git可以脱网工作,且数据传输速度较快
2、git工作流程
一般工作流程如下:
1.从远程仓库中克隆 Git 资源作为本地仓库。
2.从本地仓库中checkout代码然后进行代码修改
3.在提交前先将代码提交到暂存区。
4.提交修改。提交到本地仓库。本地仓库中保存修改的各个历史版本。
5.在修改完成后,需要和团队成员共享代码时,可以将代码push到远程仓库。
下图展示了 Git 的工作流程:
3、git的安装
在ubuntu下安装
sudo apt-get install git
也可以到git官网进行下载 https://git-scm.com/downloads
安装完毕后,终端输入git命令,显示结果如下 表示安装成功
4、git的配置
4.1、 三种配置级别
1、系统中所有的用户都可以使用该配置
git config --system 配置信息
配置文件是:/etc/gitconfig
2、当前用户可使用该配置
git config --global 配置信息
配置文件是:~/.gitconfig
3、当前项目可使用该配置
git config
配置文件是:当前项目下的 ./.git/config
4.2、配置信息(必须配置用户名和邮箱否则无法使用)
(1)配置用户名
git config --system user.name lzx
(2)配置邮箱
git config --global user.email lan.tian.lu@qq.com
(3)配置编辑器
git config core.editor vim
注意:在配置当前项目级别的配置信息时,
需要先初始化本地仓库git init
(4)查看当前所有的配置信息
git config --list
5、基本操作
5.1、初始化仓库
(1)git的四个区域
工作区:就是项目所在的目录
暂存区:如果项目中的文件想备份或者进行其他操作,需要将指定的文件先保存在暂存区
本地仓库:本地仓库是真正保存备份或者其他操作文件的区域,只能被当前项目所在的目录使用
远程仓库:如果想将某一个项目与其他主机进行共享或者传递,需要使用远程仓库
(2)初始化本地仓库
git init
注意:
必须在项目所在的目录里面执行此命令
在某个目录下初始化仓库后会自动产生.git目录,当前目录下工作的所有文档可使用git进行管理
5.2、 查看区域状态
git status
注意:
会显示与暂存区或者本地仓库中保存的不一样的文件,提示是否要进行备份
5.3、将指定的文件提交到暂存区
git add <文件名> 将指定文件(任意文件类型的文件)提交到暂存区
git add * 将当前目录下所有的文件提交到暂存区
注意,提交到暂存区的文件没有存放在本地仓库中
git rm --cache <文件名> 删除暂存区的指定文件
5.4、将暂存区的文件提交到本地仓库
git commit -m <提交说明> 将文件同步到本地仓库并且设置提示说明
注意:
一般提示时需要附加一些同步信息,在-m后添加
所有对工作区的修改,如果想同步到仓库,都需要执行当前命令(add --> commit)
5.5、查看commit日志
git log 查看所有cimmit日志
git log --pretty=oneline 查看单行日志
5.6、比本地文件和本地仓库中文件的区别
git diff <文件名>
如输入命令没有反应 则说明本地文件和本地仓库中的文件没区别
6、恢复操作
6.1、从本地仓库恢复本地文件
git checkout <文件名>
6.2、丢弃工作区的修改
git checkout -- <文件名> 丢弃本地指定文件中的已经修改的内容(--两边都有空格)
6.3、本地仓库文件的移动和删除
git mv <源文件> <目的目录> 在本地仓库中将源文件移动目的目录中(本地也会移动)
git rm <文件名> 在本地仓库中删除指定的文件(本地也会删除)
注意:移动和删除后,需要再次执行git commit
6.4、回到上一个版本
git reset --hard HEAD^
HEAD后面的^数量决定了回到上几个版本
6.5、回到指定的版本
git reset --hard <commit_id>
只需要commit id的前七位即可
6.6、查看所有的历史版本
git reflog
最新的操作始终在最上边
7、标签管理(版本管理)
7.1、什么是标签
在当前工作的位置添加快照,保存工作状态,一般用于版本的迭代
7.2、创建标签
git tag <标签名称> 创建标签
git tag <标签名称> -m <提示信息> 创建标签并设置提示信息
例如:git tag v1.0
默认是在最新的commit id处创建标签
也可以指定commit id 创建标签
git tag <标签名称> <commit id> 指定某一个commit id处创建标签
7.3、查看标签
git tag
7.4、删除标签
git tag -d <标签名称>
7.5、查看指定标签的具体信息
git show <标签名称>
7.6、恢复到指定标签的位置
git reset --hard <标签名称>
8、临时工作区操作
一个功能实现的时候可能有很多种方法,可以通过临时工作区保存不同的方法,然后在选择合适的临时工作区作为想要使用的方法
如果要使用临时工作区,在本地工作区写完的方法不要备份,而是直接保存在临时工作区中,本地工作区中的文件还是初始的状态,这样又可以写第二种方法,以此类推,最终在所有的方法中选择最优的,从临时工作区中取出代码即可
8.1、创建保存临时工作区
git stash
8.2、查看临时工作区
git stash list
8.3、使用指定的工作区
git stash apply stash@{编号}
8.4、使用最新的临时工作区并删除
git stash pop
如果打开的是较早版本的代码则不能使用该指令,需要先提交到本地工作区后在执行该命令(保证工作区是干净的)
使用git stash pop后还要提交到本地工作区
git add * //提交到暂存区
git commit -m <提交说明>
8.5、删除指定的临时工作区
git stash drop stash@{编号}
8.6、删除所有的临时工作区
git stash clear
9、分支操作
9.1、什么是分支
分支主要用于多人协作工作,分支即获取原有代码,在此基础上创建自己的工作环境,单独开发,不会影响其他分支的操作,开发完成后再统一合并到主线分支中
创建分支的好处:安全,不影响其他人工作
9.2、分支分类
project(项目库)
master(主线分支) //代码管理员
hotfix(线上紧急bug修复分支)
develop(开发分支)
feature(功能分支) //普通码农在此分支
release(发布分支)
bugfix(bug修复分支) //测试工程师在此分支
(1)长期分支
1)master:主线分支
记录项目主线版本的开发迭代过程,该分支是已发布的稳定的产品版本。
master分支的权限由版本管理员统一进行管理,除版本管理员外,其他任何人不允许向master分支合并代码。
其他分支需要向master分支合并代码时,首先提出合并请求,然后由版本管理员合并到master分支,合并后,版本管理员应立即添加版本号,发布随时可用的产品版本;每向master分支合并一次,产品版本号就会增加一次
2)develop开发分支
记录所有开发人员日常工作的成果,该分支是相对稳定的开发版本
develop分支的合并操作由研发主管和版本管理员共同管理,不允许开发人员将自己的代码直接合并到develop分支,也不允许开发人员在develop分支上直接进行开发工作,一经发现严肃处理
一个项目库只能有一个master分支和一个develop分支
项目库创建后,由版本管理员从master分支创建develop分支,项目组所有成员需要克隆服务器上的项目库到本地,然后再从develop分支创建自己的feature分支进行工作
(2)短期分支
项目库中存在的短期分支有:feature、release、bugfix和hotfix。
1)feature:功能分支
用于开发新的功能;
所有新功能的开发都要先创建feature分支,然后再进行开发工作,feature分支由开发人员从develop分支创建
不同的功能需创建不同的feature分支
2)release:发布分支
用于产品发布准备;
新功能开发完成后需要发布产品新版本时,要创建release分支进行发布准备,release分支由版本管理员从develop分支创建
3)bugfix:bug修复分支
用于修复不紧急的bug;
系统测试过程中发现bug,开发人员需要从release分支创建bugfix分支进行修改,不允许开发人员在release分支上直接修改bug
4)hotfix:线上紧急bug修复分支
用于修复产品发布后出现的紧急bug
产品上线后,在客户现场出现问题,需要马上解决时,由开发人员从master分支创建hotfix分支进行紧急修复
9.3、查看当前分支
git branch
注意:前面有*的分支表示当前正在工作的分支
9.4、创建一个分支(默认在主分支创建)
git branch <分支名称>
9.5、切换工作分支
git checkout <分支名称>
9.6、创建并切换到新的分支
git checkout -b <分支名称>
主要用于在创建的分支基础上在创建分支
9.7、将指定的分支合并到当前分支
仓库管理员在主分支,收到其它分支程序猿的合并请求后
仓库管理员在主分支上使用此命令合并到主分支来
每合并一次要使用
git add * //提交到暂存区
git commit -m <提交说明> //提交到仓库
一次
git merge <分支名称>
合并过程中如果没有冲突,直接合并后当前分支即为干净的状态,直接保存在本地仓库中
如果产生冲突,需要人为的选择,然后在进行add和commit的操作
在创建分支前,尽量保证当前分支是干静的,以减少冲突的发生
9.8、删除指定的分支
git branch -d < 分支名称>
注意:
如果删除的分支没有合并,是不能用当前命令删除的
使用-D删除,表示强制删除指定分支
10、远程仓库
10.1、什么是远程仓库
远程仓库可以共享仓库中的项目,可以被其他主机接收到
10.2、创建远程仓库
(1)创建文件夹
mkdir <目录名>
(2)设置文件夹的属主(不设置也可以)
chown <用户名>:<组名> <目录名>
(3)将该文件夹设置为共享仓库
git init --bare <项目名称>
(项目名称一般都是以.git结尾)
(4)设置远程仓库的属主
chown -R <用户名>:<组名> <项目名称>
10.3、添加远程仓库
git remote add <仓库名称> <用户名>@<ip地址>:<共享仓库的绝对路径>
注意:
默认使用ssh作为传输手段,仓库名称可以任意起名字
必须在本地的某个git仓库下执行,才能是本地仓库和远程仓库关联
10.4、删除远程仓库
git remote rm <仓库名称>
10.5、将本地仓库的文件推送到远程仓库
git push -u <仓库名称> <要推送的分支>
注意:第一次推送需要加-u,以后不需要
注意:需要使用ssh协议才可以上传本地仓库的文件到远程仓库
按照ssh:sudo apt-get install openssh-server
重启ssh:sudo service ssh restart
10.6、从远程仓库获取项目
git clone <用户名>@<ip地址>:<共享仓库的绝对路径>
10.7、从远程仓库拉取分支或者代码,可以更新代码
git pull <远程仓库名> <远程分支名> 拉取远程仓库指定的分支并且与当前分支合并
git pull <远程仓库名> <远程分支名>:<本地分支名> 不合并
10.8、代码推送和更新
git push 将本地仓库的文件推送到远程仓库
git pull 从远程仓库中更新代码
git fetch 也用于更新,但是如果有新的分支不会合并
10.9、本地旧覆盖远程新
git push --force <远程仓库名> 当本地比远程旧,用本地覆盖远程
11、github
11.1、什么是github
是一个网站,本质就是一个远程仓库,全球最大的开源社区网站
开发者可以注册账号建立自己的github仓库,就可以在本地通过git操作远程github仓库
git是github唯一的代码管理工具
github里面创建的仓库相当于就是远程仓库
github中所有的项目,包括别人的,都是开源的,所以自己推送项目时也需要是开源的
11.2、创建新的仓库
(1)点击右上角加号,选择New repository
(2)设置仓库名和说明信息,设置为公有的仓库,
设置readme(可以不设置),下面两个都默认就行,
点击Creating repository创建新的仓库
11.3、上传本地仓库的项目到远程github仓库
(1)方法1:使用http协议
(2)方法2:使用ssh协议
1)在本地主机生成ssh密钥
ssh-keygen
注意:
必须获取当前主机的秘钥并设置到gihub,否则无法与github进行连接和操作
默认的秘钥存放在 ~/.ssh目录下
生成过程提示设置密码,如果不设置可以直接回车
ubuntu安装ssh服务器:
sudo apt-get install openssh-server
2)复制秘钥
进入~/.ssh目录,复制id_rsa.pub公钥的内容
3)设置秘钥
登录github账号,选择右上角图片中的settings,然后点击SSH and GPG key,点击new ssh key,title随便设置,将刚才复制的秘钥粘贴到key中,然后点击add ssh key,设置成功
设置后只能通过ssh协议上传
4)上传文件时不需要输入密码