目录
修改文件
版本回退
小测试
第一次修改提交
第二次修改提交
第三次修改
查看历史提交记录
版本回退快的原因
撤销修改
位于工作区未add
已add未commit
已add且commit
删除文件
分支管理
理解分支
创建分支
切换分支
修改文件
版本库是指maser
查看当前提交状态指令:git status
这里表示ReadMe被修改过了,但是还没提交
显示版本库和工作区文件差异指令:git diff HEAD 文件名
显示暂存区和工作区文件差异指令:git diff 文件名
- a:表示修改前文件(a/ReadMe,改动前文件名是ReadMe)
- b:表示修改后文件(b/ReadMe,改动后文件名仍然是ReadMe)
- -:表示修改前
- +:表示修改后
- -1:展示改动前的第一行内容
- +1,2:展示改动后从第一行开始到第二行的内容(1,2可被理解为行号的范围)
基本概念:工作区中文件的新增、修改或删除都是对工作区的修改
注意事项:Git追踪管理的是修改而不是整个文件
版本回退
基本概念:Git能管理历史版本文件,想要以前版本的文件就需要用到版本回退功能
指定退回某一次版本指令:git reset [选项] HEAD
本质是回退版本库的内容,工作区或暂存区是否回退由命令参数决定
常见选项:
- --mixed:默认选项不用写,将暂存区内容退回为指定提交版本内容,工作区文件保持不变
- --soft:将版本库回退到某个指定版本,不改变工作区和暂存区的内容
- --hard:将暂存区和工作区的内容退回到指定版本
- HEAD:可以直接写成commit id 表示指定退回的版本,HEAD表示当前版本,HEAD^表示上一版本,HEAD^^表示上上个版本......,也可以使用~数字表示,HEAD~0表示当前版本、HEAD~1表示上版本......
注意事项:
1、工作区有未提交的代码时不要用hard,否则无法找到未提交的代码
2、使用--hard将暂存区和工作区的内容退回到指定版本
2、hard还可以做后悔药(选择之前最新的commit id就能回退到原来的位置)
3、git reflog记录所有提交的指令
4、git reflog得到的小串字符是原commit id的一部分,也可以通过它们进行回退
小测试
步骤:更新三个版本的ReadMe,并分别进行3次提交
第一次修改提交
第二次修改提交
第三次修改
查看历史提交记录
如果我们在提交完version3后,发现version3编写错误,想要退回version2,重新基于version2开始编写,即希望将工作区的内容退回到version2版本,故需要用到--hard参数:
可以发现,此时ReadMede文件的内容已经退回到version2了,当前我们再次使用git log查看一下提交日志,发现最新的commit id是version2:
如果我还想回到version3,但是此时version3的commit id我们已经无法通过git log找到了,Git为我们提供了一个git reflog指令帮我们记录了每一次命令:
其中,1c7c46b是什么东西?它是version3的commit id的一部分,在版本回退的时候我们也可以使用commit id的一部分来代表目标版本:
版本回退快的原因
Git内部有个指向当前分支(mastr)的HEAD指针,refs/heads/master文件中保存当前master分支的最新commit id,当我们回退时该指针指向的内容会根据我们的要求而改变:
撤销修改
问题:工作区写了很长时间代码,但是越来越写不下去自己写的太垃圾了,想要恢复到上一个版本
位于工作区未add
指令:git checkout -- 文件名
功能:将工作区的文件回退到上一次的版本
注意事项:--必须加,否则会变成另一种意思
已add未commit
指令:git reset HEAD 文件名
功能:将暂存区内容退回指定的版本内容,但工作区内容不变
reset的回退还可以回退到当前版本,即跟版本库中内容保持一致,如果版本库中的内容是空,则工作区和暂存区中的内容也可以回到空
已add且commit
版本库中回撤到上一版本的前提条件是:commit之后没有push
push:将版本库中的内容提交到远程仓库(在实际使用时都是用远程仓库的,撤销修改的主要目的就是为了防止我们的劣质代码放入远程仓库)
删除文件
基本概念:在Git中删除也是一个修改操作,要让一个文件彻底消失要将它的暂存区中的内容也删
指令:git rm 文件名
功能:将文件从工作区和暂存区删除
当您在 Git 中删除文件并提交这一更改时,实际上提交的是对该文件的删除操作。即使只提供一个简单的删除信息,Git 仍然能够识别并记录这个操作。
当您执行
git commit -m "Remove file_name"
这样的命令后,Git 会创建一个新的提交记录,并将其中包含了指定文件被删除的信息。版本库中确实还保留着历史记录,但在最新提交中包含了对应文件被移除或者删除掉所做出更改
分支管理
理解分支
基本概念:每次的提交会被串成一条时间线即分支,若只有一条分支,则它是主(master)分支
注意事项:
1、HEAD 指向当前工作目录状态(通常是某个 branch 的 tip),而 master 分支则表示项目历史记录中主要开发线上最后一次 commit 的位置
2、HEAD可以指向其它分支
创建分支
查看本地当前所有分支指令:git branch
*表示当前HEAD指向的是master分支,即当前工作分支
新建分支指令:git branch 分支名
此时dev分支和master分支指向同一个修改,这是因为dev分支是根据最新一次提交创建的
想要让dev分支指向一条另外的提交线,需要令HEAD指向dev分支
切换分支
切换指令:git checkout 分支名
git checkout --表示撤销修改
接下来在dev分支下修改ReadMe文件,新增一行内容并进行一次提交:
现在dev分支完成工作,切换回master分支:
发现ReadMe文件中新增的内容不见了,但是在dev分支上该内容还在:
这是因为dev和master两者指向的提交是不一样的:
结论:因为我们是在dev分支上提交的,而master分支此时的提交点并未被改变,当切换至master分支时,HEAD就指向了master,当然看不见提交了
~over~