您正在尋找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。 –