this post was submitted on 03 Aug 2025
80 points (98.8% liked)

Programming

21981 readers
121 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 2 years ago
MODERATORS
 

I want clean history, but that really means (a) clean and (b) history.

People can (and probably should) rebase their private trees (their own work). That's a cleanup. But never other peoples code. That's a "destroy history"

So the history part is fairly easy. There's only one major rule, and one minor clarification:

  • You must never EVER destroy other peoples history. You must not rebase commits other people did.

[...]

If you are working with git together with other people, it's worth a read.

you are viewing a single comment's thread
view the rest of the comments
[–] magic_lobster_party@fedia.io 18 points 2 days ago (8 children)

I think this is dependent on context. Linus is working with a very public repository. Private repositories shared with a small team have different conditions.

What works in my smallish team at my company is:

  • Enable squash commits. Each PR should be squashed to a single commit. This makes the master branch linear and simple. This ensures each individual commit on master has been reviewed and is in a working state.
  • You can do whatever shit you want on your own branch. It’s going to be squashed anyway.
  • Don’t base your work on some other team member’s branch, unless agreed upon. That’s their work. You should only depend on the master branch.
  • Never rewrite what has already been committed to the master branch.
[–] Kissaki@programming.dev 8 points 2 days ago (5 children)

Enable squash commits. Each PR should be squashed to a single commit. This makes the master branch linear and simple. This ensures each individual commit on master has been reviewed and is in a working state.

In non-minimal changesets, I would miss information/documentation about individual logical changes that make up the changeset. Commit separation that is useful for review will also be useful for history.

I prefer a deliberate, rebase- and rewrite-heavy workflow with a semi-linear history. The linear history remains readable, while allowing sum-of-parts changesets/merges.

It's an investment, but I think it guides into good structuring and thoughts, and whenever you look at history, you have more than a squashed potential mess.

Squash-on-merge is simpler to implement and justify, of course. Certainly much better than "never rebase, never rewrite, always merge", which I am baffled some teams have no problem doing. The history tree quickly becomes unreadable.

[–] HaraldvonBlauzahn@feddit.org 3 points 2 days ago (1 children)

Commit separation that is useful for review will also be useful for history.

Also when using git bisect aka "The Alaskan Wolf Fence Method" on nasty bugs e.g. causing concurrency or UB issues.

It is also a potential downside of rebasing that it can (sometimes) invalidate interim tests.

[–] FizzyOrange@programming.dev 1 points 2 days ago

Not really because I've never seen a setup that requires every commit in a branch to compile and pass tests. Only the merge commit needs to.

Also if your PR is so big that it would be painful to bisect within it, then it should be broken into smaller PRs.

load more comments (3 replies)
load more comments (5 replies)