How to rebase and squash commits on a (already-pushed) branch, and then push it to the remote, when force pushing is disabled?

I often find myself working on a feature branch, with lots of chore: and wip: commits, that need to be continuously pushed to the remote to prevent losing work in case of client problems.

After finishing implementing the feature, I want to get rid of all these intermediary commits, by rebasing and squashing locally.

Now, how can I push the rebased branch to the remote, when it has force pushing disabled?

Do I need to create a completely new branch and push it instead? After all, the remote-tracking branch won’t allow pushing the rebased branch directly.

I found myself in a similar situation recently, where I had an unsigned commit, that was then signed by rebasing and editing.

Rebasing and Pushing with Force Push Disabled

Understanding the Situation:

  • You have a feature branch with many intermediate commits.
  • You want to rebase and squash these commits locally to clean up the history.
  • Force pushing is disabled on the remote repository.

Solution: Create a New Branch and Push

1. Create a New Branch:

  • Create a new branch from your rebased branch:

Bash

git checkout -b feature-branch-clean

Push the New Branch:

  • Push the new branch to the remote repository:
    Bash
git push origin feature-branch-clean

This will create a new branch on the remote repository, preserving the cleaned-up history.

Why This Approach Works:

  • Preserves Remote History: Creating a new branch avoids overwriting the existing remote branch history, which is typically prevented by force pushing.
  • Clean Local History: The rebased and squashed branch provides a cleaner local history for future work.

Additional Considerations:

  • Review Changes: Before pushing the new branch, carefully review the changes to ensure they are correct and nothing important has been lost.
  • Communicate with Team: If you’re working with a team, inform them about the new branch and the reason for creating it.
  • Consider Force Push (Cautiously): If you’re absolutely certain that the changes are correct and there are no conflicts, you might consider discussing force pushing with your team or project maintainers. However, this should be done with caution as it can overwrite the history of the remote branch.

By following these steps, you can effectively rebase and squash your local branch while respecting the remote repository’s force push restrictions and maintaining a clean and organized history.