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.

  • Kissaki@programming.dev
    link
    fedilink
    English
    arrow-up
    0
    ·
    14 days ago

    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.

    • magic_lobster_party@fedia.io
      link
      fedilink
      arrow-up
      0
      ·
      14 days ago

      What I like with squash on merge is I don’t need to worry about shit my coworkers make. My coworkers can have terrible git disciplines, and the master branch is still clean.

      • killeronthecorner@lemmy.world
        link
        fedilink
        English
        arrow-up
        0
        ·
        14 days ago

        This is the reality. You’ll spend most of your time working with people of varying SCM skill levels, and spread all the way across the spectrum. Squash commits combined with centralised auditing (GHE, GitLab, etc) add the necessary rail to keep a clean history on main and to make building-block change sets easily revert-able.

        In my decades working on large teams of engineers, the need to identify changes by wip/interim commits has never been terribly useful for the reason you describe: everyone has different git hygiene procedures and most corps don’t give a tiny little shit about maintaining that level of hygiene unless you’re white room / highly regulated.

        And if you do want that level of depth you can go find the PR/MR in the central source where the revision history of the dead branch is often sustained (unless you configure it not to)

        But yeah, I call YAGNI a lot on git history purists to this day. It’s a huge amount of effort and coordination to retain a tiny amount of value that is 50/50 gonna be useful depending on the git hygiene of the person who wrote it. Save your efforts and just read the damn code.

    • GissaMittJobb@lemmy.ml
      link
      fedilink
      arrow-up
      0
      ·
      14 days ago

      In non-minimal changesets, I would miss information/documentation about individual logical changes that make up the changeset.

      It’s usually possible to find this by navigating back to the PR which you can find referenced in the squash commit.

      I guess this might be a larger problem for codebases not following a trunk-based approach, where PRs grows to very large sizes before going into the mainline branch.