[git] 如何合并若干个 commit?(上)

背景

当我们在一个特性分支进行开发时,有时候会需要需要合并若干个 commit \text{commit} commit 的场景(例如在提 Pull Request \text{Pull Request} Pull Request 前,可以将该特性分支的所有 commit \text{commit} commit 合并为一个 commit \text{commit} commit,以便将来查看这个 Pull Request \text{Pull Request} Pull Request 的变更)

要点

借助以下两个命令,可以将当前分支的最近 n \text{n} n 个 commit \text{commit} commit 合并成一个 commit \text{commit} commit

bash 复制代码
git reset --soft HEAD~n
git commit -m "Please write your commit message here"

请注意

  • 执行第一个命令时,需要将 n \text{n} n 替换为您需要的数字(例如 5 \text{5} 5)
  • 执行第二个命令时,请将 "Please write your commit message here" 替换为合适的内容

正文

为了便于讨论,我们来杜撰一个例子 ⬇️

示例

准备工作

请将以下代码保存为 main.sh (具体的名称并不重要)

bash 复制代码
mkdir temp
cd temp

git init
echo "nothing here" >> README.txt
git add README.txt
git commit -m "initial commit"

BOUND=5

for ((i=1; i<=BOUND; i++))
do
    FILE_NAME="file_$i.txt"
    touch "$FILE_NAME"

    echo "This is file number $i" > "$FILE_NAME"
    echo "Created file: $FILE_NAME"
    
    git add "$FILE_NAME"
    git commit -m "Created file: $FILE_NAME"
done

echo "All files created successfully!"

通过执行下方的命令就可以运行 main.sh ⬇️

bash 复制代码
bash main.sh

运行完 main.sh 之后,当前目录中会多出一个 temp 目录。在当前目录执行 tree temp 后,应该可以看到如下的内容

text 复制代码
temp
├── file_1.txt
├── file_2.txt
├── file_3.txt
├── file_4.txt
├── file_5.txt
└── README.txt

1 directory, 6 files

如果用 IntelliJ IDEA (Community Edition) 打开 temp 目录,应该可以看到类似这样的效果 ⬇️

从图中可以看到,我们一共创建了 6 \text{6} 6 个 commit \text{commit} commit。如果我们想把最近的 5 \text{5} 5 个 commit \text{commit} commit 合并在一起,那么至少有两种方案 ⬇️

方案一:基于 git reset \text{git reset} git reset 命令的解决方案

通过执行如下命令,可以切换到 temp 目录中 ⬇️

bash 复制代码
cd temp

执行如下命令,就可以将最近的 5 \text{5} 5 个 commit \text{commit} commit 合并为一个

bash 复制代码
git reset --soft HEAD~5
git commit -m "Please write your commit message here"

请注意

  • 在第一个命令中,数字 5 \text{5} 5 并没有特殊之处,您可以使用数字 n \text{n} n 以合并最近的 n \text{n} n 个 commit \text{commit} commit
  • git commit \text{git commit} git commit 命令的 - m \text{-{}m} -m 选项之后,需要提供对应的 message \text{message} message

执行完上述两个命令后,借助 IntelliJ IDEA (Community Edition) 再次观察,结果符合预期 ⬇️

参考资料

关于 git reset \text{git reset} git reset 命令的详细介绍,可以参考以下两个链接(两个链接来自同一个网站,第一个链接的内容是简体中文,第二个链接的内容是英文)

相关推荐
zho_uzhou11 小时前
Git入门概念
git
爱奥尼欧19 小时前
【Git】远程分支删了本地还在、两个分支历史不相干?两招故障排解
开发语言·git
Java后端的Ai之路20 小时前
Git冲突完整排查与实战:本地修改覆盖报错到成功推送全流程复盘
开发语言·人工智能·git·python·pop
一个心烑20 小时前
配置项目git的 SSL 证书
git·网络协议·ssl
IT从业者张某某1 天前
【鸿蒙PC命令行适配】GitUI 移植的工程实践:双 Git 引擎(libgit2/gitoxide)的鸿蒙适配之路
git·华为·harmonyos
xinjia_ctrl1 天前
暑假实习总结
git·后端·spring·maven·intellij-idea
Molesidy1 天前
【Git】分别给出添加到Keil工程和IAR工程中的gitnore文件以便不跟踪编译文件的git记录
git·vscode·插件
颜颜yan_2 天前
Git Cola 鸿蒙 PC 版适配全记录:从 Qt 桌面工具到 ArkTS 原生应用
git·qt·harmonyos
知福致福2 天前
【技术复盘】Git 分支污染与提交污染事故排查与解法
大数据·git·elasticsearch
ai安歌2 天前
Git Extensions 鸿蒙 PC 适配全记录:从 WinForms 客户端到 ArkUI 原生工作台
git·华为·harmonyos