从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • 计算机历史

  • 数字电路

  • 计算机组成原理

  • 汇编语言

  • C语言

  • 数据结构

  • 操作系统

  • Linux

  • 计算机网络

  • Git

    • 版本控制
    • 安装和配置
    • 初识版本库
    • 版本管理
      • git log:查看提交日志
      • git reset:回退版本
      • head与时间线
      • git reflog:记录输入的命令
      • git revert
      • 修改commit的msg
      • 小结
    • 工作区、暂存区和修改
    • 远程仓库
    • 分支管理
    • GitStash
    • 远程仓库和分支
    • 标签管理
    • 自定义Git
    • 使用可视化工具
    • GithubAction
    • 常用Git命令
    • Git系列小结
    • Git
  • 数据库

  • 计算机小知识

  • 编译原理

  • 名人堂

  • 计算机基础
  • Git
2023-01-17
目录

版本管理

# 03.版本管理

本文我们来介绍下Git管理版本的几个常用命令。请读者务必也动手实践!

# git log:查看提交日志

随着对文件的不断修改与提交,Git帮我们管理了之前的各个版本。就好比玩一个能存档的游戏,每过一关就能帮我们存档,如果某一关没打过,就可以从上一个存档开始(而不用从头开始)。

Git也可以帮助我们回退到上一个版本,甚至更早之前的版本。这在我们搞错了代码,需要回退的时候非常有用。

我们先看看我们目前有几个版本的文件:

版本1:wrote a readme file

Git is a version control system
Git is free software.
1
2

版本2:add distributed word

Git is a distributed version control system
Git is free software.
1
2

版本3:append GPL word

Git is a distributed version control system
Git is free software distributed under the GPL.
1
2

‍

目前版本比较少,我们还能清晰的记得;但如果改动了数十次,或者过去了数十天,肯定是不记得有多少版本的(这也是我们为什么需要版本控制工具)。

我们可以通过git log 命令查看我们提交的记录:

commit efc913812101fe78072d04fcaa1fbdbdf6e5819b (HEAD -> master)
Author: peterjxl <peterjxl@qq.com>
Date:   Thu Jan 12 07:59:55 2023 +0800

    append GPL word

commit 750360e56f221a24062869439d7884660670305f
Author: peterjxl <peterjxl@qq.com>
Date:   Thu Jan 12 07:49:37 2023 +0800

    add distributed word

commit 0282c44552525822a4e6ffd705dd35da243e1c7a
Author: peterjxl <peterjxl@qq.com>
Date:   Thu Jan 12 07:32:04 2023 +0800

    wrote a readme file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

我们来简单解读下输出

  • 第一行是commit的ID,每次commit都会有一个唯一的ID,叫做commit id。这是一个通过算法计算出来的值,并且每个人不一样(读者自己实践的结果肯定和我的结果不一致,后续不再说明)
  • 第二行是提交者,即姓名和邮箱
  • 第三行是提交的时间
  • 接下来是提交的说明,就是我们之前git commit -m​ 后面跟的参数

当我们输入git log的时候,相当于用vim打开了一个日志文件,要退出请输入 q​后回车

‍

‍

​git log​命令显示从最近到最远的提交日志,我们可以看最近的3次提交,最近的一次是append GPL word​,上一次是add distributed word​,再上一次是wrote a readme file​。

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline​参数,就会简化为一行:

$ git log --pretty=oneline
efc913812101fe78072d04fcaa1fbdbdf6e5819b (HEAD -> master) append GPL word
750360e56f221a24062869439d7884660670305f add distributed word
0282c44552525822a4e6ffd705dd35da243e1c7a wrote a readme file
0b3cfefd49148371adf4fa6da02192685ff03788 add world.txt and diff.txt
abf2051bd989d0b129066bff3700a019665469ce add diff and patch hello.txt
1
2
3
4
5
6

‍

直接使用git log --oneline​,这样commit id 更短:

$ git log --oneline
efc9138 append GPL word
750360e add distributed word
0282c44 wrote a readme file
0b3cfef add world.txt and diff.txt
abf2051 add diff and patch hello.txt
1
2
3
4
5
6

‍

‍

‍

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线。以GitExtensions为例:

​​

(这里仅仅是演示,后续我们讲怎么使用GitExtensions)

‍

还可以指定多少条commit:

$ git log -2
1

数字2表示只显示最近两条,可自行修改数字

‍

# git reset:回退版本

现在我们想要回退到上一版本,怎么办呢?首先,Git用HEAD表示当前版本,用一个^​表示上一个版本,也就是HEAD^​表示上一个版本。上两个版本就是 HEAD^^​,如果要回退的版本比较多,可以用数字,例如HEAD^114​表示前114个版本。

我们可以使用git reset命令来回退版本:

> git reset --hard HEAD^
HEAD is now at 750360e add distributed word
1
2

--hard 参数后面会讲是什么意思。Git告诉我们当前版本是指向了 750360e add distributed word​

‍

然后我们看看文件内容:

> cat readme.txt
Git is a distributed version control system
Git is free software
1
2
3

可以看到文件确实被还原到上一个版本了,少了GPL。此时如果我们用git log查看提交日志:

> git log
commit 750360e56f221a24062869439d7884660670305f (HEAD -> master)
Author: peterjxl <peterjxl@qq.com>
Date:   Thu Jan 12 07:49:37 2023 +0800

    add distributed word

commit 0282c44552525822a4e6ffd705dd35da243e1c7a
Author: peterjxl <peterjxl@qq.com>
Date:   Thu Jan 12 07:32:04 2023 +0800

    wrote a readme file
1
2
3
4
5
6
7
8
9
10
11
12

​append GPL word​的那个版本不见了!那是不是完全丢失了呢?办法还是有的,还记得我们前面查看过的git log​吗:

$ git log --pretty=oneline
efc913812101fe78072d04fcaa1fbdbdf6e5819b (HEAD -> master) append GPL word
750360e56f221a24062869439d7884660670305f add distributed word
0282c44552525822a4e6ffd705dd35da243e1c7a wrote a readme file
0b3cfefd49148371adf4fa6da02192685ff03788 add world.txt and diff.txt
abf2051bd989d0b129066bff3700a019665469ce add diff and patch hello.txt
1
2
3
4
5
6

通过append GPL word​这个版本的commit id,我们就可以回到这个版本:

> git reset --hard efc9
HEAD is now at efc9138 append GPL word
1
2

commit id 不一定要写全,写几个就行;但是如果你只写一两位,那么可能会找到多个commit id,Git就不知道你是指定什么版本了。

‍

我们再看看文件内容:

> cat readme.txt
Git is a distributed version control system
Git is free software distributed under the GPL.
1
2
3

文件又回来了!舒了一口气。

‍

‍

# head与时间线

前面我们说过,每提交一个新版本,Git就会把它们自动串成一条时间线,有点像数据结构中的链表:

​wrote a readme file​ ->​ add distributed word​ -> append GPL word​

或者画成下面这样:

        ○ append GPL word
        │
        ○ add distributed word
        │
        ○ wrote a readme file
1
2
3
4
5

‍

而head,就相当于一个指针,指向当前的版本:

┌────┐
│HEAD│
└────┘
   │
   └──▶ ○ append GPL word
         │
         ○ add distributed word
         │
         ○ wrote a readme file
1
2
3
4
5
6
7
8
9

‍

‍

我们之前说的回退版本,其实就是移动下指针,然后把工作区的文件更新到该版本:

┌────┐
│HEAD│
└────┘
   │
   │     ○ append GPL word
   │     │
   └──▶ ○ add distributed word
         │
         ○ wrote a readme file
1
2
3
4
5
6
7
8
9

‍

# git reflog:记录输入的命令

如果你回退版本后,不幸关掉了命令行窗口,忘记了某个版本的commit id,要怎么办呢?

可以用git reflog命令,可以查看对版本的操作记录,包括被操作版本的版本号。

简单的说,该命令记录了你输入的每一次命令(并且会贴心的告诉你commit id):

> git reflog
efc9138 (HEAD -> master) HEAD@{0}: reset: moving to efc9
750360e HEAD@{1}: reset: moving to HEAD^
efc9138 (HEAD -> master) HEAD@{2}: commit: append GPL word
750360e HEAD@{3}: commit: add distributed word
0282c44 HEAD@{4}: commit: wrote a readme file
0b3cfef HEAD@{5}: commit: add world.txt and diff.txt
abf2051 HEAD@{6}: commit (initial): add diff and patch hello.txt
1
2
3
4
5
6
7
8

从这里我们可以看到,append GPL word​这个版本的commit id​ 是efc9138​,这下彻底放心啦~✌

‍

‍

# git revert

刚刚我们介绍的git reset命令,其实就是移动了下head指针,移动之后,append GPL word 版本就相当于丢失了(好比一个没有地址指向的链表结点)

┌────┐
│HEAD│
└────┘
   │
   │     ○ append GPL word
   │     │
   └──▶ ○ add distributed word
         │
         ○ wrote a readme file
1
2
3
4
5
6
7
8
9

并且,其他人是难以找到这个版本的。另外一种回退到指定版本的方式是使用git revert​,其和git reset​ 的区别 如下(引自廖雪峰老师的解答):

如果已经有A -> B -> C,想回退到B:

方法一:reset到B,但会丢失C:A -> B

方法二:再提交一个revert反向修改,变成B: A -> B -> C -> B, 这样C还在,但是两个B是重复的

看自己想要什么效果,也许C就是瞎提交错了(比如把敏感信息提交上去了),必须reset,不能让别人找到;

如果C就是修改,现在又要改回来,将来可能再改成C,那可以用revert,这样两个版本都会保留;

‍

相关用法:

$ git revert HEAD                撤销前一次 commit
$ git revert HEAD^               撤销前前一次 commit  
$ git revert commit_id
1
2
3

‍

# 修改commit的msg

即使我们有了 Commit Message 规范,但仍然可能会遇到提交的 Commit Message 不符合规范的情况,这个时候就需要我们能够修改之前某次 commit 的 Commit Message。

具体来说,我们有两种修改方法,分别对应两种不同情况:

  1. git commit --amend:修改最近一次 commit 的 message;
  2. git rebase -i:修改某次 commit 的 message。

‍

# 小结

本文我们介绍了如下命令:

  • git log​ 查看提交日志 --pretty=oneline​ 简化为一行,-n​指定显示多少个
  • git reflog: 记录输入的日志
  • git reset --hard HEAD^​​ 回退版本
  • git revert​​:回退版本的另一种方式
在GitHub上编辑此页 (opens new window)
上次更新: 2023/5/5 10:37:49
初识版本库
工作区、暂存区和修改

← 初识版本库 工作区、暂存区和修改→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式