首页 > 其他分享 >Git - 版本管理

Git - 版本管理

时间:2024-09-25 15:02:29浏览次数:7  
标签:HEAD git word 管理 add Git 版本 commit

本文我们来介绍下 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 <[email protected]>
Date:   Thu Jan 12 07:59:55 2023 +0800

    append GPL word

commit 750360e56f221a24062869439d7884660670305f
Author: peterjxl <[email protected]>
Date:   Thu Jan 12 07:49:37 2023 +0800

    add distributed word

commit 0282c44552525822a4e6ffd705dd35da243e1c7a
Author: peterjxl <[email protected]>
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 <[email protected]>
Date:   Thu Jan 12 07:49:37 2023 +0800

    add distributed word

commit 0282c44552525822a4e6ffd705dd35da243e1c7a
Author: peterjxl <[email protected]>
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​​:回退版本的另一种方式

标签:HEAD,git,word,管理,add,Git,版本,commit
From: https://www.cnblogs.com/PeterJXL/p/18431395

相关文章

  • 记一次pycharm在使用git提交时需要输入ssh key的密码的问题
    问题描述:从gitlab上拉取了一份代码,长时间为动过,偶然一次提交时发现居然需要输入密码,我试了登录密码和常用密码都报错,无法提交代码 解决方案:1.选择菜单栏的git--管理远程 2.更新远程URL将url更新为git仓库右上角clone里面的http的地址,然后确认即可  3.继续你的......
  • 被误删除的 GitLab 群组和项目该如何恢复?
    本文分享如何使用极狐GitLab的项目延迟删除功能来避免仓库被用户误操作。该功能设置了删除延时时间,在延时期间内,用户还可以对项目进行恢复。极狐GitLab为GitLab的中文发行版,中文版本对中国用户更友好。可以一键私有化部署,也可以直接使用SaaS。详细安装指南可以查看官网https:......
  • 关于QT6.5.3版本安装、更新/添加组件的一些心得
    目录引言一、如何下载和卸载QT1.下载QT2.卸载QT二、镜像引言本文主要记录一下关于VisualStudio2022和QtCreator14.0.1(Community)的安装......
  • 超详细 Git 教程:二十篇博客,三万字干货
    Git是最流行的版本管理工具,可以说是任何程序员都应该掌握的工具。当然,其他人也可以学习它用来进行版本控制为此,我将之前学习Git时的笔记整理了下(预计有二十篇),作为博客发出来,希望能帮到你。本文简单介绍下什么是版本控制,以及常见的版本控制工具在学习之前,希望读者有一点......
  • Git使用教程一
    Git是一个分布式版本控制系统,简单的说其就是一个软件,用于记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的软件。Github(https://www.github.com)是-一个为用户提供Git服务的网站,简单说就是一一个可以放代码的地方(不过可以放的当然不仅是代码)。Github除了提供管理G......
  • Git工具的使用教程二
    1.3时光穿梭机——版本回退版本回退分为两步骤进行操作:步骤:1.查看版本,确定需要回到的时候点  指令:        gitlog        gitlog--pretty=oneline2.回退操作  指令:......
  • Git使用教程五
    基于ssh协议(推荐)该方式与前面https方式相比,只是影响github对于用户的身份鉴权方式,对于git的具体操作(如提交本地、添加注释、提交远程等操作)没有任何影响。生成公私钥对指令(需先自行安装OpenSSH):ssh-keygen-trsa-C"注册邮箱"步骤:1.生......
  • Git使用教程四
    拉取线上仓库:gitpull提醒:在每天工作的第一件事就是先gitpull拉取线上最新·的版本:每天下班前要做的是gitpush,将本地代码提交到线上仓库。有兴趣可以关注一下微信公众号......
  • Git使用教程三
    2.远程仓库线上仓库的操作学习以Github为例2.1完成线上仓库创建注意:仓库要求在当前账号下唯一2.2两种常规使用方式2.2.1基于http协议a.创建空目录,名称就称为shopb.使用clone指令克隆线上仓库到本地......
  • Git使用教程六
    冲突的产生与解决案例:模拟产生冲突。①同事在下班之后修改了线上仓库的代码注意:此时我本地仓库的内容与线上不一致的。2.第二天上班的时候,我没有做gitpull操作,而是直接修改了本地的对应文件的内容需要在下班的时候将代码......