挤压我最后一个X使用Git一起提交
如何使用Git将最后一次X提交一起压缩为一个提交?
如本手册所述,使用git rebase -i <after-this-commit>
并将第二次和随后的提交中的“pick”替换为“squash”或“fixup”。
在这个例子中, <after-this-commit>
是SHA1散列值或当前分支的HEAD的相对位置,从该分支中为rebase命令分析提交。 例如,如果用户希望查看过去5次来自当前HEAD的提交,那么该命令是git rebase -i HEAD~5
。
你可以很容易地做到这一点,而无需git rebase
或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 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
的唯一真正的优点 - Chris Johnsen在他的回答中建议的git reset --soft HEAD~12 && git commit
是你得到提交消息预填充每个你正在压缩的提交消息。