Git简介
什么是Git
Git 是最流行的分布式版本控制系统(Distributed Version Control System,简称 DVCS)。它由 Linus Torvalds 创建,当时非常需要一个快速、高效和大规模分布式的源代码管理系统,用于管理 Linux 源代码。由于 Linus 对险些所有现有的源代码管理系统抱有猛烈的反感,因此他决定编写自己的源代码管理系列。2005 年 4 月,Git 就诞生了。到了 2005 年 7 月,维护工作就交给了 Junio Hamano,自此他就不停在维护这个项目。虽然最初只用于 Linux 内核,但 Git 项目敏捷传播,并很快被用于管理许多其他 Linux 项目。如今,险些所有的软件开发,尤其是在开源天下中,都是通过 Git 进行的。
git作为分布式代码版本管理控制系统在软件开发中扮演着非常紧张的脚色,它不仅可以保障代码的完整性和稳定性,进步软件开发服从,还可以进步软件产品的质量和可维护性。
什么是分布式版本管理
- 版本管理:记录代码文件的内容变化,以便在开发过程中来查阅某个版本修订情况的系统;
- 分布式:多个系统一起维护一个共同的版本管理系统,
为了便于理解这里将会合式版本控制系统与分布式控制系统放在一起解说,
- 会合式控制系统(最常见的为SVN):都有一个会合管理的服务器,生存所有文件的修订版本,协同工作的人们都通过局域网连接这台服务器进行版本控制工作,这么做最显而易见的缺点是假如碰巧服务器发生故障,则在故障期间内,所有人都无法协同工作,假如备份不够及时,以致会存在丢失数据的风险;
- 分布式控制系统:每个协同工作者的电脑中都具有代码堆栈的完整镜像,工作者在本地进行版本管理,任何一处服务器发生故障,过后用任何一个镜像出来的本地堆栈进行恢复。
怎样使用Git
- Git安装
- 进入Git官网,直接下载Windows版本安装包:
- 打开安装包,按以下步骤配置安装过程:
- # 显示当前的Git配置
- $ git config --list
- # 编辑Git配置文件
- $ git config -e --global
- # 设置提交代码时的用户信息,将global选项换成local选项时,设置仅对当前仓库生效
- $ git config --global user.name "[name]"
- $ git config --global user.email "[email address]"
复制代码 由于Git是分布式版本控制系统,所以一定需要填写用户名和邮箱作为一个标识。有了这个git config --global参数,表现你这台机器上所有的Git堆栈都会使用这个配置,当然你也可以使用git config --local对某个堆栈指定的不同的用户名和邮箱。Git 初次安装必须设置一下用户署名,否则无法提交代码。
至此,Git的安装和根本配置已经完毕。
Git底子知识
Git工作空间
- **工作区(working directory) **:在电脑里能看到的目次;
- 版本库(对象库) :工作区有一个隐藏目次 .git ,这个目次不算工作区,而是Git的版本库;
- 暂存区 :一般存放在 .git 目次下的 index 文件 .git/index 中,所以暂存区也叫索引(index/Stage)。
- 远程库:远程堆栈 ,托管代码的服务器,可以简朴的以为是你项目组中的一台电脑用于远程数据互换(通过push将代码推送到远程库中)。
下图展示了工作区、暂存区和版本库之间的关系:
上图中左侧为工作区,右侧为版本库(暂存区在版本库中)。
在版本库中标志为 index的地区是暂存区(stage/index),标志为 master 的是 master 分支所代表的目次树。
图中 HEAD 实际是指向 master 分支的一个“游标”,所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
图中的 objects 标识的地区为 git 的对象库,实际位于 .git/objects 目次下。
- 当对工作区进行修改(或新增)文件执行git add 时,暂存区的目次树会被更新,同时工作区修改的文件内容会被写入到版本库(对象库)中的一个新的对象中,而该对象的id会被记录在暂存区的文件索引中;
- 当执行提交操纵 git commit 时,暂存区的目次树会被写到版本库中,master分支会做相应的更新,即master最新指向的目次树就是提交时原暂存区的目次树;
- 当执行 git reset HEAD 命令时,暂存区的目次树会被重写,会被master分支指向的目次树替换,但是工作区不受影响;
- 当执行 git rm --cache 命令时,会直接从暂存区删除文件,工作区则不做改变;
- 当执行 git checkout .或 git checkout -- 命令时,会用暂存区全部的文件或指定的文件替换工作区的文件。注:这个操纵很伤害,会清除工作区中未添加到暂存区的改动;
- 当执行 git checkout HEAD . 或 git checkout HEAD 命令时,会用HEAD指向的master分支中的全部或部分文件替换暂存区和工作区中的文件。这个命令也很伤害,由于不光会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
- 已提交的(committed):表现数据已经安全的生存在本地数据库中;
- 已修改(modfied):表现修改了文件,但还没生存到数据库中;
- 已暂存(staged):表现对一个已修改文件的当前版本做了标志,使之包罗在下次提交的快照中。
Git根本语法
创建Git堆栈
下表列出了创建Git堆栈的命令
命令说明git init初始化Git堆栈git clone克隆远程Git堆栈到本地 这里有两种方式创建Git堆栈
- 使用init命令在本地创建文件夹设置为Git堆栈,语法如下:
- # 在当前目录下创建一个新的Git仓库
- git init
- # 在指定目录下创建一个新的Git仓库
- git init <path>
复制代码
- 使用clone命令在远程服务器中克隆一份Git堆栈到本地,语法如下:
- # 克隆<url>仓库内容在当前目录
- git clone <url>
- # 克隆<url>仓库内容在指定<dir_name>目录
- git clone <url> <dir_name>
复制代码
- url有四种格式分别为:local,https,ssh,git,四种不同协议的优劣请参考这篇git clone几种不同的协议。
使用发起:git clone将远程堆栈克隆到本地,由于是克隆来的,因此会将远程堆栈中的.git堆栈一起克隆下来,可以省去在本地进行git init的操纵。当第一次新建代码库时,发起使用git clone。
文件提交与修改
下表列出了Git有关文件提交与修改的命令
命令说明git add添加文件到暂存区git rm将文件从暂存区和工作区中删除git commit提交暂存区到本地堆栈git mv移动或重定名工作区文件git reset/git revert回退版本
- # 添加指定文件<file1> <file2>到暂存区
- $ git add <file1> <file2> ...
- # 添加指定后缀的文件到暂存区
- $ git add *.h *.c
- # 添加指定目录到暂存区,包括子目录
- $ git add <dir>
- # 添加当前目录的所有文件到暂存区
- $ git add .
- # 也可以使用
- $ git add --all
- # 添加每个变化前,都会要求确认
- # 对于同一个文件的多处变化,可以实现分次提交
- $ git add -p
复制代码
- 使用rm命令将文件从暂存区与工作区中删除,语法如下:
- # 删除工作区文件,并且将这次删除放入暂存区
- $ git rm <file1> <file2> ...
- #将修改过并且已经放到暂存区的文件删除的话,则必须要用强制删除选项
- $ git rm -f <file1> <file2> ...
- # 停止追踪指定文件,但该文件会保留在工作区
- $ git rm --cached <file>
复制代码
- 使用commit命令提交暂存区文件到工作区,语法如下:
- # 提交暂存区到仓库区,<message>是一些备注信息
- $ git commit -m <message>
- # 提交暂存区的指定文件到仓库区
- $ git commit [file1] [file2] ... -m <message>
- # -a 参数设置修改文件后不需要执行 git add 命令,直接来提交
- $ git commit -a
复制代码
- 使用mv 命令用于移动或重定名一个文件、目次或软连接,语法如下:
- $ git mv <file-original> <file-renamed>
- #如果改文件名已经存,想要强制覆盖可以使用
- $ git mv -f <file-original> <file-original>
复制代码
- 使用reset或者revert命令进行版本回退操纵,语法如下:
- reset命令用于恢复到之条件交的某个版本,且谁人版本之后的版本全都不要了,语法如下:
- # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
- $ git reset <file>
- # 重置暂存区与工作区,与上一次commit保持一致
- $ git reset --hard
- # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
- $ git reset <commit>
- # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
- $ git reset --hard <commit>
复制代码 reset工作流程图如下所示:
- revert将之条件交的某一个版本生成一个新的版本,以达到撤销该版本的修改的目的,语法如下:
revert工作流程图如下所示:
分支操纵
下表列出了Git有关分支操纵的命令
命令说明git branch创建,查看等分支操纵git checkout切换分支git merge/rebase归并分支
- branch命令用于分支的操纵,比如创建分支,查看分支等等,语法如下:
- # 列出所有本地分支
- $ git branch
- # 列出所有远程分支
- $ git branch -r
- # 列出所有本地分支和远程分支
- $ git branch -a
- # 新建一个分支,但依然停留在当前分支
- $ git branch <branch-name>
- # 新建一个分支,并切换到该分支
- $ git checkout -b <branch>
- # 新建一个分支,指向指定commit
- $ git branch <branch> <commit>
- # 新建一个分支,与指定的远程分支建立追踪关系
- $ git branch --track <branch> <remote-branch>
复制代码
- checkout 命令有多种用途,具体语法用途如下所示
- 用来切换分支,语法如下:
- # 新建一个分支,并切换到该分支
- $ git checkout -b <branch>
- # 切换到指定分支,并更新工作区
- $ git checkout <branch-name>
- # 切换到指定分支,并且该分支和某个文件同名
- $ git checkout <branch-name> --
- # 切换到上一个分支
- $ git checkout -
复制代码 - 将工作区指定的文件恢复到前次commit的状态,语法如下:
- # 将指定文件从暂存区复制到工作区,
- # 用来丢弃工作区对该文件的修改
- $ git checkout -- <filename>
- # 还可以指定从某个 commit 恢复指定文件,
- # 这会同时改变暂存区和工作区
- $ git checkout HEAD~ -- <filename>
复制代码
- merge/rebase用于归并分支操纵
- merge命令用于将一个分支归并到当前分支时,语法如下:
- # 合并指定分支到当前分支,默认fast-forward方式
- $ git merge <branch>
- # 合并指定分支到当前分支,采用非fast-forward方式
- git merge <branch> --no-ff
复制代码 默认情况下,git-merge采用fast-forward模式。当使用fast-forward模式进行归并时,将不会创造一个新的commit节点。当使用–no–ff的方式进行归并时,则会产生一次提交记录。具体区别可见下图所示,
- rebase命令同样用于将一个分支归并到当前分支,语法如下:
从本质上讲,merge与rebase的目标相同,都是将来自同一个分支的修改归并到另一个分支中。两者的区别在于merge保存了完整的汗青记录,包罗按时间次序排序,具有较高的可追溯性,而rebase可以使提交变得整洁。
远程操纵
下表列出了Git有关分支操纵的命令
命令说明git push创建,查看等分支操纵git pull/fetch切换分支
- push命令用于从远程获取代码库并归并到本地版本,语法如下:
- # 取回指定远程仓库分支到本地分支
- git push <remote> <remote_branch>:<local_branch>
复制代码
- pull与fetch用于从远程获取代码库,
- fetch命令用于从远程获取代码库
- # 取回指定远程仓库的所有分支
- git fetch <remote>
- # 取回指定远程仓库的指定分支
- git fetch <remote> <branch>
- # 取回所有远程仓库的所有分支
- git fetch --all
复制代码 - pull命令用于从远程获取代码库并归并到本地版本,语法如下:
- # 取回指定远程仓库分支到本地分支
- git pull <remote> <remote_branch>:<local_branch>
复制代码 两者区别在于:
- git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否归并到工作本机分支中。
- git pull 则是将远程主机的最新内容拉下来后直接归并,即:git pull = git fetch + git merge,如许可能会产生冲突,需要手动解决。
Git进阶
git开发过程中常用的分支先容
master 为主分支,也是用于部署生产情况的分支,确保master分支稳定性, master 分支一般由develop以及hotfix分支归并,任何时间都不能直接修改代码
develop 为开发分支,始终保持最新完成以及bug修复后的代码,一般开发的新功能时,feature分支都是基于develop分支下创建的。
- feature 分支
- 开发新功能时,以develop为底子创建feature分支。
- 分支定名: feature/ 开头的为特性分支, 定名规则: feature/user_module、 feature/cart_module
- release分支
release 为预上线分支,发布提测阶段,会release分支代码为基准提测。当有一组feature开发完成,首先会归并到develop分支,进入提测时会创建release分支。假如测试过程中若存在bug需要修复,则直接由开发者在release分支修复并提交。当测试完成之后,归并release分支到master和develop分支,此时master为最新代码,用作上线。
- hotfix 分支
分支定名: hotfix/ 开头的为修复分支,它的定名规则与feature分支类似。线上出现紧急问题时,需要及时修复,以master分支为基线,创建hotfix分支,修复完成后,需要归并到master分支和develop分支
git提交格式规范
规范格式:<type>: <subject>
type:标识本次提交的类型,如
- feature: 新功能;
- fix: 修补bug、style等;
- docs:文档(documentation);
- refactor: 重构(即不是增加新功能,也不是修改bug的代码变动);
- test: 增加测试;
- chore: 构建过程或辅助工具的变动。
subject: 提交目的的简短形貌,形貌做了啥或者改了啥,假如有团队管理工具(issue ,JIRA)或者产品需求,必须以内部定名的需求代号作为形貌信息的一部分,方便查看日志。
远程堆栈
远程堆栈运营商
Github
Github 是一个基于git实如今线代码托管的堆栈,向互联网开放,共有堆栈免费,建立私有堆栈要收费,由于Github的初志就是为了各人共享自己的劳动成果。
Gitee
Gitee 即码云,是 oschina 免费给企业用的,不用自己搭建情况,可以建立自己的私有堆栈。是由开源中国社区推出的基于git的代码托管服务平台。目前招商银行,中国科学技术大学,CSDN等多家企业和机构都在使用码云平台。
本节将先容Gitee平台下的新建分支堆栈代码上传。
gitee的使用
SSH方法与远程堆栈建立连接
- 鼠标右键运行git bash,使用如下命令生成ssh公钥和私钥,一起回车下去;
- #邮箱必须是gitee绑定的邮箱,注意单引号
- ssh-keygen -t rsa -C 'xxx@xxx.xxx'
复制代码 - 根据文件提示找到公钥文件,然后打开.ssh/id_rsa.pub文件,拷贝里面的内容;
- 打开gitee,在官网—个人—设置—ssh公钥—下面的公钥文本域(大的输入框)复制进去,在Title对应文本框中给这个sshkey设置一个名字,配置完成;
- 完成配置后,在本地克隆,拉取,上传文件到远程堆栈可避免输入暗码。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |