一、前言
Git 是一个快速、可扩展的 分布式版本控制系统 ,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问.Git与你熟悉的大部分版本控制系统的差别是很大的。也许你熟悉Subversion、 CVS 、Perforce、Mercurial 等等,他们使用“增量文件系统” (Delta Storage systems), 就是说它们存储 每次提交(commit)之间的差异 。 Git 正好与之相反,它会把你 的 每次提交的文件的全部内容(snapshot)都会记录下来 。
理论上,Git 可以保存任何文档,但是最善于保存文本文档,因为它本来就是为解决软件源代码(也是一种文本文档)版本管理问题而开发的,提供了许多有助于文本分析的工具。对于非文本文档,Git 只是简单地为其进行备份并实施版本管理。
二、安装(省略)
三、创建版本库
1、桌面打开Git bash here
2、进入D盘创建一个空文件夹Test
cd d:// //移动到D盘
mkdir Test //创建一个Test目录
3、进入Test文件夹执行git init 初始化本地仓库
git init 初始化版本库
4、查看Test文件夹里多了.git隐藏文件
ls -al //查看隐藏文件
此时一个版本库就创建完成,使用基本操作如下图
工作区:项目文件存在的目录,通过git init命令会初始化为一个git仓库。
git add:将工作区的修改添加到暂存区。
index/stage:暂存区,git add会将工作区里与暂存区存在差异的数据加入暂存区。
git commit:将暂存区的修改(与上次提交的差异数据)提交到本地仓库,并由版本库记录提交信息,每一次提交后HEAD会指向当前分支的最新提交节点。
main:默认主分支(老版本为master主分支)未创建新分支时,HEAD指向默认主分区。
HEAD:指向当前分支
git管理的文件各种状态:
untracked files:未被暂存区跟踪的新文件
changes not staged for commit:已被暂存区追踪的文件在工作区被再次修改但再次修改的数据还未加入暂存区的文件
Changes to be committed:表示工作区修改已加入暂存区的文件
四、在当前工作空间使用版本库。
4.1、git add
4.1.1、先查看当前工作区状态
git status //查看工作区状态
4.1.2、创建一个新的文件
touch Test.java //创建一个Test.java文件
ls //查看当前目录文件列表
4.1.3、再次查看工作区状态,此时提示有一个未添加到暂存区的新文件
git status
4.1.4、将文件添加到暂存区
git add Test.java //将修改加入暂存区
4.1.5、再次查看状态
changes to be committed:已经从工作区添加到暂存区的新文件,等待提交至本地仓库,可通过git rm --cached
4.1.6、将添加到暂存区的文件恢复至工作区再次查看状态
git rm --cached Test.java //将Test.java文件从暂存区恢复至工作区未跟踪(即暂存区不存在与工作区相同的文件)状态
git status //再查看状态
此时Test.java文件恢复为工作区未被暂存区跟踪状态,可重新通过git add
4.1.7、再次添加至暂存区并提交到本地仓库
首先设置用户和邮箱
git config user.name "" //设置用户名
git config user.email "" //设置邮箱
将暂存区提交至本地仓库
git commit -m "第一次提交"
4.1.8、查看提交历史记录
git log //查看历史提交记录
4.1.9、修改Test.java文件保存后再次查看状态
public class Test{
public static void main(String []args){
System.out.printfln("a");
}
}
git restore
4.1.10、查看已修改的文件Test.java,再取消修改
cat Test.java //查看Test.java
git restore Test.java //取消工作区Test.java文件的修改
cat Test.java
取消工作区的修改后查看Test.java文件为空。
4.1.11、再次修改Test.java文件
4.1.12、查看状态,将修改文件加入暂存区后再次查看状态
报错原因:主要是windows和unix系统的换行符标志不同,LF是UNIX标志,CRLF则是Windows标志,提交的代码中有UNIX标志的换行符
解决方案:
git config --global core.autocrlf false:用户级别全局修改
git config --local core.autocrlf false:项目级别单项目修改
本次选择项目级别修改
git config --local core.autocrlf false
此刻可通过git restore --staged
git restore
git restore --staged
4.1.13、将加入暂存区的已修改恢复至工作区未暂存状态
git restore --staged Test.java
此时可通过git restore
4.1.14、重新将Test.java工作区的修改加入暂存区并提交至本地仓库
1 file changed:一个文件被修改
6 insertions(+):插入6行数据
4.2、git log和git reflog
4.2.1、git log查看HEAD指向的当前分支的当前节点(版本)以及当前节点的父节点、祖先节点的提交记录信息
git log
git commit每一次提交都会产生一个新的版本,可通过版本切换将已提交代码恢复至不同版本时期的代码。HEAD指向的是当前分支的当前版本。
4.2.2、git reflog查看按顺序记录的每一次HEAD指向发生改变后的历史记录,无关父节点或祖先节点,可以帮助我们很好解决一次错误提交或者切换版本后返回上一次正确版本。
git reflog
4.3、git reset重置操作,重置HEAD指向的版本号
4.3.1、git log查看当前节点
当前工作区只有Test.java一个文件,查看文件内容
4.3.2、再插入一行代码并提交
4.3.3、再次提交到本地仓库
4.3.4、查看当前节点记录
4.3.5、利用git reset重置HEAD指向
git reset 有三个参数分别是hard,soft,mixed(不带参数默认)。
4.3.5.1、带--hard参数为回退到指定版本,工作区与指定版本内容一致,清空指定版本提交后的工作区修改和暂存区修改记录,即git status查看状态无任何修改,此刻工作区、暂存区、本地仓库内容一致且与指定版本内容一致
git reset --hard HEAD~1 //回退一个版本,回退几个版本就是~X
git reset --hard xxxxxxx //将HEAD指向切换至当前分支指定版本号(commit id即提交节点),只需要前7位版本号即可
此时工作区文件与第二次提交的内容一致
查看当前节点及父、祖节点
git status查看工作区与暂存区、暂存区与本地仓库差异
此时工作区、暂存区、本地仓库内容一致且与第二次提交内容一致。
4.3.5.2、带--soft 参数,回退到指定版本,但工作区与暂存区保留,再次通过git commit提交到本地仓库后与当前的版本内容一致,但版本号会改变
先切换至第三次提交,查看Test.java文件
git reset --hard 2cacaf3
带--soft参数重置到上一个提交节点、查看Test.java文件变化,并查看当前提交节点
HEAD指向切换到第二次提交,但工作区文件未发生改变,与第三次提交内容一致
查看当前工作区、暂存区、本地仓库状态
git status
工作区与暂存区一致且有修改但未提交,此时提交将会变成一个新的提交,虽然与第三次提交内容一致,但会成为第二次提交以后的一个分支提交
4.3.5.3、带--mixed参数
切换回第三次提交,查看Test.java文件
带--mixed参数切换到上一次提交,查看Test.java文件变化
查看当前状态
Test.java文件当前有修改但未暂存,说明--mixed参数将本地仓库回退到指定版本且清除了与指定版本暂存区差异,但保留了工作区当前版本与指定版本间的差异
4.3.5.4、通过git reset重置版本回退后再次提交会在指定的重置版本后面产生一个分节点,以后每次提交都在新的分节点后面,如果重置版本为当前分支的最新节点,则再次提交后不会产生分节点
未完待续....