廖雪峰Git学习 | 笔记二:修改以及版本回退
修改
上一节已经成功地添加并提交了一个readme.txt文件,现在我们继续修改readme.txt文件,改成如下内容:
Git is a distributed version control system.
Git is free software.
运行git status
命令看看结果:
$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified: readme.txtno changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt
被修改过了,但还没有准备提交的修改。
用git diff
这个命令查看具体修改了什么内容,:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.Git is free software.
git diff
顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个distributed
单词。
知道了对readme.txt
作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add
:
$ git add readme.txt
同样没有任何输出。在执行第二步git commit
之前,再运行git status
看看当前仓库的状态:
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)modified: readme.txt
git status
显示将要被提交的修改包括readme.txt
,下一步,就可以放心地提交了:
$ git commit -m "add distributed"
[master e475afc] add distributed1 file changed, 1 insertion(+), 1 deletion(-)
提交后,我们再用git status
命令看看仓库的当前状态:
$ git status
On branch master
nothing to commit, working tree clean
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。
小结
要随时掌握工作区的状态,使用
git status
命令。如果
git status
显示文件被修改过,用git diff
可以查看修改内容。
版本回退
如上不断对文件进行修改,然后不断提交修改到版本库里,每当文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit
。
一旦把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
在Git中,我们用git log
命令查看历史记录,git log
命令显示从最近到最远的提交日志:
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800append GPLcommit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800add distributedcommit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800wrote a readme file
如果嫌输出信息太多,可以试试加上--pretty=oneline
参数:
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
类似1094adb...
的是commit id
(版本号),Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个用十六进制表示的非常大的数字。每台机器看到的commit id
不一样。
为什么
commit id
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面还要多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:
回退
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交。
上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
现在,要把当前版本回退到上一个版本,就可以使用git reset
命令:
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
--hard
参数有啥意义?这个后面再讲,现在先放心使用。
看看readme.txt
的内容是不是版本add distributed
:
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
果然被还原了。
还可以继续回退到上一个版本wrote a readme file
,不过且慢,用git log
再看看现在版本库的状态:
$ git log
commit e475afc93c209a690c39c13a46716e8fa000c366 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800add distributedcommit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800wrote a readme file
可以发现最新的那个版本已经看不到了,那么如何回到最新的版本?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,就可以顺着往上找到那个最新版本
的commit id
是1094adb...
,于是就可以指定回到未来的某个版本:
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
再看看readme.txt
的内容:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
又恢复到了最新的版本。
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL
:
┌────┐
│HEAD│
└────┘│└──> ○ append GPL│○ add distributed│○ wrote a readme file
改为指向add distributed
:
┌────┐
│HEAD│
└────┘││ ○ append GPL│ │└──> ○ add distributed│○ wrote a readme file
然后顺便把工作区的文件更新了。所以你让HEAD
指向哪个版本号,你就把当前版本定位在哪。
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id
怎么办?
在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^
回退到add distributed
版本时,再想恢复到append GPL
,就必须找到append GPL
的commit id。
Git提供了一个命令git reflog
用来记录每一次命令:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
从输出可知,最新版本
的commit id是1094adb
。
小结
现在总结一下:
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
廖雪峰Git学习 | 笔记二:修改以及版本回退相关推荐
- 廖雪峰Git学习笔记2-时光机穿梭
基本都是按照廖雪峰老师的重新敲打了一遍,增强记忆,中间穿插了一些自己的理解,新手可能有误,请看原版: https://www.liaoxuefeng.com/wiki/896043488029600/ ...
- 廖雪峰Git学习笔记(上)
据廖老师git教程有所改动 一.git及相关概念 Git及版本控制系统 Git:用C语言开发的分布式版本控制系统 DVCS (Distributed Version Control System) 1 ...
- 廖雪峰Git学习笔记1-Git简介
Git的诞生 Linus用C语言写的一个分布式版本控制系统.2008年,Github网站上线,为开源项目免费提供Git存储. 集中式VS分布式 分布式版本控制系统没有"中央服务器" ...
- Git学习笔记:修改
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- Git学习笔记(二)
本文主要讲解分支管理 Git学习笔记(一) 目录 一.概念 二.创建与合并分支 2.1 简介 2.2 配图示例 2.3 命令小结 三.解决冲突 四.分支管理策略 五.Bug分支 5.1 stash功能 ...
- 廖雪峰git学习资料-涂改笔记
注意: 本文章是看廖雪峰官网资料整理而来原地址如下: http://www.liaoxuefeng.com/ 附件为git常用命令 前言: 注意的问题 如果是首次提交会第一步:先在本地建立一个一样的仓 ...
- 廖雪峰Git教程笔记与总结 -- Git简介、常用命令、分支管理
本文主要用于记录阅读Git教程 - 廖雪峰的官方网站后的一些心得笔记,并且对git一些常用命令做一个整理总结. 本文要点分为:1.Git简介:2.Git常用命令:3.Git分支管理. 一.Git简介 ...
- 廖雪峰git读书笔记--添加远程库
最近又看了看廖雪峰的git教程,在看"添加远程库"这一节时遇到问题,谨记之. 添加远程库超时 在看"添加远程库"这一节时遇到问题, 我先输入 $ git rem ...
- [Git高级教程(二)] 远程仓库版本回退方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 ...
- qt撤销与回退_Git版本控制教程 - Git查阅、撤销修改和版本回退
查看文件的修改历史 git log --pretty=oneline 文件名 # 显示修改历史 git show 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e # ...
最新文章
- elastic search java_elasticsearch学习四、JAVA调用
- Linux Shell常用技巧(十)
- 指派问题(匈牙利算法)
- Teams App如何选择用户
- 阅读源码学设计模式-单例模式
- apollo持久化sentinel_Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则
- js视频html代码,html+JS刷图实现视频效果(示例代码)
- win10安装账户卡住_win10安装卡着不动怎么处理 解决win10安装卡死方法
- 【原创】编程题练习:头插法尾插法建立单链表及找寻单链表中的倒数第K个节点...
- 2016 1月1日-1月1日python 学习总结
- JAVA实现文本翻译功能_java实现简单的英文文本单词翻译器功能示例
- 汇川小型PLC-MODBUS(485)通讯模式
- 极智开发 | Go 安装教程
- 基于CNN的图像分类综述(包含小样本图像/零样本图像、细粒度图像分类)
- Linux 快速搭建免费邮件服务器
- 求大神解答!!!!在线死等!
- react获取当前路由
- IE8上面的旋转和透明度,利用滤镜属性去处理(兼容css3的transform和rgba())
- TCP快速连接(tfo,TCP fastopen)
- Using sensor messages with tf(Using Stamped datatypes with tf::MessageFilter)