Hacker News new | ask | show | jobs
by josephg 132 days ago
Urgh. This problem with git is so unforced. Essentially, people want commits to mean 2 different things at the same time:

1. Store the uncurated history of how the project was developed. 1 commit is created whenever a dev types 'git commit'.

2. Be a linear list of PRs / changes / whatever to a project. Each PR is created by squishing many commits together. It is associated with a conversation around code review, a ticket / issue and often some feature or bug.

Commits can't be both of these things at the same time, so we end up with unnecessary tooling like this.

The answer seems pretty obvious. Git just needs 2 separate mechanisms for these 2 different ideas. The obvious approach would be to leave commits as being atomic units of code change, and invent a new concept in git which represents a feature / feature branch. It would essentially just be a metadata object naming a set of commits, and it would have links to an issue tracker, CI results and code reviews.

2 comments

> The answer seems pretty obvious. Git just needs 2 separate mechanisms for these 2 different ideas. The obvious approach would be to leave commits as being atomic units of code change, and invent a new concept in git which represents a feature / feature branch. It would essentially just be a metadata object naming a set of commits, and it would have links to an issue tracker, CI results and code reviews.

git already has a tool for this called a "merge commit". A merge commit is mostly just a metadata object pointing to multiple previous commits. Sure, this forms a DAG rather than a line, but when all you want to see is a line just walk the graph in a specific pattern. In git that graph walking pattern is usually called `--first-parent`.

Mostly we just need UIs that stop trying to draw a "subway diagram" at all times and just does a `--first-parent` overview. It's strange to me how much work is being put into squashes and rebases and more just to avoid complicated "subway diagrams" when that often would be just fine with merge commits and adding `--first-parent` to your git log defaults and/or pick a UI tool that does that for you.

This is a non-problem. Git primary role is a VCS. What you decide to version is up to you.

On the main repo I like linear commits on the main branch where each is tied to a PR and a ticket number. On my local, how I work is relevant to no one except myself.

When I create a PR, I expect the reviewer to do a full review. If I update, it would be best to also do a full because that’s what will be applied. I believe, as a reviewer, you need to understand the full patch, not little snippets over days.

> Git just needs 2 separate mechanisms for these 2 different ideas

Git is distributed. What is shared between two instances are patches. These are immutables. If I was sent a set of patches that I would not accept for some reason, I would discard it and wait for an updated set of patches. What you propose should be good according to you, I don’t want days long back and forth.