修改

上一节已经成功地添加并提交了一个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 id1094adb...,于是就可以指定回到未来的某个版本:

$ 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学习 | 笔记二:修改以及版本回退相关推荐

  1. 廖雪峰Git学习笔记2-时光机穿梭

    基本都是按照廖雪峰老师的重新敲打了一遍,增强记忆,中间穿插了一些自己的理解,新手可能有误,请看原版: https://www.liaoxuefeng.com/wiki/896043488029600/ ...

  2. 廖雪峰Git学习笔记(上)

    据廖老师git教程有所改动 一.git及相关概念 Git及版本控制系统 Git:用C语言开发的分布式版本控制系统 DVCS (Distributed Version Control System) 1 ...

  3. 廖雪峰Git学习笔记1-Git简介

    Git的诞生 Linus用C语言写的一个分布式版本控制系统.2008年,Github网站上线,为开源项目免费提供Git存储. 集中式VS分布式 分布式版本控制系统没有"中央服务器" ...

  4. Git学习笔记:修改

    前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...

  5. Git学习笔记(二)

    本文主要讲解分支管理 Git学习笔记(一) 目录 一.概念 二.创建与合并分支 2.1 简介 2.2 配图示例 2.3 命令小结 三.解决冲突 四.分支管理策略 五.Bug分支 5.1 stash功能 ...

  6. 廖雪峰git学习资料-涂改笔记

    注意: 本文章是看廖雪峰官网资料整理而来原地址如下: http://www.liaoxuefeng.com/ 附件为git常用命令 前言: 注意的问题 如果是首次提交会第一步:先在本地建立一个一样的仓 ...

  7. 廖雪峰Git教程笔记与总结 -- Git简介、常用命令、分支管理

    本文主要用于记录阅读Git教程 - 廖雪峰的官方网站后的一些心得笔记,并且对git一些常用命令做一个整理总结. 本文要点分为:1.Git简介:2.Git常用命令:3.Git分支管理. 一.Git简介 ...

  8. 廖雪峰git读书笔记--添加远程库

    最近又看了看廖雪峰的git教程,在看"添加远程库"这一节时遇到问题,谨记之. 添加远程库超时 在看"添加远程库"这一节时遇到问题, 我先输入 $ git rem ...

  9. [Git高级教程(二)] 远程仓库版本回退方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 ...

  10. qt撤销与回退_Git版本控制教程 - Git查阅、撤销修改和版本回退

    查看文件的修改历史 git log --pretty=oneline 文件名 # 显示修改历史 git show 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e # ...

最新文章

  1. elastic search java_elasticsearch学习四、JAVA调用
  2. Linux Shell常用技巧(十)
  3. 指派问题(匈牙利算法)
  4. Teams App如何选择用户
  5. 阅读源码学设计模式-单例模式
  6. apollo持久化sentinel_Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则
  7. js视频html代码,html+JS刷图实现视频效果(示例代码)
  8. win10安装账户卡住_win10安装卡着不动怎么处理 解决win10安装卡死方法
  9. 【原创】编程题练习:头插法尾插法建立单链表及找寻单链表中的倒数第K个节点...
  10. 2016 1月1日-1月1日python 学习总结
  11. JAVA实现文本翻译功能_java实现简单的英文文本单词翻译器功能示例
  12. 汇川小型PLC-MODBUS(485)通讯模式
  13. 极智开发 | Go 安装教程
  14. 基于CNN的图像分类综述(包含小样本图像/零样本图像、细粒度图像分类)
  15. Linux 快速搭建免费邮件服务器
  16. 求大神解答!!!!在线死等!
  17. react获取当前路由
  18. IE8上面的旋转和透明度,利用滤镜属性去处理(兼容css3的transform和rgba())
  19. TCP快速连接(tfo,TCP fastopen)
  20. Using sensor messages with tf(Using Stamped datatypes with tf::MessageFilter)

热门文章

  1. 《游戏设计艺术(第二版)》第十二章个人学习
  2. SVN下载、安装、配置及使用方法
  3. ie9服务器win2008系统离线安装包,IE9离线安装包完整版
  4. Sublime Text 3 全程详细图文使用教程
  5. 东南大学2014计算机考研真题,2014年东南大学920信号数电考研真题(回忆版)
  6. 睡眠小镇V4.6养成RPG的闹钟下载
  7. npp夜光数据介绍 viirs_NPP-VIIRS年度夜间灯光数据的合成方法与验证
  8. 三维人体姿态估计年度进展综述(周晓巍教授)
  9. Axure 安装图标字体元件库
  10. bypassuac提权