一、用Git命令查看历史版本
1. git log
[查看之前提交的详细记录]
- 内容解析:(以第一个log为例)
①下图红色框框中的数值是一个哈希值,我们暂且可以将它理解为是一个指针,并指向了这次提交。
②这里的HEAD是一个指针,指向当前的版本;
③Author和Date表示的是提交人(刚开始我们配置的签名)和提交日期;
④红色框框里的是我们提交的时候写的注释; - 提交次数很多一个屏幕显示不下怎么办?就需要用到下面的多屏显示控制和接下来的指令了;
2. 多屏显示控制方式:
①空格向下翻页
②b向上翻页
③回车表示显示下一行
④q退出
3. git log --pretty=oneline
[每次提交的信息显示成一行]
4. git log --oneline
[每次提交的信息显示成一行并缩短哈希值(编码信息)]
5. git reflog
[在git log --oneline 的基础之上,显示Head@{移动到当前版本需要多少步}]
二、前进后退历史版本
1.理解本质
git在帮助我们管理各个版本的时候,它有个指针HEAD;我们的操作都是基于对HEAD这个指针进行操作的;
2.操作方式
2.1基于索引值操作
- 索引是就是那个哈希值
- 回退命令: git reset --hard 想回退版本的索引值
- 前进命令:和回退命令相同,只需要改变版本号;(不需要考虑是前进还是后退,只需要写好索引值即可)
2.2使用^符号(只能向后退,不可以往前)
- 命令 git reset --hard HEAD^
一个^号就可以回退一个版本,几个符号就可以回退几个版本;
- 疑问?如果想退10个版本还要写十个^符号么?为了解决这个问题就用到了下面的~符号
2.3使用~符号
- git reset --hard HEAD~[n]
2.4让我们看一下文件夹会有什么变化?
- 当前的文件夹是有很多文件
- 回退到最初的版本之后:
仔细看我们的文件发生了什么变化?回退到第一个版本后我们的文件也发生了变化哦! - 如果用到下面的–soft参数的话,文件是不会发生变化的;
3.reset命令的三个参数比较
- –soft参数
①仅仅在本地库移动我们的指针 - – mixed参数
①在本地库移动HEAD指针
②重置暂存区 - –hard参数
①在本地库移动HEAD指针
②重置暂存区
③重置工作区
三、删除
1. 删除本地库的文件:rm 文件名
- 1.1 例如我们删除一个版本库中的文件aaa.txt
- 1.2 将删除的文件再次加入暂存区
- 1.3注意:
删除的记录不会被清除,只要时提交到本地库的操作都不会被删除,对应的只要我们回退到相应的版本,文件也会被找回来;
2.添加到暂存区的文件的找回
- 利用git reset --hard [指针位置]的方式就可以了
- ①删除操作已经提交到本地库:指针位置指向历史记录;
②删除操作尚未提交到本地:指针位置使用HEAD;
3.找回别删除文件的前提
删除前,文件存在时的状态提交到了本地库;
四、比较文件差异
1.命令 git diff 文件名
- 第一步:我们以aaa.txt举例,下图是提交到本地仓库的aaa.txt的文件内容,两行6,两行7
- 第二步:对aaa.txt进行如下修改
- 第三步:输入 git diff aaa.txt 命令
- 内容解析:
①第一行diff --git a/aaa.txt b/aaa.txt:
表示比较两个版本的aaa.txt
②第二行index bcb04e5…7bfd263 100644:
表示两个版本的git哈希值(index区域的bcb04e5对象与工作目录的7bfd263对象进行比较)
③ - - - a/aaa.txt 和 +++ b/aaa.txt:
减号开头的表示变动前版本,加号开头的表示变动后的版本。
④红色字体表示文件删除了一行,绿色字体表示文件增加了一行;
⑤因为git是以行来管理我们的文件的,所以是先把777777这一行删掉,再增加一行777777 888888;
- 另外:与之前版本的aaa.txt进行比较
命令用:git diff HEAD^ aaa.txt
- 另外:如何比较多个文件?
命令: git diff HEAD
即不指定文件名时,会比较工作区中所有文件;
五、分支
1.分支的概念
- 1.1上图的master作为默认的分支(也是主干)- 什么是分支?
在版本控制过程中,使用多条线同时推进多个任务,比如说在我们开发一个网站的过程中,有两个新功能,一个是购买功能分配给了小A写,一个是搜索功能分配给了小B写;他们两个分别创建两个分支,并且在自己的分支上进行代码的撰写和管理(开发),彼此独立; - 1.2那么为什么要用分支?为什么不直接在主干上去进行呢?
①不污染master主干
②如果某一个分支开发失败了(开发思路和开发大方向偏离很严重需要改动的很多—可直接删除这个分支、如果开发人员的水平不高,你也不敢直接让他们在主干上开发啊) - 1.3分支的好处
①同时并行推进多个功能开发,提高开发效率
②各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可。
2.分支操作
- 创建分支
git branch [分支名] - 查看分支
git branch -v - 切换分支
git checkout [分支名]
现在的分支已经在hot_fix上了,那么我们可以对文件进行一些更改(假设我们在修复一个网站的bug),把修改好的文件add并commit到本地仓库;
那么修改好了代码,我们想要合并分支,那么前提是要站在主干分支上哦! - 合并分支
① 切换到接受修改的分支上(被合并,增加新内容)上;
git checkout [合并到那个分支的名字]
②执行merge命令
git merge [被合并的分支名]
- 解决冲突
- 为什么会产生冲突?
在这个下面这个图片里,我们有两个分支,那么就有一种可能,我们有可能在两个分支上修改了同一个文件的同一个地方,那么合并分支的时候以谁为准呢;
按照下面的步骤进行测试: - 在master分支下先进行对aaa.txt的修改,并add和commit
- 再切换到hot_fix分支下,对aaa.txt做出相同的修改(相同位置),并且add和commit
- 切换回master分支,输入git merge hot_fix命令对分支进行合并。
得到如下的信息
内容解析:- ①Auto-merging aaa.txt:自动合并aaa.txt
- ②CONFLICT (content): Merge conflict in aaa.txt:有冲突,在aaa.txt的合并时候有冲突
- ③Automatic merge failed; fix conflicts and then commit the result.:自动合并失败了,修改冲突再提交;
红色框框表示正在合并的状态;
- 我们使用vim编辑器来看一下现在的文件是什么样子的。
这时候我们手动的进行修改后,将文件修改好,再去add和commit
注意!!!!!!
这时候的commit不可以加上文件名
写 “git commit -m 注释 ” 就可以了
- 为什么会产生冲突?
- 总结一下,如何解决冲突
①第一步:编辑文件,删除特殊符号
②第二步:把文件修改到满意的程度,保存退出
③第三步:git add[文件名]
④第四步:git commit -m “日志信息”
注意!此时commit一定不能带具体文件名!!!