Git如何将多个commit合并一个commit

问题场景:我在fork的仓库提交多个commit后,准备向原仓库提交pr,但是原仓库要求一个pr一个commit,因此需要先将这些commit合并为一个。

1.先拿到要合并的commit中最早的一个的commit id,然后进入仓库,使用如下git log命令拿到这个commit的前一个commit的id(打印出的第二个,如下图)
bash 复制代码
git log --pretty=format:"%H %P" -n 1 <最早的一个的commit id>
2.然后基于这个commit id进入rebase模式
bash 复制代码
git rebase -i 871c44f849b8af50ae2cb3289958336591b97941

如下我要将这些commit合并为一个,将第一个pick下的所有行开头的pick都改成s即可(s表示与上一个commit合并)

一个一个改显然很麻烦,如何多行同时编辑:

第一步多行同时删除:先将光标移动到要修改的行首,使用ctrl+v快捷键进入VISUAL BLOCK模式,然后使用键盘的上下左右箭头将光标移动到最后一个pick的c后面,然后按d删除所有选中的pick

若操作失误可使用esc退回普通模式,在使用shift+:进入命令模式,输入u回车撤销上一步编辑

第二步多行同时编辑:光标再移动到要编辑的首行,然后使用ctrl+v快捷键再次进入VISUAL BLOCK模式,将光标向下移动到最后一行行首。shift+i(即大写I)进入编辑模式,此时会自动跳到要操作的第一行,直接输入字符s,然后按esc键 后面的行就同步刷新了。

最后shift+:进入命令模式输入wq保存。此时会跳转到合并后的commit的信息编辑页面,当前显示的是所有合并commit的信息,看起来很多很乱,我们可以把这些信息全部干掉,然后为这个新commit编写一个简短的提交信息,选择一行开始直接长按d可以快速进行删除,和vim中的编辑其实是一样的

最终结果如下,然后shift+:进入命令模式输入wq保存

3.再使用git log命令查看,确认之前那些commit已经合并为一个了

最后我们再将这个新commit强制push到远程仓库(普通push可能push不上去)

bash 复制代码
git push origin master --force
相关推荐
貂蝉空大40 分钟前
Git Switch 与 Git Restore 详解
git
aini_lovee9 小时前
python在容器内克隆拉取git私有仓库
git·python·elasticsearch
zhangphil9 小时前
git merge合并分支push报错:Your branch is ahead of ‘xxx‘ by xx commits.
git
2018_XWJ9 小时前
本地项目push到git
git
漫步企鹅10 小时前
【Git】面对发布或重要节点,Git如何打Tag?
git·tag·节点·发布
能工智人小辰10 小时前
learngitbranching git游戏笔记
git
牧野星辰20 小时前
.gitignore文件的规范
git·github
二个半engineer1 天前
GitLab Web 界面创建分支后pathspec ... did not match any file(s)
git·gitlab
尽兴-1 天前
Git 清理指南:如何从版本库中移除误提交的文件(保留本地文件)
大数据·git·gitee·gitlab
飞翔的猪猪2 天前
GitHub Recovery Codes - 用于 GitHub Two-factor authentication (2FA) 凭据丢失时登录账号
前端·git·github