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
将所有过期的革除掉