Rebasing is not dangerous. You can always go back if something is not to your liking.
You don’t rebase shared history, you use rebases to craft a clean, quality commit history for your own branches before merging. If everyone does this, then squashing is unnecessary, because garbage commits don’t exist. It is the far superior way of doing things if you actually care about having good commits.
Keeping a quality history rather than squashing also makes many other git tools much better, such as git blame, git revert, git bisect, and so on.
Rebasing is dangerous if you rebase shared history. If you rebase a local branch, you have to be aware of how much of that local branch you may already have shared.
On top of that, if you’ve got a lot of commits you’re rebasing in a merge conflict that can become extremely repetitive.
So ideally, you only rebase single commits that you haven’t pushed yet. As long as you do that: always pull main and rebase on top of that before you push single commits, rebasing is fine. But the more you deviate from that, the riskier it becomes.
You don’t share feature branches. So you always know precisely what is shared history: the commit you branched from.
The workflow is branch from shared history, rebase your branch as many times as necessary during development to craft a quality history, then merge back.
I rebase dozens of times a day and have never had a single issue with it.
If you’re bothered by repetitive merge conflicts (which, in my experience, are quite rare if you’re doing things correctly), that’s what git rerere is for.
Rebasing is for crafting a quality history of your own commits (or getting your branch up to date with the trunk). Merging is for integrating your commits with the shared history.
And I"m saying that doing with merges (and squashing) what should be done with rebases is bad. You can do it that way, but you shouldn’t, because it makes for worse history and less usable git tools.
I constantly rebase my feature branches regardless of how many commits there are and whether I’ve pushed any of them. So long as no one else has checked out my branch it’s perfectly safe. Personally I find rebase merge conflicts far easier to work with. Traditional merge conflicts are “Here’s someone else’s changes, figure out how to merge them into your feature branch.” Rebase merge conflicts are “The main branch has changed since you made your changes. Re-apply your changes to the new base.” For me/my brain, the latter is so much easier. The only time I ever run into problems is when there are merges in the history I’m rebasing. Which I avoid by never merging into my feature branches, only rebasing.
And if it goes wrong, just git rebase —abort. Or if you already completed the rebase, git reset —hard origin/YOUR-BRANCH. Or if you majorly fucked up, use git reflog to find a good commit and reset to that. Zero risk if you know what you’re doing.
Rebasing is not dangerous. You can always go back if something is not to your liking.
You don’t rebase shared history, you use rebases to craft a clean, quality commit history for your own branches before merging. If everyone does this, then squashing is unnecessary, because garbage commits don’t exist. It is the far superior way of doing things if you actually care about having good commits.
Keeping a quality history rather than squashing also makes many other git tools much better, such as
git blame,git revert,git bisect, and so on.Rebasing is dangerous if you rebase shared history. If you rebase a local branch, you have to be aware of how much of that local branch you may already have shared.
On top of that, if you’ve got a lot of commits you’re rebasing in a merge conflict that can become extremely repetitive.
So ideally, you only rebase single commits that you haven’t pushed yet. As long as you do that: always pull main and rebase on top of that before you push single commits, rebasing is fine. But the more you deviate from that, the riskier it becomes.
You don’t share feature branches. So you always know precisely what is shared history: the commit you branched from.
The workflow is branch from shared history, rebase your branch as many times as necessary during development to craft a quality history, then merge back.
I rebase dozens of times a day and have never had a single issue with it.
If you’re bothered by repetitive merge conflicts (which, in my experience, are quite rare if you’re doing things correctly), that’s what git rerere is for.
Rebasing is for crafting a quality history of your own commits (or getting your branch up to date with the trunk). Merging is for integrating your commits with the shared history.
This is what I’m saying: it depends on your workflow.
And I"m saying that doing with merges (and squashing) what should be done with rebases is bad. You can do it that way, but you shouldn’t, because it makes for worse history and less usable git tools.
I constantly rebase my feature branches regardless of how many commits there are and whether I’ve pushed any of them. So long as no one else has checked out my branch it’s perfectly safe. Personally I find rebase merge conflicts far easier to work with. Traditional merge conflicts are “Here’s someone else’s changes, figure out how to merge them into your feature branch.” Rebase merge conflicts are “The main branch has changed since you made your changes. Re-apply your changes to the new base.” For me/my brain, the latter is so much easier. The only time I ever run into problems is when there are merges in the history I’m rebasing. Which I avoid by never merging into my feature branches, only rebasing.
And if it goes wrong, just
git rebase —abort. Or if you already completed the rebase,git reset —hard origin/YOUR-BRANCH. Or if you majorly fucked up, usegit reflogto find a good commit and reset to that. Zero risk if you know what you’re doing.