实战:怎样把间隔的几个commit整理成1个?-2021.11.18

实战:怎样把间隔的几个commit整理成1个?-2021.11.18

目录

文档来源

文章来源:课程:《玩转Git三剑客》-苏玲-极客时间-20210918购买-69元\18 怎样把间隔的几个commit整理成1个?

https://time.geekbang.org/course/detail/100021601-72798

image-20211118072344748

实验环境

win10
$ git version
git version 2.17.0.windows.1

实验软件(无)

1、问题需求:怎样把间隔的几个commit整理成1个?

上节课,我们已经通过git rebase -i命令把相同的commit已经合并完成了,可以看到原来有4个commit信息,但都是描述的是一个静态网站项目,合并为一个commit后,我们的历史commit就立马变的更简洁清晰了。

现在,有这么个情况,通过git log --grapg发现master分支任然有2处commit是类似的,都是关于readme文件的,此时,我想要把这2个不连续的commit给合并该如何做呢?

我们首先来查看下当前环境:

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository
$ cd git_learning/

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master)
$ git log --graph
* commit c2d593775d52e007c2f8667e5b3cbc6dc7461b82 (HEAD -> master)
| Author: xyy <xyy@189.cn>
| Date:   2021-10-07 16:24:04 +0800
|
|     Move  filename readme.md readme #本次想要合并的commit对象2
|
* commit 0ac2779c079f15468206a9a8a3e32444bedb6276
| Author: xyy <xyy@189.cn>
| Date:   2021-10-05 07:12:54 +0800
|
|     Create a complete web page!
|
|     Add index + git logo
|
|     Add style.css
|
|     Add js
|
|     Add a refering project !
|
* commit 6d72184e894e61aab57ea5adcb861076cadb8cee
  Author: xyy <xyy@189.cn>
  Date:   2021-10-04 08:13:30 +0800

      Add readme.md #本次想要合并的commit对象1

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master)

顺便记录下当前all分支的历史commit信息和图形化commit信息,以被后续观察:

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master)
$ git log --graph --all
* commit c2d593775d52e007c2f8667e5b3cbc6dc7461b82 (HEAD -> master)
| Author: xyy <xyy@189.cn>
| Date:   2021-10-07 16:24:04 +0800
|
|     Move  filename readme.md readme
|
* commit 0ac2779c079f15468206a9a8a3e32444bedb6276
| Author: xyy <xyy@189.cn>
| Date:   2021-10-05 07:12:54 +0800
|
|     Create a complete web page!
|
|     Add index + git logo
|
|     Add style.css
|
|     Add js
|
|     Add a refering project !
|
| * commit 30c150103c9c14b9ff33533a91950b0fa708c2ba (temp)
| | Author: xyy <xyy@189.cn>
| | Date:   2021-10-09 08:49:08 +0800
| |
| |     Add test
| |
| | * commit f99906da3e1494de3a7a48b8d75cbdd78363f425 (tag: js01)
| |/  Author: xyy <xyy@189.cn>
| |   Date:   2021-10-05 07:36:32 +0800
| |
| |       Add js
| |
| * commit c3d346c381b8ae684b2f09af9b3dd87c50628ed5
| | Author: xyy <xyy@189.cn>
| | Date:   2021-10-05 07:28:29 +0800
| |
| |     Add style.css
| |
| * commit 7f633c8fb14972aa1fb64665d954ccad8581b3eb
|/  Author: xyy <xyy@189.cn>
|   Date:   2021-10-05 07:12:54 +0800
|
|       Add index + git logo
|
* commit 6d72184e894e61aab57ea5adcb861076cadb8cee
  Author: xyy <xyy@189.cn>
  Date:   2021-10-04 08:13:30 +0800

      Add readme.md

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master)
$

gitk --all

image-20211118063652050

2、配置方法:仍然要通过git rebase -i命令

因为我们要合并的那其中一个commit已经是第一个commit了,它是没有父commit的,所以我们这里只能先加上自己的commit id,再进一步观察现象:

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master)
$ git rebase -i 6d72184e894e61aa

image-20211118064122242

我们可以发现,进到rebase交互式界面后,是看不到我们要合并的那个属于第一个commit信息的,因此我们需要手动把这个commit信息给补全:

image-20211118064641234

pick 6d72184 
s c2d5937 Move  filename readme.md readme
pick 0ac2779 Create a complete web page!

配置好后,我们保存退出,按理说,应该会出现一个要修改message的界面:

咦,我们看到报异常了:

image-20211118064943921

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master)
$ git rebase -i 6d72184e894e61aa
interactive rebase in progress; onto 6d72184
Last command done (1 command done):
   pick 6d72184
Next commands to do (2 remaining commands):
   squash c2d5937 Move  filename readme.md readme
   pick 0ac2779 Create a complete web page!
You are currently rebasing branch 'master' on '6d72184'.

nothing to commit, working tree clean
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

    git commit --allow-empty

Otherwise, please use 'git reset'
Could not apply 6d72184...

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master|REBASE-i 1/3)

我们现在看一下,现在git的状态是什么样子的:

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master|REBASE-i 1/3)
$ git status
interactive rebase in progress; onto 6d72184
Last command done (1 command done):
   pick 6d72184
Next commands to do (2 remaining commands):
   squash c2d5937 Move  filename readme.md readme
   pick 0ac2779 Create a complete web page!
  (use "git rebase --edit-todo" to view and edit)
You are currently rebasing branch 'master' on '6d72184'.
  (all conflicts fixed: run "git rebase --continue")

nothing to commit, working tree clean

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master|REBASE-i 1/3)
$

我们按照提示去运行下命令:

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master|REBASE-i 1/3)
$ git rebase --continue

运行这个提示命令后就出现了那个要编辑message的界面了:

image-20211118065912875

image-20211118070155868

保存退出后,我们可以看到有log提示successful了:

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master|REBASE-i 1/3)
$ git rebase --continue
[detached HEAD 70c9054] Add readme
 Date: Mon Oct 4 08:13:30 2021 +0800
 1 file changed, 1 insertion(+)
 create mode 100644 readme
Successfully rebased and updated refs/heads/master.

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master)

接下里,我们验证下效果。

3、验证效果

查看当前master分支的历史commit信息:

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master)
$ git log --graph
* commit 37affa8101e424ef7cedb4738ee669fe2fb0b9fd (HEAD -> master)
| Author: xyy <xyy@189.cn>
| Date:   2021-10-05 07:12:54 +0800
|
|     Create a complete web page!
|
|     Add index + git logo
|
|     Add style.css
|
|     Add js
|
|     Add a refering project !
|
* commit 70c905452ef82796055a52ccf47612038f5b2e01
  Author: xyy <xyy@189.cn>
  Date:   2021-10-04 08:13:30 +0800

      Add readme

      Add readme.md

      Move  filename readme.md readme

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master)

同时可以看到我们当前all的commit id已经发生了改变了:

我们再来回顾一下,这个项目,当时有好多commit信息,上一次把几个静态页面的commit给合并到了一个,今天我们又把readme相关的commit给合并成了一个,现在这个项目总共2个commit信息,非常简洁美观。因此,这个git的 rebase功能在工作中还是非常有用的。

  • 注意啦:现在有个特别神奇且有趣的事情要出现了

我们看一下当前仓库图形化:

hg@LAPTOP-G8TUFE0T MINGW64 /d/IT/01 IT/github_repo/git_repository/git_learning (master)
$ gitk --all

image-20211118071816945

image-20211118071837114

我们可以看到,在git图形化输出上,会形成2颗孤独的树。按理说,应该只会有一个commit信它是没有父commit的,但是我们在master分支把父commit和其它commit给一起合并了,导致当前master分支的the first commit的id发生了变化,因此和之前那个父commit就独立了,就出现了当前2个独立的树的现象。

一般情况,我们主要是用master分支的,而对于tem分支,如果确认没用是可以进行删除操作的。

好了,今天的实验就到此结束了。

注意事项

1.注意:本次实验过程中自己也遇到的问题

image-20211118145622157

image-20211118145715783

2.真高级:如果要重写根提交(第一个提交):git rebase -i --root

image-20211118143500076

如果要重写根提交(第一个提交),它并没有父节点,该怎么办?在提交列表中,可以手工将根提交添加进来。更简单的方式是使用 `git rebase -i --root` 命令,该命令允许你在分支上变基根提交。也就是说,Git 提供的提交列表会包含从根提交直到当前提交的所有提交。

3.注意:对rebase冲突及解决步骤。

image-20211118144735782

image-20211118150137697

作者回复: 冲突属于正常现象,git需要我们自己选择哪一行用哪个变更的内容。只要把有冲突的地方解决掉,就能继续整理commit了。

4.技巧:我想知道老师在进入git rebase i的交互界面时,是按什么键返回上一页拷贝根commit的

image-20211118145040344

下面这3种方法都是可行的:

image-20211118145111267

5.如何删除tag呢?

image-20211118145236046

6.注意:在执行完git rebase -i commitID后想悔棋,该怎么办呢?

image-20211118145940613

关于我

我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!

各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:

  1. 个人微信二维码:x2675263825 (舍得), qq:2675263825。

    image-20211002091450217

  2. 个人博客地址:www.onlyonexl.cn

    image-20211002092057988

  3. 个人微信公众号:云原生架构师实战

    image-20211002141739664

  4. 个人csdn

    https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

    image-20211002092344616

最后

​ 好了,关于怎样把间隔的几个commit整理成1个?实验就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!

image-20211118152659945

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值