====== Git - squash commits ====== ==== Squash two last commits ==== $ git log --pretty=oneline a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c b76d157d507e819d7511132bdb5a80dd421d854f b df239176e1a2ffac927d8b496ea00d5488481db5 a $ git rebase --interactive HEAD~2 pick b76d157 b pick a931ac7 c # Rebase df23917..a931ac7 onto df23917 # # 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. pick b76d157 b squash a931ac7 c # Rebase df23917..a931ac7 onto df23917 # # 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. $ git pull --no-ff $ git push ==== Squash non-consecutive commits ==== **Squash D and A commits** $ git log --pretty=oneline 799203124ffd1397f16830a1a6acb81491b7a7c6 A a931ac7c808e2471b22b5bd20f0cad046b1c5d0d B b76d157d507e819d7511132bdb5a80dd421d854f C df239176e1a2ffac927d8b496ea00d5488481db5 D $ git rebase --interactive HEAD~4 pick aaaaaaa Commit A pick bbbbbbb Commit B pick ccccccc Commit C pick ddddddd Commit D # Rebase aaaaaaa..ddddddd onto 1234567 (4 command(s)) # # 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 # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out pick aaaaaaa Commit A squash ddddddd Commit D pick bbbbbbb Commit B pick ccccccc Commit C # Rebase aaaaaaa..ddddddd onto 1234567 (4 command(s)) # # 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 # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out $ git pull --no-ff $ git push