首页 > 其他分享 >Learn Git in 30 days——第 21 天:修正 commit 过的版本历史记录 Part 3

Learn Git in 30 days——第 21 天:修正 commit 过的版本历史记录 Part 3

时间:2023-09-20 20:00:32浏览次数:43  
标签:git 21 cherry 30 Part 版本 pick commit txt

写的非常好的一个Git系列文章,强烈推荐

原文链接:https://github.com/doggy8088/Learn-Git-in-30-days/tree/master/zh-cn

在版本控制过程中,还有个常见的状況,那就是当你在一个分支中开发了一段时间,但后来决定整个分支都不要了,不过当中却有几个版本还想留下,这时要删除分支也不是,把这个分支合并回来也不是,那该怎么办呢?本篇文章将说明你该如何利用 git cherry-pick 指令「手动挑出」你想套用的变更。

准备本日练习用的版本库

在开始说明前,我们一样先用以下指令建立一个练习用的工作目录与本地仓库。文章看到这里,想必各位看到指令应该都知道在做什么事了吧。我们在一开始建立 2 个版本后,就建立了一个 branch1 分支,然后在分支里建立了三个版本,其中一个版本为新增一个 b.txt 文件。最后我们再切换回 master 分支,并新增一个变更:

mkdir git-cherry-pick-demo
cd git-cherry-pick-demo
git init

echo 1 > a.txt
git add .
git commit -m "Initial commit (a.txt created)"

echo 2 > a.txt
git add .
git commit -m "Update a.txt to 2!"

git checkout -b branch1

echo 3 > a.txt
git add .
git commit -m "Update a.txt to 3!"

echo b > b.txt
git add .
git commit -m "Add b.txt!"

echo 4 > a.txt
git add .
git commit -m "Update a.txt to 4!"

git checkout master

echo 3 > a.txt
git add .
git commit -m "Update a.txt to 3!"
 

image

如果我们用 SourceTree 查看仓库的 commit graph (版本线图) 的话,可以看到如下图蓝色的部分是我们 master 分支的变化,一共三个版本。红色是 branch1 的分支,如果仅以这个分支来看也有三个版本。

image

使用 git cherry-pick 命令的注意事项

首先,你的「工作目录」必须是干净,工作目录下的「索引」不能有任何准备要 commit 的文件 (staged files) 在里面,否则将会无法执行。

使用 git cherry-pick 命令

使用 git cherry-pick 跟使用 git revert 非常相似,也是让你「挑选」任意一个或多个版本,然后套用在目前分支的最新版上,但主要差异则在于「git revert 执行的是相反的合并,而 git cherry-pick 则是重新套用完全相同的变更」,但一样都是通过「合并」的方式进行,所以本篇文章我不会做太多类似的相关练习,而是专注在讲解两种指令上的差异。

注:cherry-pick 的英文是「捡樱桃」的意思,代表你可以从其他篮子(分支)「挑」一些好的櫻桃到自己的篮子(分支)里!

各位在使用 git cherry-pick 命令时,最好搭配 SourceTree 等 GUI 工具,查看你想要「挑选」出来的版本,然后套用在目前的分支上 (当然是套用在目前的 HEAD 版本之后)。

目前我们位于 master 分支上,若要查询 branch1 的所有记录,我们执行 git log branch1 即可 (如下图加上 -4 代表仅显示前 4 笔记录):

image

今天我想套用 branch1 的 dc07017 Add b.txt! 这个版本到目前的 master 版本上,可以执行 git cherry-pick dc07017 命令,若成功执行,则会在目前的 master 分支建立一个新版本。

image

不过,与 git revert 最大的不同之处,就在于执行完 git cherry-pick 命令后,其建立的版本消息,将会与你指定挑选的那些版本一模一样,其中包括 Author 与 Date 栏位,都会一模一样,并不会用你在选项设定中指定的 user.name 与 user.email 参数。这点你必须特别注意!

使用 git cherry-pick 命令的其他参数

你可以选择加上 -x 参数在指令列上,就会像 git revert 那样,自动加上 (cherry picked from commit dc070173c8d087b4e65084653e31b81910f3f2e5) 的消息,如下图示:

image

不过,做这个动作之前也请先思考,你这次挑选的版本是不是只有「本地才有的分支」上挑选的,如果是的话,这样的记录可能会造成其他人的混淆,因为他们查不到该版本的任何信息。这在使用远端仓库的情境比较会碰到。

如果希望在建立版本前先编辑消息,那么你可以输入 git cherry-pick dc07017 -e 指令。

如果你不想建立版本,仅套用其变更,那么你可以执行 git cherry-pick dc07017 -n 指令,这样就不会自动建立版本,你可以在加上自己的修改后,执行 git commit 建立版本。通过 -n 参数,这次建立的版本就会留下自己的 Author & Date 信息!

今日小结

今天大家学到如何「捡樱桃」的技巧,不过我没办法教你「怎样挑出好的櫻桃」,这就要问你自己才知道了! :-)

我重新整理一下本日学到的 Git 指令与参数:

  • git cherry-pick [commit_id]
  • git cherry-pick [commit_id] -e
  • git cherry-pick [commit_id] -x
  • git cherry-pick [commit_id] -n

标签:git,21,cherry,30,Part,版本,pick,commit,txt
From: https://www.cnblogs.com/songzhenhua/p/17718248.html

相关文章

  • 【230920-6】勾画指数函数:y=2^x
    【图像】【代码】<!DOCTYPEhtml><htmllang="utf-8"><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><head><title>19.函数y=log_2_X图示</title><styletype="text/c......
  • 【230920-6】勾画对数函数y=log10_x
    【图像】【代码】<!DOCTYPEhtml><htmllang="utf-8"><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><head><title>19.函数y=log_2_X图示</title><styletype="text/c......
  • 230920 创记录的亏损 泉阳泉
    今天-2.5,出了泉阳泉,亏损12%左右.模式外的交易,以及凭借主观感觉做交易,导致出现了如此大的亏损.1.模式外你磨刀霍霍,准备低吸,但是,从常山到一众,你选择了看起来跌的很快的泉阳泉.一个主要的观点,就是你前几天认为,它股性好,可能是大跌洗盘,你认为它会复制另外一个个股的走......
  • 【3rd_Party】format() 处理一些常见的格式化解决方案
    C++20引入了新的format()函数,该函数以字符串形式返回参数的格式化表示。format()使用python风格的格式化字符串,具有简洁的语法、类型安全,以及出色的性能。format()函数接受一个格式字符串和一个模板形参包作为参数:template<class...Args>stringformat(conststring......
  • 揭秘ES2021令人兴奋的语言特性
    大家好!我是星辰编程理财。今天我分享一篇关于ES2021(ES12)的文章,它将介绍ES2021的语言特性和功能,包括WeakRefs、Logicalassignmentoperators、Privatemethodsandaccessors(classfields)、Promise.allSettled()等等。通过故事形式以及详细的阐述和示例,带领大家一起探索这些特性......
  • 揭秘ES2021令人兴奋的语言特性
    大家好!我是星辰编程理财。今天我分享一篇关于ES2021(ES12)的文章,它将介绍ES2021的语言特性和功能,包括WeakRefs、Logicalassignmentoperators、Privatemethodsandaccessors(classfields)、Promise.allSettled()等等。通过故事形式以及详细的阐述和示例,带领大家一起探索这些特......
  • 即时通讯技术文集(第21期):后端架构设计基础入门系列 [共15篇]
    为了更好地分类阅读52im.net总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第21 期。[- 1 -] 新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践[链接] http://www.52im.net/thread-2007-1-1.html[摘要] 本文我们就来聊聊分布式架构的......
  • JAVA17/JAVA21接口和多态机制
    day08-JAVAOOP课程目标1.【理解】什么是接口2.【掌握】接口的定义格式3.【掌握】接口的使用4.【理解】接口的成员特点5.【理解】类和接口抽象类和接口之间的关系6.【掌握】单继承多实现7.【理解】接口之间的多继承8.【掌握】接口的案例9.【理解】什么是多态......
  • 21 绝对定位,固定定位
    position:relativeposition:absolute;posion:fixed;<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>body{height:1000px;......
  • [代码随想录]Day49-动态规划part17
    题目:647.回文子串思路:整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false。当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况情况一:下标i与j相同,同一个字符例如a,当然是回文子串情况二:下标i与j相差为1,例如aa......