You made a bunch of commits on a feature branch right before going on vacation. Now that you've returned,
main have moved on and Git seems to be unable to successfully
rebase your changes without throwing massive merge conflicts in your face. If you made a real mess, you may have even merged
master changes into your branch in between commits – and all hope seems lost. Good news: It's not. We can get all your changes into a clean single commit ready for a pull request.
If you're usually using
git rebase main, you might want to look into
git merge --squash. Let's walk through it.
1) Pull the latest version of
main and checkout a new branch based on it. We'll be doing our temporary work here.
git checkout main
git checkout -b temp_work main
2) Pull in the changes from your ancient or messy feature branch. This command will take all your changes squashed together and stage them without creating a commit.
git merge --squash feature_branch
At this point, you might be getting a smaller number of unavoidable merge conflicts. Have faith that this is the smallest possible number of conflicts as you're skipping the many in-between commits you've originally created.
3) After fixing all remaining merge conflicts, commit your changes with an appropriate message. By default, Git will pre-fill your commit message with a helpful summary of where these changes came from – something that many tools like GitHub will pick up and continue to highlight in their interfaces.
4) If you'd like to re-use your old branch, you can now reset it to your temporary branch created above. In my workflow, I'd then force-push the changes up to GitHub before deleting my temporary work branch.
git checkout feature_branch
git reset --hard temp_work
git push -f
git branch -D temp_work