@@ -189,11 +189,343 @@ This edition covers what happened during the months of March and April 2025.
189
189
## Community interview
190
190
191
191
_ Editor note: For Git's 20th anniversary, we are doing an exclusive collaborative
192
- community interview and curating answers from various community members. Also,
193
- there's a short Q&A with our zealous, inclusive and tireless maintainer that
194
- follows below._
192
+ community interview and curating answers of various community members. Also,
193
+ there's a [ short Q&A] ( #short-qa-with-our-maintainer-junio-c-hamano ) with our
194
+ zealous, inclusive and tireless maintainer that follows below._
195
+
196
+
197
+ - ** What's your favorite Git trick or workflow that you wish more people
198
+ knew about?**
199
+
200
+ [ _ Thalia Rose_ ] [ thalia ] : For rebase-heavy workflows, ` git range-diff ` is incredibly
201
+ useful. To compare against upstream, use ` git range-diff @{u}...@ ` ,
202
+ and to compare against the previous HEAD, use ` git range-diff @{1}...@ ` .
203
+
204
+ [ _ Lucas Seiki Oshiro_ ] [ seiki ] : Everything related to code archaeology
205
+ (` git grep ` , ` git log -S/-G ` , ` git log -L ` and ` git bisect ` ). Those are
206
+ my primary debugging tools and every time I explained them to other
207
+ people they find them mind-blowing and useful.
208
+ And they also started loving it :-)
209
+
210
+ [ _ Elijah Newren_ ] [ elijah ] : [ ` range-diff ` ] [ range-diff ] . The ideas behind
211
+ it ought to be the basis for code review, IMO. Commits should be the
212
+ unit of review (including commit messages as a fundamental and primary
213
+ thing to be reviewed), and a series of commits should be the unit of
214
+ merging. I dislike most code review tools, because they get one or
215
+ both of those things wrong. Getting both of those things right naturally
216
+ leads to ` range-diff ` or something like it being a very important part
217
+ of the workflow, at a minimum for detecting which commits in a series
218
+ are unmodified and which have been updated and need to be further reviewed.
219
+
220
+
221
+ - ** What was your worst Git disaster, and how did you recover from it?**
222
+
223
+ [ _ Thalia Rose_ ] [ thalia ] : When I was first starting with Git, I wanted to make a repo
224
+ to preserve my first coding project when I was twelve, a bunch of VBS scripts.
225
+ I had assumed that Git maintained file modification timestamps, so I deleted
226
+ the originals because they were now redundant. I now no longer know exactly
227
+ when I wrote them and have been careful about timestamps ever since.
228
+
229
+ [ _ Luca Milanesio_ ] [ luca ] : I suspect to be one of the worst offenders :-) [ [ ref] ( https://www.infoq.com/news/2013/11/use-the-force ) ]
230
+
231
+ Thankfully I was using Gerrit Code Review and the replication plugin:
232
+ the refs were not lost but just rewind and we could reset all the
233
+ correct SHA1s for all of them.
234
+
235
+ [ _ Lucas Seiki Oshiro_ ] [ seiki ] : I don't remember something that I did,
236
+ but I remember a simple and curious disaster: our deploy workflows
237
+ stopped working, only leaving a message like "cannot fetch
238
+ ambiguous reference ` master ` ". I decided to investigate what happened
239
+ and I found out that someone by mistake (I don't know how) created a
240
+ tag called ` master ` and pushed it to GitHub. By the time we used the
241
+ ` master ` branch for deploy, and the workflows didn't know if they
242
+ should use the ` master ` branch or tag. GitHub didn't have a feature
243
+ for deleting tags through the web interface, so we thought
244
+ "what should we do?".
245
+
246
+ The solution was to run ` git push origin :refs/tags/master ` . Simple,
247
+ but not obvious. A classic case where it only required a screw to be
248
+ turned, but all the hard work was to find which screw should be turned.
249
+
250
+ [ _ Elijah Newren_ ] [ elijah ] :
251
+ My worst Git-related disaster wasn't with Git directly but with our
252
+ Git hosting software we used at a prior job, Gerrit. 'twas a
253
+ "startup" that was still forming good practices. We had both a
254
+ production and a staging instance. The staging instance was seeded
255
+ with a copy of production data so we could do scale testing...but that
256
+ seeding process was a multi-step manual thing; it hadn't been
257
+ automated. One step was, as best I recall, "drop database gerrit",
258
+ followed by loading the production copy of the mysql database (this
259
+ was long before [ NoteDB] [ notedb ] arrived). And as many readers
260
+ probably have guessed by now, I was on the wrong host one day when
261
+ I ran that command.
262
+
263
+ The actual git repositories were still intact, but the review metadata
264
+ was toast. Luckily, we had a backup from about 7 hours earlier, so we
265
+ could recover the older review metadata and with some hackery fix the
266
+ mysql metadata mismatch with the newer repository contents. And since
267
+ Gerrit emailed folks comments from reviews as they were posted, we
268
+ could tell people to look at their emails for the pieces we couldn't
269
+ recover.
270
+
271
+ It was a really long night trying to fix things. Some folks told me
272
+ they thought I was going to throw up just looking at me. But I
273
+ learned how wonderful it was to be at a company with blameless
274
+ post-mortems, and I appreciated the many folks who reached out to tell
275
+ me stories of mistakes they had made. They were more interested in
276
+ whether we learned our lesson and put processes into place to prevent
277
+ repeats, and I definitely did both.
278
+
279
+ I did, of course, also get some good-natured ribbing, such as people
280
+ saying I got to play the part of little Bobby Tables once (see
281
+ [ this xkcd comic] [ bobby-tables ] if you don't know that reference).
282
+ I kindly reminded them that I didn't drop a table -- I dropped the whole
283
+ database (plus, it wasn't injection, it was just running a command in
284
+ the wrong location). Also, one of my colleagues helpfully modified
285
+ the prompt on production to be red and bold, "This is PROD Gerrit",
286
+ and the prompt on staging to be green, "This is staging Gerrit; it's
287
+ okay to drop database here!" The prompts ended up not mattering since
288
+ I automated the process, and made sure the process just error'ed out
289
+ if run on prod instead of staging. But the prompt persisted for many
290
+ years anyway, because I thought it was a hilarious way to poke fun at
291
+ my blunder.
292
+
293
+
294
+ - ** If you could go back in time and change one design decision in Git,
295
+ what would it be?**
296
+
297
+ [ _ Luca Milanesio_ ] [ luca ] : Use SHA-256 straight away, as it was
298
+ published 24 years ago and already existed at the time Git was designed.
299
+
300
+ [ _ Lucas Seiki Oshiro_ ] [ seiki ] : Perhaps writing a more abstract CLI. After
301
+ studying Git a little more deeper it makes sense for me, but I would group
302
+ the functionality into more high-level subcommands and would make the flags
303
+ and options more consistent across the subcommands.
304
+
305
+ For example, Docker CLI have all the image operations under
306
+ ` docker image ` and all the network operations under ` docker network ` .
307
+ If I want to delete an image, I use ` docker image rm ` , if I want to
308
+ delete a network, I use ` docker network rm ` , and so on. I would make
309
+ Git CLI work based on that idea, for example:
310
+
311
+ - ` git branch add my_branch `
312
+ - ` git branch delete my_branch `
313
+ - ` git branch list `
314
+ - ` git remote add my_remote ... `
315
+ - ` git remote delete my_remote `
316
+ - ` git remote list `
317
+ - ` git tag add my_tag `
318
+ - ` git tag delete my_tag `
319
+ - ` git tag list `
320
+
321
+ With some shorter alias, just like Docker has ` docker rmi ` and
322
+ ` docker rm ` .
323
+
324
+ [ _ Elijah Newren_ ] [ elijah ] : The index. For a few reasons.
325
+
326
+ 1 . Performance.
327
+ 1 . The index is pervasive throughout the codebase, and while it works
328
+ great for small repositories, it means that many operations are O(size
329
+ of repository) instead of O(size of changes). [ sparse indices] [ sparse-index ]
330
+ help, but the code has to be carefully audited for sparse indices to
331
+ work with each codepath, and even then there tends to be a fallback of
332
+ just-load-everything-anyway because the data structure doesn't lend
333
+ nicely to just expanding a little more.
334
+
335
+ 2 . An under-appreciated aspect of the performance improvements that
336
+ came from our new merge strategy, [ ` merge-ort ` ] [ merge-ort ] , were due
337
+ to dispensing with the index as the primary data structure. The index
338
+ had two problems:
339
+ 1 . first of all it meant loading every path in the repository,
340
+ which would have prevented ort's optimization to avoid recursing into
341
+ subtrees when unnecessary (an optimization that often made merges e.g.
342
+ 50x faster). Sparse indices didn't exist back then, but even if they
343
+ had we would have had to complicate them significantly in order to
344
+ have their sparseness be determined by renames and the intersection of
345
+ modified paths on the two sides of history instead of having
346
+ sparseness determined by user-defined path rules; I think that'd have
347
+ been much more complicated than just dispensing with the index as the
348
+ data structure, but we didn't even have sparse indices back then
349
+ anyway.
350
+
351
+ 2 . Second, the use of the index as done in the old merge strategy,
352
+ ` merge-recursive ` , resulted in O(N^2) behavior since entries (including
353
+ conflicted higher order stages) had to be inserted in sorted order.
354
+ Deleting entries didn't have the same O(N^2) problem due to some
355
+ tricks to queue the deletion for later, but attempting to do the same
356
+ for insertions was far from straightforward and I believe would have
357
+ required making some other data structure primary and then forming the
358
+ index at the end. (Note that the primary data structure used, whatever
359
+ it is, cannot just have a list of things to insert, it also needs to
360
+ be checked for various properties intermingled with insertions...and
361
+ those sometimes relied on the fact that the index was sorted for quick
362
+ lookups.) <br /><br />
363
+ (Note that a tree-structured index rather than a linear index would
364
+ resolve these problems. But retrofitting the entire codebase is
365
+ probably never going to happen...)
366
+
367
+ 2 . Cognitive Complexity. <br />The funny thing is, although I say this,
368
+ I use the index all the time. I use ` git add -p ` a lot. I very much
369
+ need to slice and dice my changes into different commits, and tend to
370
+ have dirty changes that I don't want pushed. <br /> <br />
371
+ But slicing and dicing before things are committed, as opposed to
372
+ being able to slice and dice after, is a choice that adds a lot of
373
+ complexity to the user interface and does so even for users who aren't
374
+ interested in slicing and dicing commits. We don't have a
375
+ sufficiently flexible set of tooling for slicing and dicing commits
376
+ after-the-fact within git to switch to a post-commit-slice-and-dice
377
+ workflow even today, but I suspect that some of the ideas from [ JJ] [ jujutsu ]
378
+ would or could be much better than the methods I use today in git to
379
+ slice and dice commits.
380
+
381
+
382
+ - ** Which Git feature or improvement over the past 20 years do you think
383
+ had the biggest impact on your workflow?**
384
+
385
+ [ _ Lucas Seiki Oshiro_ ] [ seiki ] : Sorry, but I can't answer. I am from a
386
+ generation that started programming when Git was already the de facto
387
+ VCS so I can't compare a world that has it with a world that doesn't have.
388
+
389
+ [ _ Elijah Newren_ ] [ elijah ] : Speed.
390
+
391
+ Being able to instantly switch branches (in smaller repos, sure, but
392
+ CVS and SVN couldn't pull it off even in small repos) was a game
393
+ changer.
394
+
395
+
396
+ - ** What Git problem that existed 10 years ago has been most
397
+ successfully solved?**
398
+
399
+ [ _ Lucas Seiki Oshiro_ ] [ seiki ] : Sorry again, but 10 years ago I was only
400
+ starting to use Git and when I started to use more complex features they
401
+ already were there.
402
+
403
+ [ _ Elijah Newren_ ] [ elijah ] : Merging and rebasing with lots of renames
404
+ (and generally merging without a worktree or index). I'm obviously
405
+ a bit biased on this point, but that doesn't mean I'm wrong. ;-)
406
+ It used to be awful and works great now.
407
+
408
+ Relatedly, merging without a worktree or index was problematic; you
409
+ had to either use an alternative merge strategy with limited
410
+ capabilities, or use something other than git (e.g. [ libgit2] [ libgit2 ] ).
411
+ But now git handles it well with its default merge strategy.
412
+
413
+
414
+ - ** Which Git commands or workflows do you think are still misunderstood
415
+ or underutilized today?**
416
+
417
+ [ _ Lucas Seiki Oshiro_ ] [ seiki ] : I think [ squash merges] [ squash-merge ] and
418
+ [ submodules] [ submodule ] are really misunderstood, yet they are the opposite
419
+ of being underutilized. Sadly I saw several people using them in daily basis,
420
+ based on the wrong idea of what they are and then using them incorrectly.
421
+
422
+
423
+ What I think it is underutilized is the full power of commits of being
424
+ a good source of documentation and good resource for, again, performing
425
+ code archaeology that may help understanding what the code does and
426
+ debugging it. Several developers treat the commits as just checkpoints.
427
+
428
+ [ _ Elijah Newren_ ] [ elijah ] : ` range-diff ` is very under-utilized, but I
429
+ already discussed that above.
430
+
431
+
432
+ - ** What's one Git based project, tool, or extension you think deserves
433
+ more recognition from the community?**
434
+
435
+ [ _ Lucas Seiki Oshiro_ ] [ seiki ] : Perhaps it would be better to leave this
436
+ question for other less known tools. But if you want an answer, I think:
437
+
438
+ - [ Delta] ( https://github.com/dandavison/delta ) is a really cool to
439
+ format the diff-related outputs;
440
+
441
+ - [ Kworkflow] ( https://kworkflow.org/ ) is a powerful tool for
442
+ contributing to the Linux kernel source code (I should also
443
+ try it for contributing to the Git source code);
444
+
445
+ - Merge drivers in general. ` diff3 ` works in most cases but it is
446
+ only based on pure diffs, without performing deeper operations based
447
+ on the file format they are merging.
448
+
449
+
450
+ - ** What Git feature or capability surprised you most when you first
451
+ discovered it?**
452
+
453
+ [ _ Lucas Seiki Oshiro_ ] [ seiki ] : As you may have noticed, I'm really
454
+ a fan of Git archaeology :-), so I would say all that I mentioned
455
+ in the first answer (i.e., ` git grep ` , ` git log -S/-G ` , ` git log -L `
456
+ and ` git bisect ` ). But my favorite is still [ bisect] [ bisect ] .
457
+ It's an egg of Columbus and everyone that I have shown it to
458
+ was equally amazed by it!
459
+
460
+
461
+ - ** What's your boldest prediction about how version control might look
462
+ in another 20 years?**
463
+
464
+ [ _ Lucas Seiki Oshiro_ ] [ seiki ] : I still see Git as the dominant VCS
465
+ in the future, but I think more Git-based VCSs (like [ Jujutsu] [ jujutsu ]
466
+ will arise. Just like we have today programming languages built on top
467
+ of the stack of the other languages (e.g. Clojure, Kotlin and Scala on
468
+ JVM, TypeScript on JS), networking protocols written on top of other
469
+ protocols (e.g. QUIC on UDP, gRPC on HTTP) and so on.
470
+
471
+ The Git core is simple, flexible, transparent and powerful and there's
472
+ still room for people using it directly in several creative ways. Once
473
+ I saw [ a project using it as a backend for a NoSQL database] [ git-backend-nosql ] ,
474
+ who knows how many use cases we still have for it.
475
+
476
+ [ _ Elijah Newren_ ] [ elijah ] : I'm more interested in what storms might be
477
+ brewing along that path, and what we might be able to do to avoid them.
478
+ In particular, some questions and observations in that area:
479
+
480
+ * With monorepos growing ever larger, do we have hard-to-workaround-or-fix
481
+ design decisions that pose scaling challenges? e.g.
482
+ * the index data structure
483
+ * per-directory .gitignore files, per-directory .gitattribute files, etc.
484
+ * ...or do the prominent Git forges have hard-to-workaround-or-fix
485
+ design decisions that'll give Git a reputation for not scaling? e.g.
486
+ * making refs/pull/NNN/merge a public ref and excessively
487
+ implicitly updating it
488
+ * Will we face a crisis of interest? e.g.
489
+ * ` git ` is currently written in C. Even if that's not a liability
490
+ already, coupled with "decades" I think it is. Young developers
491
+ probably don't want to learn C, and older ones who already know C
492
+ may worry about C becoming a Fortran or Cobol.
493
+ * Companies employing Git developers think "git already won" and
494
+ redeploy those engineers on other problems
495
+ * Will the combination of issues above result in folks who want improvements
496
+ deciding their best bet is not improving Git but in creating/funding
497
+ an alternative? Will that snowball?
498
+
499
+ <br />
500
+ To me, the entry of new projects like [ JJ] [ jujutsu ] and [ sapling] [ sapling ]
501
+ suggest the above are real concerns already rather than just theoretical.
502
+ Both projects have compelling things that git lacks. I like the friendly
503
+ competition, and the JJ and sapling developers are awesome to talk to
504
+ at Git Merge conferences. But there is a risk that this friendly
505
+ competition mirrors that of Git and Mercurial from years past, and
506
+ that Git at some future point down the road ends up on the other side
507
+ of that history and gets largely displaced by the alternatives. I'd
508
+ rather not see that happen, but I sometimes wonder if we're taking
509
+ enough measures to avoid marching towards such an outcome.
510
+
511
+
512
+ [ thalia ] : https://discord.com/channels/1042895022950994071/1361310935427584213/1361316878819131452
513
+ [ luca ] :
https://public-inbox.org/git/[email protected] /
514
+ [ seiki ] :
https://public-inbox.org/git/[email protected] /
515
+ [ elijah ] : https://public-inbox.org/git/CABPp-BH2yH4iJ28Bo7Q=uryu68LLk7a0Tvb2SzAbAiHK8QpRug@mail.gmail.com/
516
+ [ squash-merge ] : https://git-scm.com/docs/git-merge#Documentation/git-merge.txt---squash
517
+ [ submodule ] : https://git-scm.com/docs/git-submodule
518
+ [ bisect ] : https://git-scm.com/docs/git-bisect
519
+ [ range-diff ] : https://git-scm.com/docs/git-range-diff
520
+ [ sparse-index ] : https://git-scm.com/docs/sparse-index
521
+ [ merge-ort ] : https://git-scm.com/docs/merge-strategies#Documentation/merge-strategies.txt-ort
522
+ [ jujutsu ] : https://github.com/jj-vcs/jj?tab=readme-ov-file#introduction
523
+ [ git-backend-nosql ] : https://www.kenneth-truyers.net/2016/10/13/git-nosql-database
524
+ [ notedb ] : https://www.gerritcodereview.com/notedb.html
525
+ [ bobby-tables ] : https://xkcd.com/327/
526
+ [ libgit2 ] : https://libgit2.org/
527
+ [ sapling ] : https://sapling-scm.com/
195
528
196
- TODO
197
529
198
530
### Short Q&A with our maintainer, Junio C Hamano
199
531
0 commit comments