Day 085Building Solo5 min readChinese original ↗

How much Git does a non-technical builder need?

非技术 Builder,到底需要懂多少 Git / 开发知识?
TL;DR
  • As a non-technical builder, I don’t plan to learn all of Git. I’ve drawn a boundary of six things for myself: understanding the shared baseline, which version a task is based on, which kind of “done” it is, branches, dependencies, and when to take a decision back.
  • Implemented, committed and pushed are none of them the same as merged; only once it’s in main is it on the shared main line. And an agent’s context goes stale too.
  • Syncing, rebasing and resolving mechanical conflicts can go to a coding agent, but problems like a design rule conflicting with the code aren’t missing a Git skill; they’re missing a decision, and that’s mine to make.

Since building products with coding agents, I often run into words I would never have set out to learn before:

branch, main, worktree, origin/main, rebase, commit SHA, diverged…

If I stopped to study each word systematically whenever I met it, I’d soon find I’d built little product but taken more and more remedial development classes.

But knowing nothing doesn’t work either.

If the agent says “this branch is behind main,” “local and remote have diverged,” or “this task is based on an old commit,” and I have no idea what it means, it’s hard to judge whether we can keep going.

So for me, the more practical question isn’t “should I learn Git.”

It’s:

as a builder without a technical background, how much do I actually need to understand?

For now, I’ve drawn a boundary of six things for myself.

1. What the current “shared baseline” is

A project may have many “versions” at once: the design Claude Design just produced, the branch a coding agent is changing, local files not yet committed, and code already merged into main.

They may all be very recent, but in different states.

What matters most to me is knowing which version is the shared baseline other agents should continue from by default.

Usually it’s the merged main. Other things can be newer than main, but until they’re merged they’re still proposals, work in progress or candidates.

That doesn’t mean everything in main is always correct. When there’s a product or design conflict, you still need to look at the relevant Product Definition, Design Rules or other canonical source.

So what I need to understand isn’t every detail of Git, but two things: which version everyone is working from right now, and who has the final say when there’s a conflict.

So when an agent says:

it’s done.

I ask one more level:

done in a branch, or already merged?

Those two are very different.

2. Which version a single task started from

A coding agent says:

this is how it is in the code right now.

“Right now” actually has a time range.

If a task has been going on for several days, and lots of other changes have been merged into main in between, its judgment may still rest on code from days ago.

That’s where the concept of BASE is useful to me.

I don’t need to memorize long commit SHAs myself; I only need to understand:

which version of the project did this task start from?

If main has changed in relevant ways, I need to have the agent recheck whether its original judgment still holds.

How to look up commits and how to sync are the agent’s job.

What I need to know is: an agent’s context goes stale too.

3. Telling which kind of “done” it is

This distinction is easy for people without an engineering background to blur.

A task may already be:

designed; implemented; passing tests; committed; pushed; even have a PR created.

It may still not be in main.

So now, when I see a coding agent write:

implemented committed pushed merged

I no longer read them as the same thing.

Implemented only means it’s been done in some workspace.

Only merged means it’s entered the project’s shared main line.

That also makes it easier for me to understand why several agents sometimes see different product states.

4. Understanding what branches are for, without having to master branch operations

What I most need to understand about branches now is simple:

main is the shared baseline; a branch is a temporarily independent line of work.

Different tasks can move forward on different branches without affecting each other.

Finally, after review, you decide whether it goes into main.

As for:

how to create a branch; how to create a worktree; when to rebase; how to recover when things diverge;

I can let the coding agent handle these.

What I need to be able to read is:

which line of work is this change on right now? Has it entered the shared version?

That alone solves a great many communication problems.

5. Being able to read dependencies, rather than resolving every conflict myself

Some development problems look like Git problems, but what matters more is the dependency.

For example:

task A is changing a global component.

Task B uses that component heavily at the same time.

Git may never report a conflict at all, but the judgments B made based on the old component are no longer valid.

So I need to know:

what does this task depend on?

But I don’t need to decide myself whether to sync with merge or rebase.

That’s also one boundary of how I understand technical literacy now:

I need to understand the relationships, not necessarily carry out the operations myself.

6. Knowing when you can’t keep handing decisions to the agent

There’s one kind of problem I’m comfortable letting a coding agent handle by itself:

this branch is behind main; check it and sync safely.

Create a new worktree.

Git history has diverged; protect the existing changes first, then propose a recovery plan.

Two files have a mechanical merge conflict; merge according to the current code’s semantics.

These are mainly technical execution.

Another kind of problem, I always step in on:

the new design wants Button at 36px, but the current Design Rules say 34px — which should change?

The actual code behavior doesn’t match the Product Definition — which is the intended behavior?

Two tasks make different demands on the same component — which should the product finally choose?

What’s missing here isn’t a Git skill.

It’s a decision.

If I also hand this kind of judgment to the agent to “sort out along the way,” it’s easy to end up with a result that’s technically sound but that nobody in product ever really decided.

So I don’t need to learn all of Git

What I need now isn’t being able to do every engineering operation independently of a coding agent.

What I need is to understand a few key things:

  • what counts right now;
  • which version the agent is working from;
  • which changes haven’t entered the main line yet;
  • roughly what a branch means;
  • whether there are dependencies between tasks;
  • when a problem has turned from technical execution into a product decision.

As for Git commands, rebase, worktrees, branch cleanup and conflict recovery, I’ll pick some up gradually through use, but there’s no need to make “operating them fluently myself” the goal.

For builders without a technical background, I think a more practical standard is:

understand it, be able to judge, dare to delegate, and know when to take the decision back.

The operations can keep going to the coding agent.

Versions, dependencies and the final judgment should at least stay in your own hands.

Written in Chinese and translated into English with the help of AI. Read the original