Marcin Wosinek Definitely agree. Thanks for sharing your perspective as well! The git reset --soft was a new command for me to pick up this year and I've found it very useful. Sometimes if you have a super complex merge you can also just use: git diff HEAD origin/main >> changes.patch git checkout main git checkout -b feature-branch git apply changes.patch After all, a bunch of commits are just a text file with changes, and you can pipe it into a file, and apply it arbitrarily. Patch files tend to be the most useful when I'm sharing in progress changes with another developer and I don't want them to deal with committing or asking someone to check out. I just take my in progress 75% working code and: git diff HEAD origin/main >> changes.patch Send changes.patch over slack to developer Ask them to checkout main and git apply changes.patch Most often I actually see this when working with Solutions engineers, client engineers, or sales engineers. It's an easy way to verify if the thing you are solving for them is actually accurate. That depends on those team members being actual developers though... but I digress. It may be interesting to do a blog post on squash merges. When discussing requiring squash merges with developers I tend to reference christopher.xyz/2020/07/13/squash-merge.html and blog.dnsimple.com/2019/01/two-years-of-squash-merge/ This one is non-negotiable for me as far as enforcement goes, but I have learned that others disagree, sometimes strongly. It would be interesting to see more blog posts on this topic in the future, regardless of stance!