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

Re: newbie questions about git design and features (some wrt hg)

From
Jakub Narebski <jnareb@gmail.com>
Date
Jan 30, 2007, 17:44 UTC
Message-ID
<epo03h$2nc$1@sea.gmane.org>
In-Reply-To
<3c6c07c20701300820l42cfc8dbsb80393fc1469f667@mail.gmail.com>

[Cc: git@vger.kernel.org] [Followup-To: git@vger.kernel.org aka gmane.comp.version-control.git]

Mike Coleman wrote:
Show 10 quoted lines
> I recently decided to jump into the DVCS pool, and I've been studying
> what seem to me to be the two leading candidates--git and
> mercurial--to try to understand the differences between them in design
> and features.  I have some questions that I hope you can enlighten me
> on.
> 
> 1.  As of today, is there any real safety concern with either tool's
> repo format?  Is either tool significantly better in this regard?
> (Keith Packard's post hints at a problem here, but doesn't really make
> the case.)
I don't know if Mercurial is safe with respect to interrupting in
the midle of update. Git is safe in that regard; the only unsafe
command is git-prune (and it is explicitely as such marked in
documentation); there were some attempts lately about making it safer.
 
> 2.  Does the git packed object format solve the performance problem
> alluded to in posts from a year or two ago?

If it was I/O performance problem, then packed objects format and to lesser extent (important only if you have large number of tags or branches) packed refs format, should solve it.

See http://git.or.cz/gitwiki/GitBenchmarks (most probably biased).
> 3.  Someone mentioned that git bisect can work between any two
> commits, not necessarily just one that happens to be an ancestor of
> the other.  This sounds really cool.  Can hg's bisect do this, too?

The very idea of git bisect was for it to work with nonlinear history. Otherwise it wouldn't be really necessary.

git-bisect(1) mentions git-rev-list --bisect option, and in description of --bisect in git-rev-list(1) we have:

        Limit output to the one  commit  object  which  is  roughly  halfway
        between the included and excluded commits. Thus, if
                $ git-rev-list --bisect foo ^bar ^baz
        outputs 'midpoint', the output of the two commands
                $ git-rev-list foo ^midpoint
                $ git-rev-list midpoint ^bar ^baz
        would be of roughly the same length. Finding the change which intro-
        duces a regression is thus reduced to a  binary  search:  repeatedly
        generate  and  test  new  'midpoint's  until  the commit chain is of
        length one.

(where "git rev-list foo ^bar" means listing all commits reachable from commit, tag or branch 'foo' which are not reachable from 'bar').

> 4.  What is git's index good for?  I find that I like the idea of it,
> but I'm not sure I could justify it's presence to someone else, as
> opposed to having it hidden in the way that hg's dircache (?) is.  Can
> anyone think of a good scenario where it's a pretty obvious benefit?

Git index is used to stage commits, i.e. create it part by part (create some changes, view diff of those changes, save those changes to index, create some new changes, view diff of new changes, etc.). And it is very useful in resolving merges and merge conflicts (you can view diff only of the conflicted part). Also it makes add / remove operations easier to understand.

It also allows for some tricks like "SCM remove all files
known to SCM, which are missing in working repository", or "make SCM
think that all files are newer when importing from tar file".
 
> 5.  I think I read that there'd been just one incompatible change over
> time in the git repo format.  What was it?
If you are referring to the change that sha-1 used to be of compressed
contents, it was IIRC before first public release.
 
Show 5 quoted lines
> 6.  Does either tool use hard links?  This matters to me because I do
> development on a connected machine and a disconnected machine, using a
> usb drive to rsync between.  (Perhaps there'll be some way to transfer
> changes using git or hg instead of rsync, but I haven't figured that
> out yet.)

Git can use hard links (git clone --local, git relink) but does not need to. If you have hardlinks under version control, git does not checkout them as hardlinks.

Show 5 quoted lines
> 7.  I'm a fan of Python, and I'm really a fan of using high-level
> languages with performance-critical parts in a lower-level language,
> so in that regard, I really like hg's implementation.  If someone
> wanted to do it, is a Python clone of git conceivable?  Is there
> something about it that just requires C?

C is for performance. Git is not libified, and it would be hard to get it fully (or at least most important parts) libified.

Show 6 quoted lines
> 8.  It feels like hg is not really comfortable with parallel
> development over time on different heads within a single repo.
> Rather, it seems that multiple repos are supposed to be used for this.
> Does this lead to any problems?  For example, is it harder or
> different to merge two heads if they're in different repo than if
> they're in the same repo?

In git if you want to merge two heads in different repos, you in fact first download (fetch) the objects from other repo, then merge two local head one of which can be temporary (FETCH_HEAD) although usually we use local branch (so called tracking branch) to always refer to downloaded objects from other repo.

> (I'll probably post this on the hg list as well.)

I'm not sure if Mercurial mailing list is not subscribe-to-post, unfortunately...

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git
Previous: Jakub NarebskiNext: Linus Torvalds
Message 50 of 61 in “newbie questions about git design and features (some wrt hg)”
  1. Mike ColemanJan 30, 2007
  2. Johannes SchindelinJan 30, 2007
  3. Shawn O. PearceJan 30, 2007
  4. Theodore TsoJan 31, 2007
  5. Jakub NarebskiJan 31, 2007
  6. Junio C HamanoJan 31, 2007
  7. Matt MackallJan 31, 2007
  8. Jakub NarebskiJan 31, 2007
  9. Matt MackallFeb 1, 2007
  10. Jakub NarebskiFeb 1, 2007
  11. Simon 'corecode' SchubertFeb 1, 2007
  12. Johannes SchindelinFeb 1, 2007
  13. Simon 'corecode' SchubertFeb 1, 2007
  14. Johannes SchindelinFeb 1, 2007
  15. Linus TorvaldsFeb 1, 2007
  16. Eric WongFeb 1, 2007
  17. Linus TorvaldsFeb 1, 2007
  18. Jakub NarebskiFeb 2, 2007
  19. Simon 'corecode' SchubertFeb 2, 2007
  20. Jakub NarebskiFeb 2, 2007
  21. Shawn O. PearceFeb 2, 2007
  22. Mark WoodingFeb 2, 2007
  23. Jakub NarebskiFeb 2, 2007
  24. Linus TorvaldsFeb 2, 2007
  25. Jakub NarebskiFeb 2, 2007
  26. Linus TorvaldsFeb 2, 2007
  27. Brendan CullyFeb 2, 2007
  28. Jakub NarebskiFeb 2, 2007
  29. Brendan CullyFeb 2, 2007
  30. Giorgos KeramidasFeb 2, 2007
  31. Linus TorvaldsFeb 2, 2007
  32. Giorgos KeramidasFeb 3, 2007
  33. Matthias KestenholzFeb 3, 2007
  34. Linus TorvaldsFeb 3, 2007
  35. Jakub NarebskiFeb 3, 2007
  36. Linus TorvaldsFeb 2, 2007
  37. Brendan CullyFeb 2, 2007
  38. Linus TorvaldsFeb 2, 2007
  39. Brendan CullyFeb 2, 2007
  40. Jakub NarebskiFeb 2, 2007
  41. Linus TorvaldsFeb 2, 2007
  42. Matt MackallFeb 2, 2007
  43. Jakub NarebskiFeb 2, 2007
  44. Matt MackallFeb 2, 2007
  45. Jakub NarebskiFeb 2, 2007
  46. Jakub NarebskiFeb 2, 2007
  47. Brendan CullyFeb 3, 2007
  48. Jakub NarebskiFeb 3, 2007
  49. Jakub NarebskiFeb 3, 2007
  50. Jakub NarebskiJan 30, 2007
  51. Linus TorvaldsJan 30, 2007
  52. Linus TorvaldsJan 30, 2007
  53. Junio C HamanoJan 30, 2007
  54. Mike ColemanJan 31, 2007
  55. Linus TorvaldsJan 31, 2007
  56. Junio C HamanoJan 31, 2007
  57. Linus TorvaldsJan 31, 2007
  58. Johannes SchindelinJan 31, 2007
  59. Mike ColemanJan 31, 2007
  60. Nicolas PitreJan 31, 2007
  61. Mike ColemanJan 31, 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.