Squashing commits after they are pushed
Asked Answered
C

1

8

Imagine a git repository with the following commits:

Fixed issue 3               123eabc
Fixed issue 2 (part 2)      fa23b79
Fixed issue 2 (part 1)      7bea5cc
Fixed issue 1               0d229f4

These are all pushed to remote master already. Is there a way now to rewrite history and combine the middle two into one commit? Something like

Fixed issue 3               123eabc
Fixed issue 2               9d23e0c
Fixed issue 1               0d229f4
Conover answered 10/2, 2017 at 15:37 Comment(1)
You can, but the question is should you? Anyone that has pulled from master would need to be notified to repull the rewritten history.Retarder
S
18

One option is to do an interactive rebase in which you squash the two issue 2 commits together.

git rebase -i HEAD~4

This tells Git that you want to do an interactive rebase involving the four commits including and counting backwards from the HEAD of your branch. This should show you a list looking something like the following:

pick 0d229f4 Fixed issue 1
pick 7bea5cc Fixed issue 2 (part 1)
pick fa23b79 Fixed issue 2 (part 2)
pick 123eabc Fixed issue 3

Note the oldest commit appears first, and the most recent of the four commits appears last.

Change the pick for the middle commit part 2 you want to combine with part 1 to squash:

pick 0d229f4 Fixed issue 1
pick 7bea5cc Fixed issue 2 (part 1)
squash fa23b79 Fixed issue 2 (part 2)
pick 123eabc Fixed issue 3

Squashing means combining a commit labelled with squash into the commit above it, in this case merging part 2 into part 1.

Then save this file and exit the editor, and complete the rebase.

Note: Rewriting the history of a public branch can cause problems for anyone besides you who is using this branch. So you might want to avoid even using this answer if this situation applies to you.

Solarism answered 10/2, 2017 at 15:45 Comment(1)
Excellent answer. I have a follow-up question at #42820976Conover

© 2022 - 2024 — McMap. All rights reserved.