您正在寻找git rebase
命令。对于简单的情况下,做
git checkout D
git rebase F
或者,做
git rebase D F
这不会挤进一个提交。要做到这一点,可能是最不容易出错的选择将是做一个互动承诺:
git checkout D
git rebase -i F
这将显示在D
的提交是将要重建基础的编辑器。它会是这个样子:
pick 293a24d Some commit message
pick a015bbe Some commit message
pick e19f4fa Some commit message
pick 40ae959 Some commit message
pick fba6b72 Some commit message
# Rebase 419206d..fba6b72 onto de95063
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
按照说明和更改所有,但第一行开始与squash
,而不是pick
。这会让您选择在保存并退出编辑器时合并邮件。
或者,您可以将配合pick
更改为reword
,其余配置更改为fixup
。这只会向您显示第一个提交消息。如果您想完全丢弃所有旧的提交消息,则此选项更简单。
最后,如果你感觉很冒险,你可以自动过滤提交列表中,绕过底垫的第一个互动部分:
EDITOR='sed -i -e "2,$s/pick/squash/"' git rebase -i F
这将自动更改pick
到squash
上开始与所有行第二行是通过sed
而不是通常的交互式编辑器来过滤编辑器文件。
当我做一个'git log'时,输出显示被压扁在一起的提交列表。有没有办法做到这一点,只有新的提交ID和评论'合并'会显示? – Maddy
是的,使用'git commit -m'。一个空的'git commit'使用'merge --squash'中的默认值,它是分支提交的连接列表。 –
RJFalconer
非常整洁,也可能是最安全的方式,因为不涉及任何rebase。 –