实战:怎样把间隔的几个commit整理成1个?-2021.11.18
目录
文章目录
文档来源
文章来源:课程:《玩转Git三剑客》-苏玲-极客时间-20210918购买-69元\18 怎样把间隔的几个commit整理成1个?
https://time.geekbang.org/course/detail/100021601-72798
实验环境
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
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
我们可以发现,进到rebase交互式界面后,是看不到我们要合并的那个属于第一个commit信息的,因此我们需要手动把这个commit信息给补全:
pick 6d72184
s c2d5937 Move filename readme.md readme
pick 0ac2779 Create a complete web page!
配置好后,我们保存退出,按理说,应该会出现一个要修改message的界面:
咦,我们看到报异常了:
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的界面了:
保存退出后,我们可以看到有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
我们可以看到,在git图形化输出上,会形成2颗孤独的树。按理说,应该只会有一个commit信它是没有父commit的,但是我们在master分支把父commit和其它commit给一起合并了,导致当前master分支的the first commit的id发生了变化,因此和之前那个父commit就独立了,就出现了当前2个独立的树的现象。
一般情况,我们主要是用master分支的,而对于tem分支,如果确认没用是可以进行删除操作的。
好了,今天的实验就到此结束了。
注意事项
1.注意:本次实验过程中自己也遇到的问题
2.真高级:如果要重写根提交(第一个提交):git rebase -i --root
如果要重写根提交(第一个提交),它并没有父节点,该怎么办?在提交列表中,可以手工将根提交添加进来。更简单的方式是使用 `git rebase -i --root` 命令,该命令允许你在分支上变基根提交。也就是说,Git 提供的提交列表会包含从根提交直到当前提交的所有提交。
3.注意:对rebase冲突及解决步骤。
作者回复: 冲突属于正常现象,git需要我们自己选择哪一行用哪个变更的内容。只要把有冲突的地方解决掉,就能继续整理commit了。
4.技巧:我想知道老师在进入git rebase i的交互界面时,是按什么键返回上一页拷贝根commit的
下面这3种方法都是可行的:
5.如何删除tag呢?
6.注意:在执行完git rebase -i commitID
后想悔棋,该怎么办呢?
关于我
我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!
各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:
-
个人微信二维码:x2675263825 (舍得), qq:2675263825。
-
个人博客地址:www.onlyonexl.cn
-
个人微信公众号:云原生架构师实战
-
个人csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
最后
好了,关于怎样把间隔的几个commit整理成1个?实验就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!