Git - 版本管理

王柳  金牌会员 | 2024-9-26 21:58:28 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 821|帖子 821|积分 2463

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

git log:查看提交日记

随着对文件的不绝修改与提交,Git 帮我们管理了之前的各个版本。就好比玩一个能存档的游戏,每过一关就能帮我们存档,假如某一关没打过,就可以从上一个存档开始(而不用从头开始)。
Git 也可以帮助我们回退到上一个版本,甚至更早之前的版本。这在我们搞错了代码,需要回退的时候非常有用。
我们先看看我们目前有几个版本的文件:
版本 1:wrote a readme file
  1. Git is a version control system
  2. Git is free software.
复制代码


版本 2:add distributed word
  1. Git is a distributed version control system
  2. Git is free software.
复制代码


版本 3:append GPL word
  1. Git is a distributed version control system
  2. Git is free software distributed under the GPL.
复制代码

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

我们可以通过 git log​ 命令查看我们提交的记载:
  1. commit efc913812101fe78072d04fcaa1fbdbdf6e5819b (HEAD -> master)
  2. Author: peterjxl <peterjxl@qq.com>
  3. Date:   Thu Jan 12 07:59:55 2023 +0800
  4.     append GPL word
  5. commit 750360e56f221a24062869439d7884660670305f
  6. Author: peterjxl <peterjxl@qq.com>
  7. Date:   Thu Jan 12 07:49:37 2023 +0800
  8.     add distributed word
  9. commit 0282c44552525822a4e6ffd705dd35da243e1c7a
  10. Author: peterjxl <peterjxl@qq.com>
  11. Date:   Thu Jan 12 07:32:04 2023 +0800
  12.     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 ​参数,就会简化为一行:
  1. $ git log --pretty=oneline
  2. efc913812101fe78072d04fcaa1fbdbdf6e5819b (HEAD -> master) append GPL word
  3. 750360e56f221a24062869439d7884660670305f add distributed word
  4. 0282c44552525822a4e6ffd705dd35da243e1c7a wrote a readme file
  5. 0b3cfefd49148371adf4fa6da02192685ff03788 add world.txt and diff.txt
  6. abf2051bd989d0b129066bff3700a019665469ce add diff and patch hello.txt
复制代码

直接使用 git log --oneline​,这样 commit id 更短:
  1. $ git log --oneline
  2. efc9138 append GPL word
  3. 750360e add distributed word
  4. 0282c44 wrote a readme file
  5. 0b3cfef add world.txt and diff.txt
  6. abf2051 add diff and patch hello.txt
复制代码



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

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

还可以指定多少条 commit:
  1. $ git log -2
复制代码
数字 2 表示只表现最近两条,可自行修改数字

git reset:回退版本

现在我们想要回退到上一版本,怎么办呢?起首,Git 用 HEAD 表示当前版本,用一个 ^ ​表示上一个版本,也就是 HEAD^ ​表示上一个版本。上两个版本就是 HEAD^^​,假如要回退的版本比力多,可以用数字,例如 HEAD^114 ​表示前 114 个版本。
我们可以使用 git reset 命令来回退版本:
  1. > git reset --hard HEAD^
  2. HEAD is now at 750360e add distributed word
复制代码
--hard​ 参数后面会讲是什么意思。Git 告诉我们当前版本是指向了 750360e add distributed word​

然后我们看看文件内容:
  1. > cat readme.txt
  2. Git is a distributed version control system
  3. Git is free software
复制代码


可以看到文件确实被还原到上一个版本了,少了 GPL。此时假如我们用 git log 查看提交日记:
  1. > git log
  2. commit 750360e56f221a24062869439d7884660670305f (HEAD -> master)
  3. Author: peterjxl <peterjxl@qq.com>
  4. Date:   Thu Jan 12 07:49:37 2023 +0800
  5.     add distributed word
  6. commit 0282c44552525822a4e6ffd705dd35da243e1c7a
  7. Author: peterjxl <peterjxl@qq.com>
  8. Date:   Thu Jan 12 07:32:04 2023 +0800
  9.     wrote a readme file
复制代码
append GPL word ​的谁人版本不见了!那是不是完全丢失了呢?办法照旧有的,还记得我们前面查看过的 git log ​吗:
  1. $ git log --pretty=oneline
  2. efc913812101fe78072d04fcaa1fbdbdf6e5819b (HEAD -> master) append GPL word
  3. 750360e56f221a24062869439d7884660670305f add distributed word
  4. 0282c44552525822a4e6ffd705dd35da243e1c7a wrote a readme file
  5. 0b3cfefd49148371adf4fa6da02192685ff03788 add world.txt and diff.txt
  6. abf2051bd989d0b129066bff3700a019665469ce add diff and patch hello.txt
复制代码


通过 append GPL word ​这个版本的 commit id,我们就可以回到这个版本:
  1. > git reset --hard efc9
  2. HEAD is now at efc9138 append GPL word
复制代码
  commit id 不一定要写全,写几个就行;但是假如你只写一两位,那么大概会找到多个 commit id,Git 就不知道你是指定什么版本了。
  ‍
我们再看看文件内容:
  1. > cat readme.txtGit is a distributed version control system
  2. Git is free software distributed under the GPL.
复制代码
文件又回来了!舒了一口气。


head 与时间线

前面我们说过,每提交一个新版本,Git 就会把它们自动串成一条时间线,有点像数据结构中的链表:
wrote a readme file​ -> add distributed word​ -> append GPL word​
或者画成下面这样:
  1.         ○ append GPL word
  2.         │
  3.         ○ add distributed word
  4.         │
  5.         ○ wrote a readme file
复制代码

而 head,就相当于一个指针,指向当前的版本:
  1. ┌────┐
  2. │HEAD│
  3. └────┘
  4.    │
  5.    └──▶ ○ append GPL word
  6.          │
  7.          ○ add distributed word
  8.          │
  9.          ○ wrote a readme file
复制代码


我们之前说的回退版本,其实就是移动下指针,然后把工作区的文件更新到该版本:
  1. ┌────┐
  2. │HEAD│
  3. └────┘
  4.    │
  5.    │     ○ append GPL word
  6.    │     │
  7.    └──▶ ○ add distributed word
  8.          │
  9.          ○ wrote a readme file
复制代码

git reflog:记载输入的命令

假如你回退版本后,不幸关掉了命令行窗口,忘记了某个版本的 commit id,要怎么办呢?
可以用 git reflog 命令,可以查看对版本的利用记载,包罗被利用版本的版本号。
简朴的说,该命令记载了你输入的每一次命令(并且会贴心的告诉你 commit id):
  1. > git reflog
  2. efc9138 (HEAD -> master) HEAD@{0}: reset: moving to efc9
  3. 750360e HEAD@{1}: reset: moving to HEAD^
  4. efc9138 (HEAD -> master) HEAD@{2}: commit: append GPL word
  5. 750360e HEAD@{3}: commit: add distributed word
  6. 0282c44 HEAD@{4}: commit: wrote a readme file
  7. 0b3cfef HEAD@{5}: commit: add world.txt and diff.txt
  8. 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 版本就相当于丢失了(好比一个没有地址指向的链表结点)
  1. ┌────┐
  2. │HEAD│
  3. └────┘
  4.    │
  5.    │     ○ append GPL word
  6.    │     │
  7.    └──▶ ○ add distributed word
  8.          │
  9.          ○ 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,这样两个版本都会保留;

相关用法:
  1. $ git revert HEAD                撤销前一次 commit
  2. $ git revert HEAD^               撤销前前一次 commit  
  3. $ git revert commit_id
复制代码

关于 commit 的 msg

git commit 是很小的一件事情,但是每每小的事情每每引不起各人的关注,假如你查看 commit log,都只有简朴的几个词的描述的话,是完全不知道这些 commit 是要做啥的,保举阅读:Git 最佳实践:commit msg。
纵然我们有了 Commit Message 规范,但仍旧大概会碰到提交的 Commit Message 不符合规范的环境,这个时候就需要我们可以或许修改之前某次 commit 的 Commit Message。
详细来说,我们有两种修改方法,分别对应两种差别环境:

  • git commit --amend​:修改最近一次 commit 的 message;
  • git rebase -i​:修改某次 commit 的 message。



小结

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


  • git log​ 查看提交日记 --pretty=oneline​ 简化为一行,-n ​指定表现多少个
  • git reflog: 记载输入的日记
  • git reset --hard HEAD^​​ 回退版本
  • git revert​​:回退版本的另一种方式

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表