【学习总结】Git学习-参考廖雪峰老师教程四-时光机穿梭
学习总结之Git学习-总
目录:
一、Git简介
二、安装Git
三、创建版本库
四、时光机穿梭
五、远程仓库
六、分支管理
七、标签管理
八、使用GitHub
九、使用码云
十、自定义Git
期末总结
四、时光机穿梭
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
git status
:随时掌握工作区的状态,看文件是否被修改过
git diff
:如果git status
显示有文件被修改过,用git diff
查看修改内容
------------------------------------------
4.0 穿梭机的必备基础知识
4.0.1 修改readme.txt内容(注:廖老师依然用vi)
-
vi坑看这个: 菜鸟教程vi/vim
-
自己填坑的相关博文:【学习总结】vi/vim命令是使用
1 - vi readme.txt
进入输入模式
2 - 在输入模式下进行文本的编辑
3 - 编辑完成后按 :
进入到底线命令模式,以在最底一行输入命令
4 - 冒号:
后输入wq
保存并退出后回车,其中w
保存文件,q
退出程序
4.0.2 查询git状态:git status
下图表示:readme.txt被修改过了,但还没有准备提交的修改
4.0.3 查询修改内容:git diff
4.0.4 明确状态以后,提交修改,与提交新文件是相同的两步
git add readme.txt - 把文件添加到仓库(没有任何输出)
git status - 再次查询git状态,确保正确
git commit -m "add distributed" - 提交到仓库
git status - 随时查询git状态是否正确
------------------------------------------
4.1 版本回退
< commit-head-存盘复活点移动 >
4.1.0 commit
- “BOSS关复活点”
打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。
Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit,以防万一可以从commit点复活
比如:再次修改一版readme.txt文件后commit
Git is a distributed version control system.
Git is free software distributed under the GPL.
之后add并commit新一版的readme文件
- 注:此时共有三个版本的readme提交了
4.1.1 “HEAD”指向的版本就是当前版本,使用命令git reset --hard commit_id
在历史版本之间穿梭。
*注:版本号没必要写全,前几位就可以了,Git会自动去找。但也别写太短以免混淆。
Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD的指向改变了
$ git reset --hard HEAD^
head
- 当前版本
head^
- 回退一个版本
head^^
- 回退两个版本
head~100
- 回退100个版本。。
(此次head貌似全大写或全小写均可)
比如:回退到<上一个版本>(git log
- 命令查看历史版本)
比如:根据<版本号>回到最新版本(git reflog
- 查看历史命令)
- 注意:<只看不编辑文本>时用命令
cat
----学到了,哈哈~
4.1.2 git log
- 查看提交历史,以便确定要回退到哪个版本(从近到远的最新记录三次)。
$ git log --pretty=oneline
- 简化信息
4.1.3 git reflog
- 查看命令历史,以便确定要回到未来的哪个版本
------------------------------------------
4.2 工作区和暂存区
< 理解add&工作区->暂存区 vs commit&master分支 >
工作区(Working Directory):本地电脑能看到的目录,文件夹啥的 - 比如本例中的“learngit”文件夹
版本库(Repository):包含了stage和master分支 - 比如本例中的“.git”就是版本库
stage(或叫index):暂存区
master:自动建立的分支,或称默认分支,有一个指向master的指针head
把文件往Git版本库里添加的时候,是分两步执行的:
git add
- 把文件修改添加到暂存区stage;
git commit
- 把暂存区的所有内容提交到当前分支(比如master)
例子一枚:::
4.2.1 修改readme内容并新建文本文件“LICENSE”
新建文件LICENSE就直接用vi命令新建(看demo视频里LICENSE后面没有加后缀,我也不加试试):
(并且没有产生readme.txt.bak好像叫这个名的莫名其妙文件)
4.2.2 查看状态并上传
Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked
两次add之后的状态:
git add
命令实际上就是把要提交的所有修改放到暂存区(Stage)- 然后,执行
git commit
就可以一次性把暂存区的所有修改提交到分支
之后commit:
- 一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的
------------------------------------------
4.3 管理修改
< git - 跟踪修改的理解 >
4.3.1 第一次修改 -> git add
-> 第二次修改 -> git commit
:这样只commit了第一次修改
- 看评论区说这个例子举得不太切合,哈哈是有点不太贴合要表达的。。
4.3.2 用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别
- 虽然没说,但看加号和减号,应该是以工作区(即本地区)为本位比较的。
4.3.3 第一次修改 -> git add
-> 第二次修改 -> git add
-> git commit
- add完毕后,一并提交commit即可
上接:再次add
readme.txt文件并commit
后,查diff
发现没有diff..
-----> 总体而言,本小节确实比较。。emmmm一言难尽可有可无似乎好像是这样。。
------------------------------------------
4.4 撤销修改
场景1:想直接丢弃工作区的修改 -- 用命令git checkout -- file
。
场景2:想丢弃已add添加到暂存区的修改 -- 第一步用命令git reset HEAD <file>
,就回到了场景1;第二步按场景1操作。
场景3:想要撤销已commit提交到版本库的修改 -- 参考<版本回退>一节,前提是没有<推送到远程库(后面会学)>。
4.4.1 场景一:工作区(本地修改)撤销
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
(版本库状态)或git add
(stage区)时的状态
- 验证如下:
-
简言之:
checkout file
-- 使工作区(本地)回到版本库(stage & master),如果stage和master不一致,以stage为准。 -
PS :
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,分支管理中会再次遇到git checkout
命令。
4.4.2 场景二:add撤销-暂存区修改撤销
用命令git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区,之后按情景一撤销工作区修改
(此处沿用刚刚add到暂存区的“my boss is stupid”版本)
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
4.4.3 场景三:commit撤销-版本库修改撤销
参考<版本回退>一节,前提是没有<推送到远程库(后面会学)>
版本回退:
git reset --hard HEAD^
- 回退到上一个版本
git reset --hard commit_id
- 在历史版本之间穿梭
git log
- 查看提交历史版本之类的
git log --pretty=oneline
- 简化信息 - 防刷屏一定要配合pretty=oneline食用!!!!
demo如下:
- 注:
场景一,只涉及本地的回退,比较简单。
场景二,stage暂存区撤回到本地,再用场景一的方法把本地的回退一下。
场景三:已commit到版本库的撤回,这个就厉害了,经测试发现,这一个操作直接一夜回到解放前,也不用场景二那么麻烦再手动回退本地了。
此处注意一下。打个比方,场景三是前几课学的,此处的重点是场景一和二,要记下,重点掌握一下。
------------------------------------------
4.5 删除文件
git rm
- 用于删除一个文件
git checkout -- filename
用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
4.5.1 从本地的工作区删除一个已有的文件
为demo我们先新建一个如:test.txt,add并commit后从本地删除
此时版本库里已经有test.txt文件了,下一步从本地把test.txt文件删除