协慌网

登录 贡献 社区

使用 Git 将我的最后一次 X 提交压缩在一起

如何使用 Git 将我最后的 X 提交压缩成一个提交?

答案

没有git rebasegit merge --squash你可以相当容易地做到这git merge --squash 。在这个例子中,我们将压缩最后 3 次提交。

如果要从头开始编写新的提交消息,这就足够了:

git reset --soft HEAD~3 &&
git commit

如果你想用现有提交消息的串联开始编辑新的提交消息(即类似于 pick / squash / squash / ... / squash git rebase -i指令列表将启动你),那么你需要提取那些消息并将它们传递给git commit

git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

这两种方法都以相同的方式将最后三次提交压缩成一个新的提交。软复位只是将 HEAD 重新指向您不想压缩的最后一次提交。软复位不会触及索引和工作树,使索引处于新提交所需的状态(即,它已经具有您即将 “扔掉” 的提交的所有更改)。

使用git rebase -i <after-this-commit>并在第二次和后续提交中用 “squash” 或 “fixup” 替换“pick”,如手册所述

在此示例中, <after-this-commit>是 SHA1 哈希值或当前分支的 HEAD 的相对位置,从中为 rebase 命令分析提交。例如,如果用户希望在过去查看当前 HEAD 的 5 个提交,则命令是git rebase -i HEAD~5

你可以使用git merge --squash ,这比git rebase -i稍微优雅一点。假设您是主人,并且您希望将最后 12 次提交压缩为一次。

警告:首先确保你提交你的工作 - 检查git status是否干净(因为git reset --hard会丢弃暂存和未分阶段的更改)

然后:

# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12

# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}

# Commit those squashed changes.  The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit

git merge文档更详细地描述了--squash选项。


更新:这个方法相对于更简单的git reset --soft HEAD~12 && git commit的唯一真正优势 - 克里斯 · 约翰森在他的回答中提出的git reset --soft HEAD~12 && git commit是你得到的提交消息预先填充了你正在压缩的每个提交消息。