Rewrite a merge commit into a squash merge commit

git squash merge into single commit
git-squash merge commit
git merge --squash
squash all commits on a branch
squash commit into merge commit
git squash old commits
git squash commits after push
git rebase squash

I made a merge of a long lived branch and it took me time to complete the merge because of the conflicts resolution.

I found out that I cannot publish my work with git-svn: git svn rebase will rebase all the commits of the merged branch instead of submitting one single merge commit. I discovered git merge --squash a bit too late...

Is it possible to change (rebase interractive ?) the merge commit into a "squash merge" commit without loosing all the conflicts resolution work already done (i.e. without triggering a new merge as I had not enabled the rerere tool) ?

Maybe git rebase --preserve-merges works for you.

Here a detailed answer of what is going on when doing that:

What exactly does git's "rebase --preserve-merges" do (and why?)

Please apologize that I don't like to copy&paste from there.

Rewriting History, You can decide what files go into which commits right before you commit with the edit <commit> = use commit, but stop for amending # s, squash <commit> merge commit's # . message (or the oneline, if no original merge commit was  By using squash merge, we have been able to drastically improve the quality of our change history, turning our commit log into a very powerful tool to navigate: We reduced (and in certain case even eliminated) the number of fixme , fix previous commit , fix specs commits to the repository.

I was in a similar issue and was able to create a squashed commit by simply resetting and recommitting the change.

Starting layout:

*   06074985 (HEAD -> test1) Merge branch 'test2' into test1
|\
| * eb2aa088 (test2) test2 commit
* | c83180c8 test1 commit
|/
* b6628265 (master) base commit

git commands: git branch temp (so I don't loose the merge commit) git reset HEAD~1 git add . git commit -m "Squash commit" git diff temp (just to make sure nothing changed)

Ending layout:

* 5e229615 (HEAD -> test1) squash commit
| *   06074985 (temp) Merge branch 'test2' into test1
| |\
|/ /
| * eb2aa088 (test2) test2 commit
* | c83180c8 test1 commit
|/
* b6628265 (master) base commit

Rewriting history, Git merge --squash. Squashing is the process of merging multiple commits into a single commit. If you run git merge  pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls s 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend Save, and I land into the editor to decide the commit message of the melded three commits (see how they are concatenated one after the other):

Squash commits into one with Git, In Git you can merge several commits into one with the powerful is the hash of the commit just before the first one you want to rewrite from. When squash merging, it's a good practice to delete the source branch. This prevents confusion as the topic branch itself does not have a commit merging it into the default branch. Completing pull requests with squash merge. You can choose to squash merge when completing a pull request in Azure Repos. Choose Squash changes when merging on the

Git Interactive Rebase, Squash, Amend and Other Ways of Rewriting , “Please rebase on top of master and we'll merge your pull request”. “Can you please squash your commits together so we get a clean,  If you squash these commits into one commit while merging to the default branch, you can retain the original changes with a clear Git history. Merge message for a squash merge. When you squash and merge, GitHub generates a commit message which you can change if you want to.

About pull request merges, If you squash these commits into one commit while merging to the default branch,​  This note shows how to merge an ugly feature branch with multiple dirty WIP commits back into the master as one pretty commit. Easy mode: Reset your feature branch to the master state. The easiest way to turn multiple commits in a feature branch into a single commit is to reset the feature branch changes in the master and commit everything again.

Rebasing Onto A Squashed Commit, When you're using Github's nice “Squash and Merge” button (or the git merge -​-squash) to squash all the commits in a pull request rathe. Let's say I have master branch, that I make branch fix . off of to fix some small bugs. If, instead of “pick” or “edit”, you specify “squash”, Git applies both that change and the change directly before it and makes you merge the commit messages together. So, if you want to make a single commit from these three commits, you make the script look like this:

Comments
  • I'd try to fork a temporary branch off the first parent of your merge commit and then git cherry-pick -m 1 <merge_commit> the merge commit onto it. If all would look OK, just reset the original branch to the result.
  • See this for more info on -m 1 in the proposed git cherry-pick call.
  • possible duplicate of What exactly does git's "rebase --preserve-merges" do (and why?)
  • The git cherry-pick -m 1 <merge_commit> solution as suggested by @kostix is the most robust solution here since it also preserves commit information. I have added it as an answer below.