git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Git User's Survey 2007 unfinished summary continued

From
Steven Grimm <koreth@midwinter.com>
Date
Oct 14, 2007, 18:12 UTC
Message-ID
<47125BF7.2070503@midwinter.com>
In-Reply-To
<3f4fd2640710140320h5c1e1f7gf9f43a626aaa6897@mail.gmail.com>
Reece Dunn wrote:
> The core plumbing in git is solid. The porcelain, with the 1.5 series,
> makes git simpler to use from the command line. Now, the GUI available
> for git is seriously lacking.
>   

I'm not sure I agree with that. Here's the section on git from the "Comparison with other systems" part of the Mercurial book. I'll reproduce it in its entirety here and add my own comments about each paragraph.

 > Git is a distributed revision control tool that was developed for 
managing the
 > Linux kernel source tree. Like Mercurial, its early design was 
somewhat influenced
 > by Monotone.
No argument there.
 > Git has an overwhelming command set, with version 1.5.0 providing 139
 > individual commands. It has a reputation for being difficult to 
learn. It does not have
 > a user manual, only documentation for individual commands.

The part about the user manual is bunk (and was bunk in version 1.5.0, IIRC, so I'm not sure where he gets that.) But the first part of that is the key here. I admit that's even bitten me from time to time. I couldn't remember the name of the "git-instaweb" command just yesterday; doing "ls /usr/local/bin/git-*" was, I'd have to agree, pretty overwhelming.

We could probably solve that by tucking the plumbing commands away in a lib or libexec directory and only exposing the porcelain commands in the directory the end user is likely to look at.

But that's just an aspect of a more general fact: it's hard to use git without getting exposed to the plumbing at least a little. Another example is the manpages: try to look up the commonly-used options to "git diff" (porcelain) and you will be forced to learn about "git rev-parse" (plumbing).

The point is, though, that this is a valid complaint about git's UI that has nothing to do with GUIs.

 > In terms of performance, git is extremely fast. There are several 
common cases
 > in which it is faster than Mercurial, at least on Linux. However, its 
performance
 > on (and general support for) Windows is, at the time of writing, far 
behind that of
 > Mercurial.

A fair statement, though of course that's been improving by leaps and bounds of late and hopefully will soon be an outdated argument. The Windows user experience has been subpar historically.

 > While a Mercurial repository needs no maintenance, a Git repository 
requires frequent
 > manual “repacks” of its metadata. Without these, performance 
degrades, while space
 > usage grows rapidly. A server that contains many Git repositories 
that are not rigorously
 > and frequently repacked will become heavily disk-bound during 
backups, and there
 > have been instances of daily backups taking far longer than 24 hours 
as a result.
 > A freshly packed Git repository is slightly smaller than a Mercurial 
repository, but an
 > unpacked repository is several orders of magnitude larger.

This was true at the time the hg book was written. Now that we have the auto-packing code, hopefully it will be a moot point. So that's one "fix the UI" complaint that has been addressed; whether *successfully* or not, time will tell. But hg definitely had a user experience advantage here until very recently.

 > The core of Git is written in C. Many Git commands are implemented as 
shell or Perl
 > scripts, and the quality of these scripts varies widely. I have 
encountered a number of
 > instances where scripts charged along blindly in the presence of 
errors that should have
 > been fatal.

No doubt this is true as well. Obviously the C-ification process will take care of a lot of this, though of course one can charge along blindly in the presence of errors in any language (including, shock of shocks given the implication here, Python.) To the extent we can find places where this is still true, obviously they should be fixed. I wonder if anyone knows the author of the book well enough to ferret some specifics out of him toward that end.

Now, about hg vs. git in general. I actually spent some time this weekend coming up to speed on hg basics just to see what all the UI fuss was about. As far as I can see it is about a wash all told; some things are easier in git and some in hg. However, here's my speculation about why people might claim hg is easier. I see three things:

Multiple branches per repo. Mercurial allows them, but you won't find them mentioned anywhere in any of the beginner tutorials. They encourage people to use a "one repo per branch" model. Having gotten used to git's branching model, you'd have to pry that feature out of my cold, dead fingers, but it's fundamentally much easier to understand a model of "if you want to make two unrelated changes to your code, just make two copies of the source tree." It's possible git's introductory documentation should delay talking about "git branch" until later, and start off talking about how to work with one (checked out) branch per repo.

Update to a dirty working copy. I think there's a tendency in these parts to vastly underestimate the importance of being able to pull down updates from a master repository while you're in the middle of development. Mercurial's equivalent to bare "git pull", namely "hg pull" followed by "hg update", works fine if you have edits in your working copy; if there are conflicting changes, it pops you into a conflict resolution UI (or adds conflict markers, depending on your settings) and you continue on your merry way after resolving everything. This workflow is really common, especially in corporate settings where there's very fine-grained collaboration going on during initial development (a huge difference from the open-source world where most of the time it's just one person doing an initial prototype.) Right now working this way is a pain in git. Less so now that we have "git stash", but it could still be much, much smoother.

Verbosity. IMO Mercurial swings too far in this direction, but in general it's either completely silent or very terse in its output. There is never, as far as I can see, any low-level diagnostic information spit out to the user unless an hg command is run with a "verbose" option. Here's "hg pull; hg update", for example (and "pull" is one of hg's chattier commands):

pulling from ../child1 searching for changes adding changesets adding manifests adding file changes added 8 changesets with 8 changes to 3 files (+1 heads) (run 'hg heads' to see heads, 'hg merge' to merge) 3 files updated, 0 files merged, 0 files removed, 0 files unresolved

Compare with the equivalent "git pull" and put yourself in the shoes of a user who is running that command for the first time:

remote: Generating pack...
remote: Counting objects: 9
remote: Done counting 1118 objects.
Result has 832 objects.
remote: Deltifying 822 objects...
remote: 100% (822/822) done
Indexing 832 objects...
remote: Total 832 (delta 668), reused 0 (delta 0)
100% (832/832) done
Resolving 668 deltas...
100% (668/668) done
258 objects were added to complete this thin pack.
* refs/remotes/origin/session-fix: fast forward to branch 'session-fix' 
of ssh://devrs005/~/www
old..new: 3de27db..a3d44c1
Already up-to-date.

So anyway, there are a few specifics. That's based on just a bit of playing around with hg; maybe the differences go deeper than this, but I think there isn't a huge usability gap between the two systems any more.

-Steve
Previous: Reece DunnNext: J. Bruce Fields
Message 20 of 161 in “Re: Git User's Survey 2007 unfinished summary continued”
  1. Jakub NarebskiOct 8, 2007
  2. Git User's Survey 2007 unfinished summary continuedJakub Narebski, Oct 12, 2007
  3. Frank LichtenheldOct 12, 2007
  4. Johannes SchindelinOct 13, 2007
  5. J. Bruce FieldsOct 13, 2007
  6. Shawn O. PearceOct 13, 2007
  7. Frank LichtenheldOct 13, 2007
  8. Johannes SchindelinOct 13, 2007
  9. Andreas EricssonOct 13, 2007
  10. David KastrupOct 13, 2007
  11. J. Bruce FieldsOct 13, 2007
  12. David KastrupOct 13, 2007
  13. Johannes SchindelinOct 14, 2007
  14. Linus TorvaldsOct 14, 2007
  15. Shawn O. PearceOct 14, 2007
  16. Linus TorvaldsOct 14, 2007
  17. david@lang.hmOct 14, 2007
  18. Linus TorvaldsOct 14, 2007
  19. Reece DunnOct 14, 2007
  20. Steven GrimmOct 14, 2007
  21. J. Bruce FieldsOct 14, 2007
  22. Steven GrimmOct 14, 2007
  23. Andreas EricssonOct 14, 2007
  24. Johannes SchindelinOct 14, 2007
  25. Andreas EricssonOct 14, 2007
  26. J. Bruce FieldsOct 14, 2007
  27. Nicolas PitreOct 14, 2007
  28. Shawn O. PearceOct 15, 2007
  29. Nicolas PitreOct 16, 2007
  30. Johannes SchindelinOct 16, 2007
  31. Johannes SchindelinOct 14, 2007
  32. Andreas EricssonOct 14, 2007
  33. David KastrupOct 14, 2007
  34. Jakub NarebskiOct 14, 2007
  35. Johannes SchindelinOct 14, 2007
  36. David KastrupOct 14, 2007
  37. David KastrupOct 14, 2007
  38. Jakub NarebskiOct 14, 2007
  39. Matthew AndrewsOct 14, 2007
  40. David KastrupOct 14, 2007
  41. David TweedOct 14, 2007
  42. Federico Mena QuinteroOct 19, 2007
  43. Jakub NarebskiOct 19, 2007
  44. Johannes SchindelinOct 19, 2007
  45. Federico Mena QuinteroOct 22, 2007
  46. Andreas EricssonOct 20, 2007
  47. Steffen ProhaskaOct 20, 2007
  48. Andreas EricssonOct 20, 2007
  49. Dmitry PotapovOct 21, 2007
  50. Jakub NarebskiOct 20, 2007
  51. Johannes SchindelinOct 20, 2007
  52. Andreas EricssonOct 21, 2007
  53. Johannes SchindelinOct 21, 2007
  54. Andreas EricssonOct 22, 2007
  55. best git practices, was Re: Git User's Survey 2007 unfinished summary continuedJohannes Schindelin, Oct 22, 2007
  56. Andreas EricssonOct 22, 2007
  57. Johannes SchindelinOct 22, 2007
  58. Andreas EricssonOct 22, 2007
  59. Johannes SchindelinOct 22, 2007
  60. Andreas EricssonOct 22, 2007
  61. Steffen ProhaskaOct 22, 2007
  62. Federico Mena QuinteroOct 22, 2007
  63. Johannes SchindelinOct 22, 2007
  64. Carl WorthOct 25, 2007
  65. Jakub NarebskiOct 22, 2007
  66. Steffen ProhaskaOct 23, 2007
  67. Johannes SchindelinOct 23, 2007
  68. Steffen ProhaskaOct 24, 2007
  69. J. Bruce FieldsOct 24, 2007
  70. Andreas EricssonOct 24, 2007
  71. J. Bruce FieldsOct 24, 2007
  72. Steffen ProhaskaOct 24, 2007
  73. J. Bruce FieldsOct 24, 2007
  74. Andreas EricssonOct 24, 2007
  75. J. Bruce FieldsOct 24, 2007
  76. Peter BaumannOct 24, 2007
  77. Steffen ProhaskaOct 24, 2007
  78. Johannes SchindelinOct 24, 2007
  79. Steffen ProhaskaOct 24, 2007
  80. J. Bruce FieldsOct 24, 2007
  81. Steffen ProhaskaOct 24, 2007
  82. Johannes SchindelinOct 24, 2007
  83. Steffen ProhaskaOct 25, 2007
  84. Johannes SchindelinOct 25, 2007
  85. Steffen ProhaskaOct 25, 2007
  86. Andreas EricssonOct 25, 2007
  87. Peter BaumannOct 25, 2007
  88. Andreas EricssonOct 25, 2007
  89. Steffen ProhaskaOct 25, 2007
  90. Johannes SchindelinOct 25, 2007
  91. Andreas EricssonOct 25, 2007
  92. Steffen ProhaskaOct 25, 2007
  93. Johannes SchindelinOct 25, 2007
  94. Theodore TsoOct 25, 2007
  95. Andreas EricssonOct 25, 2007
  96. Theodore TsoOct 25, 2007
  97. Andreas EricssonOct 25, 2007
  98. Junio C HamanoOct 25, 2007
  99. Andreas EricssonOct 25, 2007
  100. Steffen ProhaskaOct 26, 2007
  101. Andreas EricssonOct 26, 2007
  102. Federico Mena QuinteroOct 25, 2007
  103. Mike HommeyOct 25, 2007
  104. J. Bruce FieldsOct 25, 2007
  105. Theodore TsoOct 25, 2007
  106. Andreas EricssonOct 25, 2007
  107. David KastrupOct 26, 2007
  108. Federico Mena QuinteroOct 25, 2007
  109. J. Bruce FieldsOct 25, 2007
  110. Federico Mena QuinteroOct 25, 2007
  111. J. Bruce FieldsOct 25, 2007
  112. Andreas EricssonOct 25, 2007
  113. J. Bruce FieldsOct 25, 2007
  114. David KastrupOct 26, 2007
  115. Make rebase smarterSteven Walter, Oct 26, 2007
  116. Andreas EricssonOct 26, 2007
  117. Johannes SchindelinOct 26, 2007
  118. Junio C HamanoOct 26, 2007
  119. Johannes SchindelinOct 26, 2007
  120. Junio C HamanoOct 26, 2007
  121. Andreas EricssonOct 24, 2007
  122. Johannes SchindelinOct 24, 2007
  123. Andreas EricssonOct 25, 2007
  124. Johannes SchindelinOct 25, 2007
  125. Andreas EricssonOct 25, 2007
  126. Johannes SchindelinOct 25, 2007
  127. Andreas EricssonOct 25, 2007
  128. Karl HasselströmOct 25, 2007
  129. Andreas EricssonOct 25, 2007
  130. Peter BaumannOct 25, 2007
  131. Steffen ProhaskaOct 24, 2007
  132. Andreas EricssonOct 24, 2007
  133. Jakub NarebskiOct 24, 2007
  134. Andreas EricssonOct 25, 2007
  135. Johannes SchindelinOct 25, 2007
  136. Steffen ProhaskaOct 25, 2007
  137. Federico Mena QuinteroOct 25, 2007
  138. Andreas EricssonOct 23, 2007
  139. Daniel BarkalowOct 22, 2007
  140. Wincent ColaiutaOct 22, 2007
  141. David SymondsOct 22, 2007
  142. Johannes SchindelinOct 22, 2007
  143. Robin RosenbergOct 22, 2007
  144. Alex RiesenOct 23, 2007
  145. Nguyen Thai Ngoc DuyOct 22, 2007
  146. Federico Mena QuinteroOct 22, 2007
  147. Jakub NarebskiOct 24, 2007
  148. Karl HasselströmOct 24, 2007
  149. Jakub NarebskiOct 24, 2007
  150. Karl HasselströmOct 24, 2007
  151. Jakub NarebskiOct 24, 2007
  152. Karl HasselströmOct 25, 2007
  153. Catalin MarinasOct 24, 2007
  154. Jakub NarebskiOct 22, 2007
  155. Johannes SchindelinOct 22, 2007
  156. Andreas EricssonOct 22, 2007
  157. Federico Mena QuinteroOct 22, 2007
  158. Jakub NarebskiOct 22, 2007
  159. Steven GrimmOct 22, 2007
  160. J. Bruce FieldsOct 21, 2007
  161. Shawn O. PearceOct 13, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.