Git 易上手实用技巧:合并多个commit脏提交

适用场景

笔者这两天在学习 CI/CD自动化部署,因为不断修改部署文件不断测试,导致 commit 历史记录中有一系列的"脏提交"。因为多个 commit 存在很强的关联性、并且几个 commit 加起来也可以成为一个完整的描述的时候,所以想对这些 commit 进行合并。

今天的目标就是把二十多个关于部署的脏提交合并成一个提交,使项目的git提交树更加干净直观。

使用步骤

1. 查看分支上的提交历史记录

c 复制代码
// 查看完整版提交详情
git log
// 推荐使用这个:查看简洁版提交历史记录
git log --oneline

2. 使用 rebase 合并 commit

有两种方法可以采用:

  • 从头开始合并,指定合并多少条commit
sql 复制代码
// ~ 后写合并的commit数量,例如指定合并25条commit
git rebase -i HEAD~25
  • git log --oneline 后,显示的7位哈希码作为开头,把 HEAD~x 改为哈希码:
css 复制代码
git rebase -i 62a8809

执行完上面命令后,会看到以下命令行窗口:

蓝色字体是git rebase命令的输出,用于在进行提交合并或历史重写时选择操作,解释一下每个命令的意思:

p, pick <commit>:使用指定的提交

r, reword <commit>:使用指定的提交,但编辑提交信息

e, edit <commit>:使用指定的提交,但停止以进行修改

s, squash <commit>:使用指定的提交,但将其合并到前一个提交中

f, fixup <commit>:类似于"squash",但丢弃该提交的日志信息

x, exec <command>:使用shell运行命令(行的其余部分)

b, break:停在此处(稍后使用'git rebase --continue'继续重写)

d, drop <commit>:移除提交

l, label <label>:用名称为当前HEAD添加标签

t, reset <label>:将HEAD重置为标签

m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]:创建一个合并提交,使用原始合并提交的消息(如果没有指定原始合并提交,则使用oneline)。使用-c <commit>来重新编辑提交信息。

我们一般只需要用到pick、squash和fixup,将最早那次提交保留(pick),之后的提交融入上一次的提交(squash)或丢弃(fixup

具体操作:

回车后,单击i键进行编辑模式,除了第一条 commit 依旧为 pick 不变,其余都改成 s

修改完成后,按下ESC退出编辑模式,再按下:wq保存退出,commit就被合并了,此时如果有文件产生了冲突,需要在编辑器完成合并冲突操作,冲突合并完成后,多个commit提交也合并好了。

再次使用git log --oneline查看就能看到效果:

由于笔者编辑squash时保留的最后一个pick是62a8809的前一个提交b1a7653,所以此处合并的是最新到b1a7653的所有commit,于是笔者又悄咪咪合并了一下顶上的两个commit,步骤同上

3. 修改 commit 提交信息

合并完成的 commit 提交信息不太好看,通过以下命令行修改:

sql 复制代码
git commit --amend

按下i进入编辑模式,编辑完成后ESC退出编辑,然后:wq保存

4. 修改远程仓库的git树

前面的步骤完成后,本地的git树确实更新了,但是远程仓库的git树并没有。此时如果是常规的 git push 会因为两棵git树不一致而报错,这时就需要用强制更新 git push -f 去覆盖远程的git树,具体流程如下:

arduino 复制代码
// 假设合并的是远程origin仓库的master分支,先拉代码解决冲突
git pull origin master
// 再强制推上去
git push -f origin master 

这样本地和远程的 commit 都合并成功啦~


如有不足之处或有更好的见解,欢迎评论区讨论。博采众长,共同进步!

相关推荐
海天胜景15 分钟前
无法加载文件 E:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本
前端·npm·node.js
MingT 明天你好!18 分钟前
在vs code 中无法运行npm并报无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查
前端·npm·node.js·visual studio code
老兵发新帖23 分钟前
pnpm 与 npm 的核心区别
前端·npm·node.js
超级土豆粉24 分钟前
怎么打包发布到npm?——从零到一的详细指南
前端·npm·node.js
OpenTiny社区29 分钟前
TinyEngine 2.5版本正式发布:多选交互优化升级,页面预览支持热更新,性能持续跃升!
前端·低代码·开源·交互·opentiny
敲上瘾1 小时前
企业开发工具git的使用:从入门到高效团队协作
linux·git·gitee·github·开发工具
声声codeGrandMaster1 小时前
Django框架的前端部分使用Ajax请求一
前端·后端·python·ajax·django
重生之后端学习2 小时前
02-前端Web开发(JS+Vue+Ajax)
java·开发语言·前端·javascript·vue.js
繁依Fanyi3 小时前
用 CodeBuddy 实现「IdeaSpark 每日灵感卡」:一场 UI 与灵感的极简之旅
开发语言·前端·游戏·ui·编辑器·codebuddy首席试玩官
hillstream34 小时前
配置git从公网能访问-基于frp
git·gitlab