共计 3669 个字符,预计需要花费 10 分钟才能阅读完成。
1. 版本控制
版本控制是一种记录若干文件内容变动,以便未来查阅特定版本订正状况的零碎。简略来讲就是备份和记录,上面理解下三种不同版本控制的倒退历程
1.1 本地版本控制系统
人们把我的项目拷贝到本地磁盘进行备份,而后以命名形式来辨别。这种做法长处是简略,但毛病更多,比方备份更多,很有可能会混同不同版本之间的区别。为了解决这个问题,具备了第一种本地版本的管理系统。
本地版本治理就是把版本号存入数据库来记录文件的历次更新差别
1.2 集中化版本控制系统
本地版本控制系统可能将不同版本的文档保留下来并且借助版本记录能够很不便定位相干文件但又引入了新的问题,如何让在不同零碎上开发者协同工作?于是,集中化版本控制系用(Centralized Version Control Systems,简称 CVCS)应运而生。这类零碎,例如 svn,都有一个繁多的集中管理的服务器,保留所有文件的订正版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新,多年以来,这一成为版本控制系统的规范做法。
这样做的长处是解决了人们开发协同的问题,然而把所有的代码提交到同一台服务器上有一个显著的毛病就是单点故障,如果这台服务器宕机了,那所有人都不能提交代码,还有如果这台服务器磁盘产生故障,碰巧没做备份或者备份不够及时,就还是会有失落数据的危险,最坏的状况是彻底失落整个我的项目的所有历史更改记录,而被客户端提取进去的某些快照数据除外,但这样的话仍然是个问题,你不能保障所有的数据都曾经有人当时实现提取进去过。本地版本控制系统也存在相似问题,只有整个我的项目的历史记录被保留在繁多地位,就有失落所有历史更新的危险。
1.3 分布式版本控制系统
为了解决集中化版本管理所带来的问题,分布式版本治理控制系统(Distributed Version Control Systems,简称为 DVCS)就应运而生了。在这类零碎中,例如 git,客户端不只是提取出最新版的文件快照,而是把最原始的代码仓库镜像到本地,这样一来,任何一处协同工作用的服务器产生故障,任何时候都能够用任何一个镜像进去的本地仓库复原。因为每一次的提取操作,实际上都是一次对代码仓库的实现备份
所以综上来看的集中化版本控制系统是对本地版本控制系统的一次降级,因为它退出了协同操作,分布式版本控制系统是对集中化版本控制系统的一次补充,使之更加欠缺
2. 装置 git
装置 git 依据 git 官网提供的下载方式就能够了,在这里就不赘述了
3.git 的三种状态和工作模式
应用 git 操作文件时,文件的状态分为以下三种:
状态 | 形容 |
---|---|
已批改(modified) | 已批改示意批改了文件,但还没保留到数据库中 |
已暂存(staged) | 已暂存示意对一个已批改文件的以后版本做了标记,使之蕴含在下次提交的快照中 |
已提交(commited) | 已提交示意数据曾经平安的保留在本地数据库中 |
针对 git 文件的是三种状态,这里须要理解 git 我的项目的三哥工作区域:工作区、暂存区、git 仓库
分类 | 形容 |
---|---|
工作区 | 简略的了解为在电脑里能看到的目录,比方本人创立的本地我的项目目录 |
暂存区 | git 的版本库里存了很多货色,其中最重要的称为 stage 或者叫 index 的暂存区,还有 git 主动创立的第一个分支 master,以及指向 master 的一个指针叫做 HEAD |
git 仓库 | 工作区又一个暗藏目录.git,这个不是工作区,而是 git 的版本库 |
根本的 git 工作流程形容如下:
- 在工作区中批改某些文件
- 对批改后的文件进行快照,而后增加到暂存区
- 提交更新,将保留在暂存区域的文件快找永恒转储到 git 仓库中
流程图如下:
4. 创立版本库
版本库又名仓库,能够简略了解成一个目录,这个目录下所有文件都能够被 git 治理起来,每个文件的批改、删除,git 都能追踪,以便任何时刻都能够追踪历史,或者在未来某个时刻能够还原。
初始化 git 仓库
执行 git init 在本地初始化一个本地仓库
5.git 命令
5.1 提交相干命令
git config 配置本机或者本 git 仓库的用户信息
命令 | 形容 |
---|---|
git config –global user.name | 查看或者设置全局也就是本机的用户 name,该命令后不加想要设置的用户名,加上就是设置,例如 git config –global user.name “John Doe”,将用户名设置为 John Doe |
git config user.name | 查看或者设置本仓库的用户 name,git config –global user.name “tom”,将本仓库的用户名设置为 tom |
git config –global user.email | 跟下面全局 user.name 统一 |
git config user.email | 跟下面本仓库 user.name 统一 |
git add 将文件增加到暂存区
命令 | 形容 |
---|---|
git add filename | 将单个文件增加到暂存区,例如 git add a.txt 就是将已批改的 a.txt 增加到暂存区 |
git add . | 将该仓库内所有批改、增加、删除等已批改的文件增加到暂存区 |
git add -u | 将仓库内所有批改和删除的文件到暂存区 |
git add -i | 通过交互式的形式将文件增加到暂存区 |
git commit 将暂存区文件提交到本地仓库中
命令 | 形容 |
---|---|
git commit | 调用 vim 编辑器进行提交信息的编写 |
git commit -m msg | 间接进行提交信息的编写,例如 git commit -m ‘first commit’ |
git commit -a -m msg | 将所有批改和删除的文件都提交到本地仓库,留神不蕴含新建的文件 |
git commit –amend | 能将本次批改的内容合并到上一次的 commit,尽量不要批改曾经提交到近程仓库的代码 |
git status
查看文件状态
5.2 版本相干命令
git log 相干命令
命令 | 形容 |
---|---|
git log | 显示所有提交日志信息 |
git log -n | 显示前 n 条件 |
git log –stat | 显示批改的行数 |
git log –since=2.days | 显示近两天的日志信息 |
git log –since=2021-04-01 | 显示从 2021 年 4 月 1 号至今的日志信息 |
git log –until=2021-04-01 | 显示 2021 年 4 月 1 号之前的日志信息 |
git log –grep=init | 显示提交信息蕴含 init 的日志信息 |
git log –author=tom | 显示作者为 tom 的日志信息 |
git log –pretty=oneline | 单行显示日志信息,只包含 commitId,commit 信息 |
git show commit-id | 显示某个改变的具体内容 |
git reset 相干命令
git reset 用于将以后 HEAD 复位到指定状态,个别用于撤销之前的一些操作
命令 | 形容 |
---|---|
git reset –hard HEAD^ | 回退到上一版本,回退到上上一个就是 git reset –hard HEAD^^,几个 ^ 代表往前回退几个版本,能够简写 git reset –hard HEAD~n, 例如 git reset –hard HEAD~100,回退到 100 个版本 |
git reset –hard commitId | 通过 commitId 回退版本 |
git reflog
git reflog 能够查看所有分支的操作记录,默认保留 30 天
例如,你先提交了 a 版本,而后又通过 git reset 回退到之前的 b 版本,然而你有某些起因须要看看 a 版本代码,此时能够通过 git reflog 查看 a 版本的 commitId,通过 git reset 再次会到 a 版本
git revert
git revert commitId 回滚到某个提交
跟 reset 的区别是,它产生了一个新的 commit
5.2 分支相干命令
git branch 相干命令
命令 | 形容 |
---|---|
git branch | 显示所有分支 |
git branch branchname | 查看某个分支 |
git checkout branchname | 切换到某个分支 |
git checkout -b branchname | 新建并切换到某个分支 |
git push origin HEAD:branchname | 建设远端分支 |
git push origin :branchname | 删除某个远端分支 |
git resbase 相干命令
git resbase -i commitId,这个 commitId 之后的 commit 都能够被批改,交互式
git cherry-pick 相干命令
将一个分支的 commit 检出到以后分支
先要晓得 pick 的 commitId,而后切换回指标分支上,git cherry-pick commitId,胜利后,这个指标分支就有了这个 commit 信息
5.3 其余命令
git blame fielname 查看某个文件的每一行代码的提交信息
git blame filename -L a,b 查看某个文件起始行到终止行代码的提交信息
长时间应用的 git 库越来越大,如何删除没有用的数据?
分支删除后,然而分支的内容、提交信息等实际上还在,这些 log 被称为不可达的点,默认过期工夫 30 天
git reflog expire –expire-unreachable=now -all
将以后不可达的点全副过期
git gc –prune=now -aggressive
将所有过期的革除掉