Git 为分布式
版本控制系统,是目前最早进的版本控制
系统。javascript
思考:html
- 版本控制是啥意思?
维基百科:java
版本控制(英语:Version control)是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程。此外,版本控制也是一种软件工程技巧,借此能在软件开发的过程当中,确保由不一样人所编辑的同一程序文件都获得同步。git
百度百科:程序员
版本控制是指对软件开发过程当中各类程序代码、配置文件及说明文档等文件变动的管理,是软件配置管理的核心思想之一。github
个人理解:版本控制是一种记录一个或若干文件内容变化,以便未来查阅特定版本修订状况的系统。web
通俗地说就是对一个或若干个文件的内容改动状况按照特定的版本号进行保存,以便未来浏览者快速清晰了解文件的改动信息(内容变化信息,内容改动时间,做者等)算法
名称:Linus Torvalds 林纳斯 托瓦兹) 芬兰人 现受聘于开放源代码开发实验(OSDL:Open Source Development Labs, Inc)数据库
自传: 《乐者为王》just for funvim
本地版本控制系统
集中式版本控制系统
分布式版本控制系统
思考:
怎么理解分布式与集中式?(廖雪峰老师给出的理解)
- 集中式:版本库是集中存放在中央服务器的,而干活的时候,用的都是本身的电脑,因此要先从中央服务器取得最新的版本,而后开始干活,干完活了,再把本身的活推送给中央服务器。中央服务器就比如是一个图书馆,你要改一本书,必须先从图书馆借出来,而后回到家本身改,改完了,再放回图书馆。
- 分布式:分布式版本控制系统根本没有“中央服务器”,每一个人的电脑上都是一个完整的版本库,这样,你工做的时候,就不须要联网了,由于版本库就在你本身的电脑上。
SVN的优缺点:
Git的优缺点:
SVN与Git的最主要的区别:
SVN与GIT的特性对比:
特性 | SVN | GIT |
---|---|---|
架构模式 | 集中式 | 分布式 |
安全性 | 较差,按期备份 | 高,开发者本地电脑就是一个完整的版本库 |
适用性 | 文档管理, | 代码管理, |
易用性 | 简单上手,对新手友好 | 上手困难,学习成本高但效率搞 |
灵活性 | 较低,易发生单点故障,拉取分支 | 高,单机本地操做,多个备份,本地新建分支 |
权限管理 | 拥有严格的权限管理 | 尚无严格权限管理,有帐号角色划分 |
GitHub是什么?
Github与Git的关系?
GitHub能作什么?
Gitlab是什么?
+ GitLab 是一个用于仓库管理系统的开源项目,使用Git做为代码管理工具,并在此基础上搭建起来的web服务(在线代码仓库管理软件)。
Gitlab与GitHub的区别?查看对比
Gitlab能为咱们作什么?
国内代码托管平台
咱们使用Git来记录每一次文件内容的变动,版本的更新,清晰地比较出不一样版本的内容差别;可使用Git在项目的历史版本自如地进行切换;还可使用Git从当前项目的更改中撤销一些操做,能够新建分支,合并分支甚相当联远程服务器仓库等,这一切的背后都是怎么实现的?了解Git的思想以及基本原理这些操做也就略知一二了。
Gi的数据存储原理
Git对象
Git的底层命令、高层命令
Git经常使用命令共有30多个,可运行git help
查看;但Git总共有130多个命令,能够经过git help -a
查看,这些命令能够分为高层命令和底层命令,底层命令被设计成unix风格,不经常使用
Git的引用(reference或refs)
浏览完整的提交历史,但为了能遍历那段历史从而找到全部相关对象,须要记住最后提交的SHA-1值。咱们须要一个文件来保存 SHA-1 值,并给文件起一个简单的名字,而后用这个名字指针来替代原始的 SHA-1 值。文件被称为“引用(references,或缩写为 refs)”,使用git branch (branchname)
这样的命令时,Git 实际上会运行 update-ref
命令,取得当前所在分支最新提交对应的 SHA-1 值,并将其加入你想要建立的任何新引用中。
HEAD引用
git/refs/heads
目录下,每个分支对应一个文件远程引用
refs/remotes
目录下.git下的文件夹
info 文件夹下的exclude文件包含项目全局忽略匹配模式,与.gitignore文件互补
logs 保存全部更新的引用记录
objects 文件夹存储着Git数据库的全部内容,存储全部Git的对象
refs 文件夹存储着全部分支指向各自提交对象的指针;本地分支,远端分支,标签等
heads 记录commit分支的树根
remotes 记录从远程仓库copy来的commit分支的树根(只读)
origin
.git下的文件
高级命令
HEAD
commit
branch
merge 合并指定分支
思考:
git merge 与 git rebase 的区别是?
- rebase会合并该分支与其余分支的commit history,可能会获得一个新的commit history
- rebase获得更简洁的项目历史,去掉了merge commi,若是合并出现代码问题不容易定位,由于re-write了commit history
- merge会建立新的commit,包括每一个分支的commit 详情
- 每次merge会自动产生一个merge commit,特别是commit比较频繁时,看到分支很杂乱。
- 想要获得一个干净的,没有merge commit的线性commit历史记录,选择git rebase
- 想要获得一个完整的commit历史记录,且想避重写commit历史记录的风险,选择git merge
git reset 与 git rebase的区别?
- git revert会生成一个新的提交来撤销某次提交,这次提交以前的commit都会被保留,也就是说对于项目的版本历史来讲是往前走的。
- git reset 则是回到某次提交,相似于穿越时空。
gitflow工做流约定使用的分支简介
首先,完成中央仓库的初始化,将新项目搭建起框架后的工程代码或要转gitflow的项目代码上传至git中央仓库。项目负责人克隆中央仓库到本地造成master分支,并拉取develop分支(步骤①)推送至服务器。通常的实际场景,开发团队中只有项目负责人有权限操做master分支,拉取develop分支,并将develop分支的代码合并到master分支中。
而后,开发团队中的其余人克隆中央仓库的develop分支到本地,造成全体成员统一的惟一的develop分支轨迹。以后,按照需求及成员各自的分工,各个成员能够从develop分支拉取出各自的featrue分支(步骤②)进行独立的开发;若涉及到多人合做开发同一分支,拉取的分支要及时推送至服务器,便于各成员共享。
当各成员完成各自的功能开发后,需将完成后的代码提交到featrue分支,而后合并到develop分支(步骤③)。代码合并后,featrue分支能够再也不保留。
功能累积足够且稳定或到达约定的提测周期时,项目负责人应当从develop分支拉取出release分支(步骤④),打包提交相应的版本给测试人员进行部署测试,测试中提交的bug所有在该release分支完成修改。
测试结束并完成bug修复后,release分支应该合并回develop分支和master分支(步骤⑤),代码合并后,release分支能够再也不保留。合并后的master分支,应由项目负责人及时推送到中央仓库(步骤⑥)。同时全体成员要及时同步本身develop分支。
有上线需求时,直接从master分支打包提交应用版本进行部署。当线上版本出现重大bug,项目负责人需从master分支拉取hotfix分支(步骤⑦),进行线上的紧急修复。
最后,修复后的hotfix分支要合并回develop分支和master分支(步骤⑧)。并推送到中央仓库(步骤⑨)。
获取Git仓库
git init
初始化仓库git clone
一个仓库合并其它分支的代码
撤销合并merge/rebase
git reset --hard [commit]
工做区、暂存区撤回到制定的commit版本git reset --merge [commit]
或者 git reset --merge HEAD^
撤回到合并前的commit修改某次的commit
git commit -amend -m 'comment'
替换上一次的commitgit rebase -i HEAD~[数字n]
进入vim编辑模式,并显示最近n条最新的commit记录撤销某次的commit
git revert HEAD
产生新一次commit来抵消上一次提交git revert commit_id
撤销中间某次commitgit revert -m commit_id
撤销其余分支合过来的commitgit revert --no-commit commit1..commit5
撤销commit1(不包括)至commit5之间的连续commit
git revert的参数:--no-edit:执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息。
--no-commit:只抵消暂存区和工做区的文件变化,不产生新的提交。
丢弃某次commit
git reset [last good SHA]
丢弃掉某个提交以后的全部提交,在提交历史中完全消失git reset --hard [last good SHA]
--hard
参数可让工做区里面的文件也回到之前的状态查看提交历史记录
查看文件的改动
git diff
对比工做区与暂存区的同文件, 未添加至暂存区的文件改动git diff --staged/cached
查看添加至暂存区全部文件的内容修改git state
显示工做目录和暂存区的状态暂存文件的改动
git stash
临时保存和恢复工做区文件的改动撤销文件的改动
撤销暂存区的文件
git rm --cache [filename]
网站连接
视频网站
相关书籍