挤压我最后一个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 rebasegit 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是你得到提交消息预填充每个你正在压缩的提交消息。

链接地址: http://www.djcxy.com/p/721.html

上一篇: Squash my last X commits together using Git

下一篇: Check if object is array?