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
将所有过期的清除掉
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。