廖雪峰Git学习笔记2-时光机穿梭
基本都是按照廖雪峰老师的重新敲打了一遍,增强记忆,中间穿插了一些自己的理解,新手可能有误,请看原版:
https://www.liaoxuefeng.com/wiki/896043488029600/896954074659008
时光机穿梭
上一张已经可以使用git add和git commite 添加文件到Git 仓库,这一章主要讲述如何使用git来管理仓库中的文件。
当使用 vi file1.txt 改动txt文件后,可使用git status命令来查看仓库的状态。
$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: file1.txtno changes added to commit (use "git add" and/or "git commit -a")
以上是git status命令返回的结果,可看到file1.txt文件被修改,但是没有被添加or提交。
可使用git diff <file1.txt>命令来查看具体修改了什么内容
$ git diff file1.txt
diff --git a/file1.txt b/file1.txt
index 7a5e08f..c595d7d 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1,3 +1,5 @@This is file 1Hello
-Hello
\ No newline at end of file
+Hello
+This hello is by Git vi command
+what the matter?
以上可以看到file1.txt加了三行。知道了file1.txt修改了什么后就可以使用git add 和 git commit -m提交到仓库。使用insert键来更改txt文件,使用Esc键加:wq退出并保存
$ git add file1.txt$ git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)modified: file1.txt上面使用git add提交file1.txt,从git status可看到将被提交的修改包括file1.txt$ git commit -m "add hello"
[master 963b043] add hello1 file changed, 3 insertions(+), 1 deletion(-)$ git status
On branch master
nothing to commit, working tree clean重新提交仓库可看到一个文件被改变,增加了3行,删除了一行
此时用git status查看状态可考到当前没有需要提交的修改,工作目录是working tree clean
小结:
- 使用git status命令随时掌握工作区状态。
- 如果git status显示被修改过,可使用git diff查看具体被修改的内容。
版本回退
不断对文件进行修改,又不断提交修改到版本库。每当你觉得文件修改到一定程度时,可以先使用commit提交一个版本,如果后面把代码改乱了,可以回退到最近commit的一个版本。
使用git log 命令查看版本历史记录。
$ git log
commit 963b043ca09db1ca1aadc0cdc758b0a189ef48b7 (HEAD -> master)
Author: A <bbb@qq.com>
Date: Wed Dec 23 15:02:18 2020 +0800add hellocommit 1bf646e21317a16a83003b83bd0b752b23abacd1 (这一大串为提交的版本号,十六进制表示)
Author: A <bbb@qq.com>
Date: Tue Dec 22 16:42:14 2020 +0800create 2 filescommit b2525be4ea024a526871b545b0f0d8db45592337
Author: A <bbb@qq.com>
Date: Tue Dec 22 16:28:45 2020 +0800wrote a readme file
git log命令显示从最近到最远的提交日志,我们可以看到三次提交。
如果觉得信息太多,不需要了解Author和Date,可以在原命令上加入 --pretty=oneline
git log --pretty=oneline
没提交一个新版本,Git会自动串成一个时间线,可使用可视化工具查看Git历史。
怎么回退到上一个版本?
以git log输出的三个版本为例,我们怎么回滚到 create 2 files版本?
Git必须知道当前版本是哪个版本?使用HEAD表示当前版本。上一个版本是HEAD^
上上个版本是HEAD^^
有多个版本回滚时可使用数字HEAD~100
使用git reset命令回退到某个版本。
git reset --hard HEAD^
现在使用git reset回到了create 2 files版本,现在若又想回到add hello的版本怎么办呢?可以使用以下代码:
git reset --hard 963b043 (963b043是add hello的版本号前几位,Git会根据这个版本号自动查找)
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你使用git reset时,是将指针指向了其他的版本。如果跟上面一样,回退了某版本后后悔了又想恢复新版本怎么办?现在需要找到Commit id。
使用 git reflog来记录每一次命令。
总结:
- HEAD指向的版本是当前版本。Git允许我们在版本的历史之间穿梭,使用命令 git reset --hard commit_id
- 穿梭前,用git log可以查看提交历史,以便确定要会回退到哪个版本
- 要重返未来,使用git reflog查看命令历史,以便确定要回到未来哪个版本。
工作区和暂存区
工作区
工作区指的是在电脑中.git所在的目录,即这个git仓库正在监控的工作区(文件夹)
版本库
工作区中的.git目录是Git的版本库。.git中存储了很多东西,其中有个叫做stage(index)的暂存区,还有Git自动创建的第一个分支master,和指向master的一个指针HEAD
PS:在Git Hash 中可看到每句开头都是这样,都会指向一个master:
thx@ASUS-PC MINGW64 /d/Git (master)
把文件往Git版本库中提交时两个步骤:
①git add file1.txt
将file1.txt的文件添加进stage暂存区
②git commit -m “add hello”
将“add hello”的修改提交,即把暂存区的所有内容提交到当前master分支。
之前讲过可以使用git add命令多次添加,然后使用一个git commit命令提交。其实就是把所有文件都放在暂存区,再一次性提交所有更改。
【实操】
使用vi file1.txt增加一行内容。同时使用vi nexfile.txt新增一个txt文件,此时使用git status命令查看工作区状态
$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: file1.txt
以上说明file1.txt被修改了,但是还没有从stage被提交Untracked files:(use "git add <file>..." to include in what will be committed)newfile.txt
因为newfile.txt没被git add提交过,所以现在仍然处于Untracked的状态
使用git add重新提交上述两个文件,用git status查看一下
$ git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)modified: file1.txtnew file: newfile.txt
暂存区的状态变为这样:
一旦提交后,如果没有对工作区做任何修改,则工作区就是working tree clean干净状态的。
此时版本库变成这样,暂存区被释放
管理修改
Git跟踪并管理的是修改,而不是文件。
当使用git add命令后,工作区的修改就被放入暂存区准备提交,若此时再对工作区进行二次修改,但并没有放入暂存区,使用git commit只会把在暂存区的文件提交。
可以使用git diff查看现有工作区和版本库已经被提交的最新版本的区别。
每次改动如果不用git add加入缓存区,就不会通过commit加入到版本库中。
撤销修改
使用git checkout – 来丢弃工作区的修改,有两种情况:
①file.txt修改后还没有放到暂存区,git checkout就回到和版本库一模一样的状态。
②file.txt的更改已经被添加到暂存区,git checkout就回到添加到暂存区后的状态。
总之,git checkout让文件回到最后一次git commit或者git add的状态。
注意撤销修改命令git checkout后的–很重要。
cat file1.txt可以在界面显示txt文件。
Q:若更改的内容已经到暂存区,怎么把暂存区的修改撤销掉(unstage)呢?
A:使用 **git reset HEAD **可以把暂存区的修改撤销掉,重新放回工作区。git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区,当使用HEAD是,表示使用最新的版本。(因为HEAD是指针,永远指向最新版本)
删除文件
可以直接在文件管理器中把没用的文件删了,或者使用rm命令。
rm file1.txt
Git知道你删除了文件,工作区和版本库就不一致了。git status命令会立刻告诉你哪些文件被删除了。
①若要从版本库中删除该文件,则用命令 git rm,并且提交 git commit
git rm file1.txt
rm ‘test.txt’
git commit -m “remove test.txt”
②若删错了,版本库中还有,则使用checkout中把它恢复到最新版本。
git checkout --file1.txt
git checkout是用版本库中的版本替代工作区的版本,无论工作区是修改还是删除,都可以一键还原。
廖雪峰Git学习笔记2-时光机穿梭相关推荐
- 廖雪峰Git学习笔记(上)
据廖老师git教程有所改动 一.git及相关概念 Git及版本控制系统 Git:用C语言开发的分布式版本控制系统 DVCS (Distributed Version Control System) 1 ...
- 廖雪峰Git学习笔记1-Git简介
Git的诞生 Linus用C语言写的一个分布式版本控制系统.2008年,Github网站上线,为开源项目免费提供Git存储. 集中式VS分布式 分布式版本控制系统没有"中央服务器" ...
- 廖雪峰git学习资料-涂改笔记
注意: 本文章是看廖雪峰官网资料整理而来原地址如下: http://www.liaoxuefeng.com/ 附件为git常用命令 前言: 注意的问题 如果是首次提交会第一步:先在本地建立一个一样的仓 ...
- 廖雪峰Git教程笔记与总结 -- Git简介、常用命令、分支管理
本文主要用于记录阅读Git教程 - 廖雪峰的官方网站后的一些心得笔记,并且对git一些常用命令做一个整理总结. 本文要点分为:1.Git简介:2.Git常用命令:3.Git分支管理. 一.Git简介 ...
- 廖雪峰git读书笔记--添加远程库
最近又看了看廖雪峰的git教程,在看"添加远程库"这一节时遇到问题,谨记之. 添加远程库超时 在看"添加远程库"这一节时遇到问题, 我先输入 $ git rem ...
- javaScript——廖雪峰老师学习笔记(一)
1.要查看一个变量的内容,在Console中输入console.log(a);,回车后显示的值就是变量的内容. 2.alert('我不想执行'); //提示框谷歌浏览器可直接执行 3.JavaScri ...
- 廖雪峰python学习笔记之高级特性
写在前面 寒假时本科舍友的一句话点醒梦中人-你的python基础还没弄明白吧!猛地一想好像确实如此,还停留在随插随用的程度,并且对于迭代器,函数式编程等等,没有深刻理解,所以项目做起来也是空中楼阁,所 ...
- 廖雪峰Python学习笔记1
Python基础 文章目录 一.基础语法规范 二.数据类型 三.字符串与编码 四.条件判断 五.循环 一.基础语法规范 1.用#作为代码注释 2.当语句以冒号:结尾时,缩进的语句视为到麻花,缩进**使 ...
- 【廖雪峰Python学习笔记】错误、调试、测试
文章目录 错误处理 调试 单元测试unitcase 文档测试 错误类型 程序编写问题bug – 字符类型错误等 用户输入错误 – 输入不符合规定的字符串 异常,程序运行时无法预测 – 磁盘满了,无法写 ...
最新文章
- c++ 界面交互影响处理代码执行速度_原创 | 某SCADA的远程代码执行漏洞挖掘与利用...
- map中只有一个值 获取_小学数学,为什么一个三角形中最多只有一个直角或一个钝角...
- 《浅谈架构之路:前后端分离模式》
- Object o = new Object()在内存中占几个字节
- 软件配置管理(三)软件配置管理核心功能
- python中定义一个空的字符串_04python—15种字符串操作
- error: L6235E: More than one section matches selector - cannot all be FIRST/LAST.
- 压力测试实践一:JMeter + JProfiler 入门
- python进阶学习笔记(四)--多线程thread
- 模板 n维矩阵的二分幂
- 过滤器在图纸上的符号_看不懂电气图纸?资深级老师傅教你如何识图,学会后受用一生...
- 迭代重心法 matlab,重心法
- 深度可分离卷积vs标准卷积
- 姜汝祥是个骗子吗_我是个骗子你是?
- 项目构建工具--webpack
- PyQt5,一个好的qt教程。
- HDU 2121 Ice_cream’s world II(最小树形图+虚根)
- 登链钱包(一款功能强大的以太坊钱包)完全开源
- Windows11打开任务管理器的方式
- 探讨Linux CPU的上下文切换原由
热门文章
- javascript 正则表达式 字符串 如何匹配 单个 反斜杠
- ffmpeg在线文档
- iOS 导入Charts 及工程配置
- np.argsort() 与 array.argsort()
- WebGL入门(十九)-三维视图通过调整正射投影矩阵/盒状可视空间实现三角形的显示与消失
- 鹏业云计价i20“新数据标准接口V2.0”投标报价编制
- 韶关实验室设计要点汇总
- 制作企业宣传片的意义。
- Docker集成kata containers
- 转贴:一个理发店的整合营销