Data

I Mined 13 Years of My Git History. It Knew Me Better Than I Did.

Last night I pulled every commit I ever made — the repos on my machine, plus bare clones of my whole GitHub account. 31,103 commits across 128 repos and 2,137 active days. I expected a fun chart. What I got was closer to a personality test I could not argue with.

Vibol Teav 8 min read

Your git history does not care how you describe yourself. It only records what you actually did, timestamped, for years. Here is what mine said — and how you can run the same mirror on yourself.

A developer silhouette facing a mirror whose reflection is built entirely of glowing green commit squares — 13 years of git history, 31,103 commits

The five invisible years

My GitHub account is from September 2013. For the first five years it contains almost nothing: 18 commits between 2014 and 2017. Six tiny repos. My first recorded act is a merge commit on an oh-my-zsh fork — shell config, like everyone.

I was not idle in those years. I was coding full-time — but as an employee, and all of that work lives in company repos I no longer have access to. This is worth knowing before you mine your own history: your git archive does not start when your career starts. It starts when you begin to own your work. For me that line is sharp and visible in the data: 2018, when I went independent.

The commits per year

2014-17  · 18 total                      ← employed; work owned by others
2018     ▊▊▊ 604                       ← independence begins
2019     ▊▊ 382
2020     ▊▊▊▊▊▊▊▊▊▊▊▊ 2,647
2021     ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 3,845
2022     ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 4,735
2023     ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 5,749   ← what I thought was my peak
2024     ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 4,178
2025     ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 4,070
2026     ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 4,875       ← by July 21

The surprise is the last bar. 4,875 commits in 202 days is about 24 per day — a full-year pace of ~8,800, more than 50% above my best year ever. Two things changed in 2026: I took a full-time role on top of freelance work, and I started using AI coding tools seriously.

I "felt" more productive this year. I did not know the number. If you want to measure what AI tooling actually did to your output, your git log already ran the experiment. Commit count is a rough proxy — commits are not equal in size — but a jump this large at the same commit style is hard to explain away.

The clock does not lie

Commits by hour of day, all 13 years:

00–02  ▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 3,420
03–05  ▊▊▊▊▊▊▊▊ 1,986
06–08  ▊▊▊▊▊▊▊ 1,851           ← my only quiet hours
09–11  ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 3,998
12–14  ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 4,638
15–17  ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 5,968  ← peak
18–20  ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 5,002
21–23  ▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ 4,240

Three facts I could not have told you before, and cannot unsee now:

  • Almost one commit in four happened between 22:00 and 05:00. 24% of my life's work is night work.
  • 25% happened on weekends — and Sunday (4,197) out-produces Saturday (3,782). My weakest day of the whole week is Monday.
  • My longest streak is 57 consecutive days with at least one commit. Two months without one single day off. My busiest day ever: 130 commits.

Here is the uncomfortable part. If you asked me, I would have said I protect my weekends and try not to work at night. I have written plans that say exactly that. The data says I have never lived that way, not for one year out of thirteen. When your self-image and your commit timestamps disagree, the timestamps win. Either the plan changes or the behavior does — pretending both are true was only possible before I looked.

Your commit messages are a vocabulary test

I took the first word of all 31,103 commit messages and ranked them:

First word Count
fix / fixed7,201
update / updated3,897
merge3,881
add / added3,101
revert840
debug452

I always described myself as a builder. My git log says my number one verb, by more than double, is fix. "Add" — the builder's verb — comes fourth.

At first this felt like an insult. Then I looked at it differently: most of my income for years came from keeping running systems alive, not from greenfield builds. The log did not say I am a bad builder. It said the market has been paying me to be a repairer, and I never noticed that was my actual product. (The 840 public reverts I choose to read as honesty.)

The graveyard and the garden

Of my 128 repos, 100 are dead — no commit in the last 90 days. There it is: the classic developer graveyard. Abandoned experiments, weekend ideas, a batch of half-finished apps, forks I touched twice.

I almost stopped there, feeling appropriately guilty. Then I looked at which 28 repos are alive, and the guilt turned into the most useful finding of the whole exercise:

  • One client codebase: committed for 7.8 years, still active this week
  • Its sister project: 7.7 years
  • Four more client systems between 6 and 7 years each
  • An open-source case-management app I still maintain: 6.1 years

Every long-lived repo is a system someone depends on. Every dead repo is an experiment nobody did. So the honest reading is not "I abandon things" — it is "I abandon experiments cheaply, and I do not abandon systems that people rely on." Side projects die fast; client work lives for the better part of a decade.

I had been writing proposals describing myself with the same generic words everyone uses. Meanwhile the single most documented behavior in my history — provable with timestamps — is that I stay. For a client with a 10-year-old production app, that is worth more than any list of technologies. I just never thought to sell it, because I never saw it.

Run this on yourself

Local repos are not enough — pull your whole GitHub account as bare, blob-less clones. Full commit history, almost no disk (my 137 repos: 77 MB):

mkdir git-archive && cd git-archive
gh repo list YOUR_USER --limit 300 --json name --jq '.[].name' | while read -r name; do
  git clone --bare --filter=blob:none "[email protected]:YOUR_USER/$name.git" "$name.git"
done

Then extract commits from every repo:

for d in */; do
  git -C "$d" log --all --author='[email protected]' \
    --pretty='%ad|%s' --date='format:%Y-%m-%d %H %u' 2>/dev/null
done > all-commits.txt

Two traps that will silently ruin your numbers:

  • You have more identities than you think. Run git log --all --format='%ae' | sort | uniq -c across repos and read the list by hand. I found four: my main email, the GitHub noreply address (2,299 hidden commits), an old employer address — and a typo domain, gmai.com, quietly holding 129 commits. Also check for colleagues with names similar to yours before you grep loosely.
  • Timestamps are local time of the machine that committed. Good enough for patterns, do not over-read single hours.

Then it is just counting: commits per year, per hour, per weekday, first word of each message, days since last commit per repo. Any scripting language does it in 50 lines — or paste the file into an AI assistant and ask for exactly the charts above.

What to actually look for

The charts are fun. The value is in the disagreements:

  • Where does the data contradict your self-description? Mine: "builder" vs. 7,201 fixes; "protects weekends" vs. 25% weekend commits.
  • Which repos refuse to die? The dead ones are noise. The survivors are your real positioning — whatever they have in common is the thing people actually pay you for.
  • Where does your archive start, and why? Mine starts fully five years after my career did. The empty years tell a story too: that work was never mine.
  • What changed and when? Output jumping 50%, night work creeping in, a repo going quiet — the log dates every turning point you lived through without noticing.

Twenty minutes of shell scripting gave me a more honest review of my career than any yearly reflection I ever wrote by hand. You already own the data. It has been recording you the whole time.

Some details are generalized so clients and codebases cannot be identified.

V

Vibol Teav

Software engineer with 13+ years of experience building and deploying Rails applications. Currently focused on Rails security audits, infrastructure, and helping teams ship with confidence.

The most documented behavior in my git history is keeping production systems alive for years. If yours is a Rails app that needs that kind of care:

See Rails Care Plans