Git - 版本管理

news2024/9/27 12:12:54

本文我们来介绍下 Git 管理版本的几个常用命令。

git log:查看提交日志

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

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

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

版本 1:wrote a readme file

Git is a version control system
Git is free software.

版本 2:add distributed word

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

版本 3:append GPL word

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

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

我们可以通过 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

我们来简单解读下输出

  • 第一行是 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

直接使用 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

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

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

还可以指定多少条 commit:

$ git log -2

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

git reset:回退版本

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

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

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

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

然后我们看看文件内容:

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

可以看到文件确实被还原到上一个版本了,少了 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

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

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

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

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

我们再看看文件内容:

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

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

head 与时间线

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

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

或者画成下面这样:

        ○ append GPL word
        │
        ○ add distributed word
        │
        ○ wrote a readme file

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

┌────┐
│HEAD│
└────┘
   │
   └──▶ ○ append GPL word
         │
         ○ add distributed word
         │
         ○ wrote a readme file

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

┌────┐
│HEAD│
└────┘
   │
   │     ○ append GPL word
   │     │
   └──▶ ○ add distributed word
         │
         ○ wrote a readme file

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

从这里我们可以看到,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

并且,其他人是难以找到这个版本的。另外一种回退到指定版本的方式是使用 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

关于 commit 的 msg

git commit 是很小的一件事情,但是往往小的事情往往引不起大家的关注,如果你查看 commit log,都只有简单的几个词的描述的话,是完全不知道这些 commit 是要做啥的,推荐阅读:Git 最佳实践: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​​:回退版本的另一种方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

告别繁琐!用 Light To Freedomen一键打造你的专属后台管理系统

作为开发者&#xff0c;特别是后端开发人员&#xff0c;前端开发工作往往是一项让人头疼的挑战。复杂的UI设计&#xff0c;数据展示和交互逻辑&#xff0c;不仅费时费力&#xff0c;还容易出现各种问题。然而&#xff0c;后台管理系统作为企业应用的核心模块&#xff0c;又是无…

uboot以tag结构体的方式给内核传参,cmdline,bootargs,以及uboot如何启动内核

uboot以tag结构体的方式给内核传参&#xff0c;cmdline&#xff0c;bootargs&#xff0c;以及uboot如何启动内核 一、u-boot启动流程 1、第一阶段 cpu/s3c24xx/start.S 主要是一些依赖于 CPU 体系结构的代码,比如硬件设备初始化代码 等。这一阶段的代码主要是通过汇编来实现…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveRelative

机器自动化控制器——第三章 轴指令 5 MC_MoveRelative变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 MC_MoveRelative 指定自指令当前位置起的移动距离&#xff0c;进行定位。 指令名称FB/FUN图形表现ST表现MC…

如何查看线程

1、首先找到我们的电脑安装jdk的位置&#xff0c;这里给大家展示一下博主本人的电脑jdk路径下的jconsole位置。 2、 ok&#xff0c;那么找到这个jconsole程序我们直接双击打开就可以查看我们电脑的本地进程&#xff1a; jconsole 这里能够罗列出你系统上的 java 进程&#xff0…

学习threejs,绘制二维线

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制二维线1. ☘️…

软件测试岗位的经典面试题

在我近十年的测试职业生涯中&#xff0c;我也面试过不少软件测试岗位的候选人&#xff0c;这几个问题我也经常问到。但很多同学在这几个高频面试题上&#xff0c;其实并不太了解面试官提问背后的逻辑和目的。 这篇文章&#xff0c;聊聊这几道经典面试题考查的目的&#xff0c;…

花朵识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

一、介绍 花朵识别系统。本系统采用Python作为主要编程语言&#xff0c;基于TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;并基于前期收集到的5种常见的花朵数据集&#xff08;向日葵、玫瑰、蒲公英、郁金香、菊花&#xff09;进行处理后进行模型训练&#xff0c;最…

生成式AI赋能:对话式BI引领数据分析新潮流

引言&#xff1a;数据交互的革新之旅 在信息爆炸的今天&#xff0c;我们与数据交互的方式正经历着前所未有的变革。静态的仪表盘&#xff0c;尽管曾以视觉上的革新引领一时风尚&#xff0c;但如今已难以满足用户对动态、深度数据洞察的迫切需求。用户不再满足于仅仅观赏精美的…

如何恢复被删除的 GitLab 项目?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

攻防世界--->backup

学习笔记。 备份文件&#xff1f; 没听过&#xff0c;&#xff0c;&#xff0c;搜呗。 我看的这个&#xff1a; CTF——Web网站备份源码泄露_web常见备份文件有哪些-CSDN博客https://blog.csdn.net/weixin_51735061/article/details/124238304 进入靶场。 嗯&#xff1f; -…

实操学习——文章和评论的设计

实操学习——文章和评论的设计 1.文章表的设计2.文章表接口演示基础权限创建文章修改文章删除文章浏览所有文章 3.评论表的设计4.评论表接口演示1. 查询指定文章下的所有评论 1.文章表的设计 创建一个community的app 在settings中 完成注册 定义模型 创建文章表 from django.…

2024 Redis 全部

1. 单机部署 1.1 检查环境&#xff0c;创建目录。 # 本地运行&#xff0c;不需要考虑安装的原因&#xff0c;可以卸载防火墙 # 关闭防火墙 systemctl stop firewalld.service# 查看防火强状态 firewall-cmd --state# redis 是基于gcc 环境的&#xff0c;查看是否有 gcc 环境 …

线程基础、状态及常用方法

多线程基础 进程和线程 什么是程序&#xff1f; 程序是包含有计算机指令和数据的文件。 什么是进程&#xff1f; 进程是程序的一次执行过程&#xff0c;是计算机分配资源的最小单位。 什么是线程&#xff1f; 一个进程中会包含若干个线程&#xff0c;每个线程都是一个独立的…

OpenCV图像文件读写(2) 检查 OpenCV 是否支持某种图像格式的写入功能函数haveImageWriter()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 haveImageWriter 函数用于检查 OpenCV 是否支持某种图像格式的写入功能。这个函数可以帮助开发者在编写代码时确定是否可以成功地将图像写入特定…

【Linux】Linux基本命令

目录 文件和目录操作&#xff1a; ls cd pwd cp mv rm mkdir rmdir touch clear history which/whereis 文件查看和编辑&#xff1a; cat less head tail vi 或 vim sz/rz echo 系统信息和管理&#xff1a; su uname hostname df free top ps ki…

fopen与fwrite在C语言中写文件及open、write的对比

fopen与fwrite在C语言中写文件及open、write的对比 一、fopen与fwrite写文件1. fopen函数介绍2. fwrite函数介绍3. 示例代码4. 注意事项二、open与write写文件1. open函数介绍2. write函数介绍3. 示例代码4. 注意事项三、fopen/fwrite与open/write的对比1. 跨平台性2. 功能与灵…

android和ios双端应用性能的测试工具

1.工具介绍 基于日常工作的需要&#xff0c;开发了一款新的android和ios端应用性能测试工具&#xff0c;本工具在数据测试方面与所流行的工具没有区别。欢迎下载使用体验。 本工具为筋斗云&#xff0c;工具说明 本工具无侵入&#xff0c;不需要root&#xff0c;低延迟…

统一建模语言(UML)在软件研发过程中常用图接受:类图、用例图、时序图、状态图、活动图、流程图、顺序图

UML具有许多不同类型的图表&#xff0c;包括&#xff1a; 静态图&#xff1a;用例图、类图、对象图、组件图、部署图动态图&#xff1a;活动图、状态图、时序图&#xff08;又叫顺序图、序列图&#xff09;、协作图 软件工程&#xff08;软件工程中的各种图一般用于以下三个阶段…

线上报名小程序怎么做

在这个数字化、智能化的时代&#xff0c;信息技术的发展正以前所未有的速度改变着我们的生活。无论是学习、工作还是娱乐&#xff0c;互联网都成为了我们不可或缺的一部分。而在线上报名这一领域&#xff0c;小程序的出现更是为广大用户带来了前所未有的便捷与高效。今天&#…

# 高可用的并发解决方案nginx+keepalived(四)

高可用的并发解决方案nginxkeepalived&#xff08;四&#xff09; 一、Keepalived安装 1、keepalived 介绍 Keepalived 是一种高性能的服务器高可用或热备解决方案&#xff0c;Keepalived 可以用来防止服务器单点故障的发生&#xff0c;通过配合 Nginx 可以实现 web 前端服务…