惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
T
Threat Research - Cisco Blogs
美团技术团队
IT之家
IT之家
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
Engineering at Meta
Engineering at Meta
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
G
Google Developers Blog
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News
The Register - Security
The Register - Security
Cyberwarzone
Cyberwarzone
F
Fortinet All Blogs
L
LINUX DO - 热门话题
C
Check Point Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Know Your Adversary
Know Your Adversary
S
Security Affairs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Webroot Blog
Webroot Blog
V2EX - 技术
V2EX - 技术
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Martin Fowler
Martin Fowler
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
I
InfoQ
Cisco Talos Blog
Cisco Talos Blog
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
T
The Exploit Database - CXSecurity.com
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
L
Lohrmann on Cybersecurity
T
Threatpost
腾讯CDC
Security Latest
Security Latest
K
Kaspersky official blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Stack Overflow Blog
Stack Overflow Blog
Help Net Security
Help Net Security
Forbes - Security
Forbes - Security

Graphite blog

Introducing Code Tours: a new way to review Introducing Cursor Cloud Agents in Graphite Building the future of software development with Cursor Reimagining the PR Page: Designing for speed and focus Graphite changelog [11-20-2025] Graphite changelog [11-04-2025] Graphite changelog [10-16-2025] The future of engineering is collaborative (and already here) Meet Graphite Agent: the next evolution of AI code review Introducing frozen branches: A safer way to build on your teammates’ work Graphite changelog [09-17-2025] How we sped up code search for Graphite Chat Introducing Graphite Chat AI is writing code—here's why it also needs to review that code How I got Claude to write code I could actually ship How we built the first stack-aware merge queue (and why it matters) How we organize our monorepo to ship fast Graphite brings stacking to Tower Code review tooling: Should you build or buy? Making AI code review available to everyone Introducing: The new Graphite + Linear integration Graphite raises $52M and launches Diamond to reimagine code review for the age of AI Why AI will never replace human code review How stacked PRs unblock distributed development teams Graphite is going to Developer Week 2025 Beating the end of year code freeze How Graphite’s eng team ships code remarkably fast Why we chose Anthropic's Claude to power Graphite Reviewer AI code generation will remain fragmented How we redesigned Graphite's landing page in-house Introducing Graphite Reviewer: your AI code review companion How AI code review reduces review cycles to improve developer productivity What if you could get instant feedback on your code? The new developer toolchain Not Rocket Science - How Bors and Google’s TAP inspired modern merge queues Graphite's State of code review 2024 How Google migrated billions of lines of code from Perforce to Piper Going from 0 to 1: How to write better unit tests when there are none Speed up your merges: Parallel CI is now generally available for teams using Graphite’s merge queue Down for less than four minutes a month: how AWS deploys code Graphite is now free for startups and open source projects Launch week wrap-up (May 2024) Reduce CI costs for Buildkite and GitHub Actions Cheaper CI & faster merging with batching How Google does code review The technical learning curve at a startup is gentler than you might think Graphite will now automatically rebase your partially-merged stacks Multiple engineers can now seamlessly collaborate on the same stack of PRs Do you ever outgrow GitHub? From the 80's to 2024 - how CI tests were invented and optimized Graphite changelog [4/10/2024] 🎺 Graphite changelog [4/25/2024] 🐸 How Stack Overflow replaced Experts Exchange How GitHub monopolized code hosting Graphite changelog [3/27/2024] 🤝 The core principles of building a good AI feature Onboarding roulette: deleting our employee accounts daily Graphite changelog [3/13/2024] 🚁 Why Facebook doesn’t use Git How to recreate the Phabricator code review workflow Types of code reviews: Improve performance, velocity, and quality What's the best GitHub pull request merge strategy? Phabricator vs GitHub vs Graphite: How do they stack up? Improving team velocity through better pull request practices Moving fast breaks things: the importance of a staging environment Building trust as a software engineer Keeping code simple: moving fast by avoiding over-engineering What's better than GitHub pull request filters? The Graphite pull request inbox 7 Best Phabricator alternatives for PR stacking + code review [2024] Accurate eng estimations: predicting and negotiating the future Tracking and understanding GitHub PR stats: A step-by-step guide 8 pull request best practices for optimal engineering What’s next for Graphite Graphite Q1 Launch week: Stacking with the tools you love Graphite Q1 Launch week: Making stacking seamless Accelerating code review The Mom Test How to use stacked PRs to unblock your entire team Graphite Q1 launch week 2024 The practical and philosophical problems with AI code review Empirically sup code review best practices Call site attribution: how to pinpoint rogue SQL queries throttling your performance Every engineer should understand git reflog Post mortem: we took 124 seconds from you, here's 378 back Your GitHub pull request workflow is slowing everyone down Optimizing CI/CD workflows for trunk-based development Why we use AWS instead of Vercel to host our Next.js app How large pull requests slow down development 3 key lessons in application server optimization Trunk-based development: why you should stop using feature branches Git was built in 5 days Why large companies and fast-moving startups are banning merge commits How long should your CI take? Experimenting with AI code review CRA to AppRouter in 5 Steps: A case study with Graphite Graphite Changelog [10/18/2023] The comprehensive guide to writing the best PR title of all time How 10,000 Developers All Contribute to the same Repo
BitKeeper, Linux, and licensing disputes: How Linus wrote Git in 14 days
Nicholas Yan · 2024-05-23 · via Graphite blog

On April 3rd, 2005, Linus cut a Linux kernel release candidate, 2.6.12-rc2. The release candidate itself wasn’t too interesting — in Linus’s words "The diffstat output tells the story: this is a lot of very small changes, ie tons of small cleanups and bug fixes.” — but would become significant for what it marked: the last non-Git release of the Linux kernel.

BitKeeper

For the first ten years of development, prior to its usage of BitKeeper, the Linux Kernel version control tool of choice had just been Linus himself. The system worked like this: developers would submit tarballs and patches to a handful of Linsus’s trusted lieutenants. After vetting, the patches that passed review would then be sent up to Linus. Finally, Linus himself would incorporate them manually into his own source tree, and then cut the release.

Of course, Linus-as-a-version-control-service was far from a perfect product. In 1998, when Larry McVoy first sketched out the idea behind BitKeeper on the Linux Kernel Mailing List, he wrote "It's clear that our fearless leader [Linus] is, at the moment, a bit overloaded so patches may be getting lost

While this manual workflow seems barbaric to us today, at the time, Linus viewed this workflow as superior to the alternatives — namely CVS. Much later, when Linus gave a talk at Google in 2007 about Git, he mentioned one of his core design principles: “WWCVSND” or “What Would CVS Not Do?” Of course this hatred naturally extended to SVN as well; in the same talk, he’d go on to say with a smile “If there are any Subversion users in the audience, you might want to leave. My hatred of CVS has meant that I see Subversion as being the most pointless project ever started. The whole slogan for Subversion for a while was CVS done right or something like that. And if you start with that slogan, there’s no where you can go. It’s like, there’s no way to do CVS right.”

The heart of Linus’s criticism against CVS was its centralized nature. Given the hundreds of Linux developers out there, Linus felt it was critical that each of them have their own discrete copy of the repository that they could develop their own branches on. This both eased offline work and helped with internal politics; each developer was free to commit whatever they’d like to their own repository, and then would have the opportunity to convince the community that their changes were valuable. This prevented a single set of contributors with commit access from gatekeeping the sole repository.

BitKeeper stood in sharp contrast to CVS. In the aforementioned 1998 pitch for BitKeeper, Larry McVoy sketched out a system that, while reminiscent of how we think about source control today, was radically different for the time. McVoy wrote:

The mechanism which allows all this to happen is a distributed source

management system.

The main features of the system are:

- everybody gets a repository (contrast against the one repository

model of CVS)

- changes can be mailed around as "super-patches", also know as

change sets. A change set is just a patch file that contains

* All the changes broken up into one revision at a time

* An identifier that shows where the patch should be applied

in the tree (patches will fail if you aren't as up to date

as the sender of the patch)

* All the revision history for the changes

* Metadata such as pathname changes, symbolic tags

(like alpha2 or linux-2.1.133), etc.

- a new concept called a line of development (LOD).

It's logically a branch but it doesn't need to be on a branch.

Patches can (and will) be their own LOD. You can perform

operations on a LOD like "apply this to the trunk".

Later, Linus would give great credit to BitKeeper for changing his view and inspiring Git: “BitKeeper was not only the first source control system that I ever felt was worth using at all, it was also the source control system that taught me why there's a point to them and how you actually can do things. So Git in many ways, even though from a technical angle it is very, very different from BitKeeper, which was another design goal because I wanted to make it clear that it wasn't a BitKeeper clone, a lot of the flows we use with Git come directly from the flows we learned from BitKeeper.” (The phrasing here is a little awkward because it comes from the aforementioned live Google talk.)

Licensing

While Linus himself held BitKeeper in high regard, his decision to use the tool internally for Linux in 2002 led to massive flame wars on the Linux Kernel Mailing List.

Why the flames? When Larry McVoy had built BitKeeper, he did it as part of a commercial, closed-source endeavor (BitMover). Though folks were able to use BitKeeper’s free community version, this came with a restrictive license.

From the BitKeeper Wikipedia entry: “The license for the ‘community’ version of BitKeeper had allowed for developers to use the tool at no cost for open source or free software projects, provided those developers did not participate in the development of a competing tool (such as Concurrent Versions System, GNU arch, Subversion or ClearCase) for the duration of their usage of BitKeeper plus one year. This restriction applied regardless of whether the competing tool was free or proprietary.”

Even Richard Stallman, last of the true hackers and free software evangelist, chimed in: "The spirit of the Bitkeeper license is the spirit of the whip hand. It is the spirit that says, ‘You have no right to use Bitkeeper, only temporary privileges that we can revoke. Be grateful that we allow you to use Bitkeeper. Be grateful, and don't do anything we dislike, or we may revoke those privileges.’ … Outrage at this spirit is the reason for the free software movement.”

But Linus took a far more pragmatic view; from his perspective, he just wanted the best tool for the job, regardless of where it came from. In 2007 he’d say, “And I was happy with [the BitKeeper arrangement despite the license] because, quite frankly, as far as I'm concerned I do open source because I think it's the only right way to do software. But at the same time, I'll use the best tool for the job and, quite frankly, BitKeeper was it.”

The uneasy marriage wasn’t to last, however.

In 2005, one of the Linux Kernel developers, Andrew Tridgell, forced the issue when he violated the license and reverse-engineered BitKeeper so that he “could pull stuff out of BK trees without agreeing to the BK license.” From Tridgell’s perspective, this was completely ethical; “I did not use BitKeeper at all in writing this tool and thus was never subject to the BitKeeper license.”

Larry McVoy disagreed. And initially, Linus was on his side:

“Larry is perfectly fine with somebody writing a free replacement. ... What Larry is not fine with, is somebody writing a free replacement by just reverse-engineering what he did. Larry has a very clear moral standpoint: ‘You can compete with me, but you can’t do so by riding on my coat-tails. Solve the problems on your own, and compete honestly. Don’t compete by looking at my solution.’ And that is what the BK license boils down to. It says: ‘get off my coat-tails, you free-loader.’ And I [Linus] can’t really argue against that.”

For his part, Linus tried for three months to play peacemaker. (And, if anything, his future comments indeed seemed to hint at more frustration with Andrew than Larry.) But ultimately there was no way of reconciling those differences.

On April 6, 2005, Linus emailed the Linux Kernel Mailing List, subject line “Kernel SCM saga…”, beginning the chain of events that would change an industry:

“Ok, as a number of people are already aware, we've been trying to work out a conflict over BK usage over the last month or two (and it feels like longer ;). That hasn't been working out, and as a result, the kernel team is looking at alternatives.”

He joked about the history — “It's not like my choice of BK has been entirely conflict-free (’No, really? Do tell! Oh, you mean the gigabytes upon gigabytes of flames we had?’)” — and stressed his continued gratefulness to the BitKeeper team.

Despite the outcome Linus looked back on the time with clear fondness:

In fact, one impact BK has had is to very fundamentally make us (and me in particular) change how we do things. That ranges from the fine-grained changeset tracking to just how I ended up trusting submaintainers with much bigger things, and not having to work on a patch-by-patch basis any more. So the three years with BK are definitely not wasted: I'm convinced it caused us to do things in better ways, and one of the things I'm looking at is to make sure that those things continue to work.

So I just wanted to say that I'm personally very happy with BK [BitKeeper], and with Larry. It didn't work out, but it sure as hell made a big difference to kernel development. And we'll work out the temporary problem of having to figure out a set of tools to allow us to continue to do the things that BK allowed us to do.

Linus goes on vacation

In reality, while he posted the public breakup news to the mailing list on April 6th, Linus had already been hard at work. Three days prior, right after the release of 2.6.12-rc2, he had halted his work on the Linux kernel and switched his full focus to finding an alternative to BitKeeper.

Linus’s goal was to have “something usable in two weeks.” As part of that April 6th email, he announced "I'm going to be effectively off-line for a week (think of it as a normal "Linus went on a vacation" event) and I'm just asking that people who continue to maintain BK trees at least try to also make sure that they can send me the result as (individual) patches, since I'll eventually have to merge some other way.”

Linus’s emails conveyed a clear sense of the urgency; after all, the next Linux kernel release was blocked until he could figure this out.

In an email on April 7th he even noted that in the worst case scenario, the Linux Kernel might even move to a centralized version control system: "NOTE! I detest the centralized SCM model, but if push comes to shove, and we just can't get a reasonable parallel merge thing going in the short timeframe (ie month or two), I'll use something like SVN on a trusted site with just a few committers, and at least try to distribute the merging out over a few people rather than making me be the throttle.”

While the outcome is clear to us in retrospect, at the time, the emails show that writing a custom version control system was far from a given. Out of the 205 emails in the chain that spanned from the first email on April 6th to the last on April 12th, there was much discussion of other open-source alternatives — Monotone, GNU arch, Bazaar-ng, Darcs — with some of these tools’ creators jumping in to advocate for their project.

(Even the Subversion developers chimed in with their post "Please Stop Bugging Linus Torvalds About Subversion.”)

The main consideration, especially from Linus, seemed to be overall performance of each of these tools. All in all, out of all 205 emails, there was a lot of talk of performance and efficiency of the various tools.

The biggest question on everyone’s mind seemed to be: would any of the existing tools work for a project the size of the Linux kernel?

On April 8th, two days after his initial email and five days after he started work in earnest, Linus shared an update: “In the meantime (and because monotone really is that slow), here's a quick challenge for you, and any crazy hacker out there: if you want to play with something really nasty (but also very very fast), take a look at kernel.org:/pub/linux/kernel/people/torvalds/.”

Git was born.

The first lines of Git

When we hear about Linus writing the original Git in two weeks, it’s worth adding a large caveat: when we think of git today, we think of the user-facing commands and the overall workflow but at the time, the goals — and mandate — were much different and far more limited in scope.

As different folks debated the merits of various tools and approaches on the email list, one person wrote, describing roughly what was needed: “It is ok to be a little slow so long as it is not pathetically slow. The purpose of the interim solution is just to get the patch flow process back online.”

Linus’s original Git was far more of a content-addressable file system than a fully-fledged source-control management system. Here’s his explanation from another email:

(*) I call this "commit", but it's really something much simpler. It's really just a "I now have <this directory state>, I got here from <collection of previous directory states> and the reason was <reason>".

That, btw, is kind of the design. "git" really doesn't care about things like merges. You can use any SCM to do a merge. What "git" does is track directory state (and how you got to that state), and nothing else. It doesn't merge, it doesn't really do a whole lot of anything.

So when you "pull" or "push" on a Git archive, you get the "union" of all directory states in the destination. The HEAD thing is one pointer into the "sea of directory states", but you really have to use something else to merge two directory states together.

When there was discussion of a cherry-picking workflow and moving around commits in the email thread, Linus outscoped this from the client he was building.

All in all, Linus would comment "'Git' is really trivial, written in four days. Most of that was not actually spent coding, but thinking about the data structures.”

It’s a sentiment that he’d later echo again and again and is sometimes taken out of context but rings true — the data structure choice at the time was the novel part of the code Linus had written. After Linus shared his first few commits, there was no discussion of workflow (what most comes to mind when thinking about Git today). Instead most discussion centered around the architecture we now take for granted: Git’s direct interfacing with the filesystem and its hash-based approach to tell which files had changed (and ensure data integrity).

A minority contingent advocated for using SQL to store the changes. In classic Linus fashion, here’s one exchange about the latter:

> Why not to use sql as backend instead of the tree of directories?

Because it sucks?

I can come up with millions of ways to slow things down on my own. Please come up with ways to speed things up instead.

Linus

But there were also a few who saw the vision and were eager to start work on Git. The same day that Linus asked folks to check out the changes in his directory, a few folks sent back scripts that built additional functionality on top of his foundation.

Two weeks after he had started, on April 17 2005, Linus emailed the email list: “First ever real kernel Git merge!”


Glimpses of the future

The most satisfying part about reading through the initial email chain nearly twenty years after all of these events transpired is seeing the hints of the future, unknown to the authors at the time.

In evaluating one of the proposed source control alternatives, “monotone,” a user wrote:

One slightly annoying thing is that monotone doesn't appear to have a web interface. I used to use the bk one a lot when tracking down bugs, because it was really fast to have a web browser window open and click through the revisions of a file reading checkin comments, etc. Does anyone know if one is being worked on?

At the time, web UIs for source control and code review were just becoming popular; at Google, Guido van Rossum was building their first dedicated piece of code review tooling on the web in Mondrian. And, two years after this email thread, GitHub would be founded.

There’s also an irony in all of the back-and-forth about performance in the email chain.

A brief side discussion expressing concern with how Git might perform if backed by a network-based file system has been flipped on its head in the present day; for giants like Google (FUSE) and Meta (EdenFS), these network-based, source-control-aware file systems are a critical part of how they continue to scale source control and builds in their massive monorepos.

And the core concern at the time that had inspired Linus to write Git in the first place — that none of the existing revision control alternatives would be performant enough to support the large history and commit throughput of the Linux kernel repo?

That would replay itself just a few years later when Meta would migrate its main repo off of Git itself for just the same reason.

Of course, at the time, all of this was unknown to the various folks participating in the original “Kernel SCM saga…” email chain.

Git was created as a tool to unblock future Linux kernel releases — not intended as a global reinvention of all source code management; Linus’s comments highlight that he explicitly saw source code management as the domain of other tools that would then interface with Git.

When we think of history, we often romanticize it as being born of a sudden stroke of inspiration. But the creation of Git shows the far harsher reality of invention: a slowly escalating disagreement over a license; the need for a scrappy backup solution to unblock work; and then continued polishing and iteration through years and years, led not by the inventor, but rather a community.

Epilogue

Eventually BitMover did open-source BitKeeper. Tying a bow on the whole situation, an HN commenter (Bryan Cantrill, now the CTO of Oxide) left a fantastic comment when BitMover made the announcement in 2016:

“The grand irony is that Larry was one of the earliest advocates of open sourcing the operating system at Sun[1] -- and believed that by the time Sun finally collectively figured it out and made it happen (in 2005), it was a decade or more too late.[2] So on the one hand, you can view the story of BitKeeper with respect to open source as almost Greek in its tragic scope: every reason that Larry outlined for "sourceware"[3] for Sun applied just as much to BK as it did to SunOS -- with even the same technologist (Torvalds) leading the open source alternative! And you can say to BK and Larry now that it's "too late", just as Larry told Sun in 2005, but I also think this represents a forced dichotomy of "winners" and "losers." To the contrary, I would like to believe that the ongoing innovation in the illumos communities (SmartOS, OmniOS, etc.) proves that it's never too late to open source software -- that open source communities (like cities) can be small yet vibrant, serving a critical role to their constituencies. In an alternate universe, might we be running BK on SunOS instead of Git on Linux? Sure -- but being able to run an open source BK on an open source illumos is also pretty great; the future of two innovative systems has been assured, even if it took a little longer than everyone might like.”

A response was posted by another HN user "luckydude" — Larry McVoy himself.

"Yeah this irony is not lost on me. But in both cases, the companies acted in self interest. Neither had the guts to walk away from their existing revenue stream. It's hard to say what would have happened.

It's been an interesting ride and if nothing else, BK was the inspiration for Git and Hg, that's a contribution to the field."