Git

Difference between version 32 and 33 - Previous - Next
'''[http://git-scm.com%|%git]''' is a ''Fast Distributed Version Control System'' (DVCS).

''I wish I understood git better, but in spite of your help, I still don't have a proper understanding, so this may take a while.''

<<inlinehtml>>
<div style="text-indent: 4em">
<<inlinehtml>>
-- [Brian Kernighan], [https://github.com/onetrueawk/awk/commit/9ebe940cf3c652b0e373634d2aa4a00b8395b636%|%Awk Unicode announcement] {2022 05 25}
<<inlinehtml>>
</div>
<<inlinehtml>>


** See Also **

   [git timestamps]:   [RJM] 2010-10-05: A page regarding an attempt to allow timestamp preservation of files



** Criticism **

   ''I don't think trying to understand any other VCS in terms of git is a good idea.  Git is so horribly unintuitive and dependent on its internal data structure model that it's a losing proposition.'':   - mst, on git and [fossil], [Tcl Chatroom], 2013-12-15



** Critique **

   [https://sqlite.org/whynotgit.html%|%Why SQLite Does Not Use Git]:   

   [https://stevebennett.me/2012/02/24/10-things-i-hate-about-git/%|%10 things I hate about Git], Steve Bennett, 2012-02-24:   The most damning point is number 7, '''Unsafe Version Control'''.  A bad actor can irrevocably destroy the contents of a repository.   [Fossil] doesn't have this hole.



** Lore **

   [https://www.linuxjournal.com/content/git-origin-story%|%A Git Origin Story] {Zack Brown} {2018 07 27}:   How and why git came to be.



** Packages **

   [lg2]:   Tcl bindings to the https://libgit2.org%|%libgit2%|% library.



** Tools **

   [gitk]:   a history visualization tool written in Tcl/Tk.

   [http://core.tcl.tk/akupries/fossil2git/home%|%fossil2git]:   Support scripts to maintain a system for mirroring a set of [fossil] repositories to one or more git repositories. 

   [https://github.com/AngryLawyer/mug%|%mug]:   A [Teacup] workalike that can download git repositories.



** Description **

Git is a distributed version control system created by [Linus Torvalds] over
the course of a few weeks for developing the [Linux] kernel after [Larry McVoy]
revoked the custom license for [BitKeeper] for the project in response to an
attempt by [Andrew Tridgell] to reverse-engineer the BitKeeper network
protocols. It uses the filesystem as its database, and outperforms every other
distributed version control system in terms of speed.

In git, a branch is named a sequence change sets.  Each change set is
represented by a '''commit object''' that references the parent commit(s) and a
'''tree object''' that describes the data in the directory hierarchy.

======
proc commit {} {
    upvar #0 $::current_branch current
    set current [list commit $::current_tree $current]
}
======

Each object is referenced by its [sha1] hash.  Thus, even if two different
commit objects reference the same tree, that tree object is only store once.
Since tree object is recursive, and each subtree is itself a tree object, each
subtree is only stored once, even if it is part of multiple trees.

Git does not use reference counting to reclaim orphaned objects.  Instead
git-gc, the garbage collector git-gc deletes them when it is run.  Until then,
any object that has been deleted can be reclaimed.
----

** Tips **

[PYK} {2023 08 08}:  Stashing changes one one branch, switching to another, and
then applying the stashed changes may produce corrupt results if checkout that
the stash was created under has not been merged into the branch that the stash
is applied to.  Therefore, only attempt to apply a stash on a branch that has
merged the branch associated with the stash.  Takeway:  Git sort of sucks.


** Discussion **

[Zarutian] 2007-07-16:  Can git be obtained or compiled into a multiplatform
starkit?  Hard when one has only an thumbdrive/ipod to store stuff.

[Lars H] 2008-06-05: Since it's a Unixy collection of many programs that do one
thing each, I suspect this would be tricky (can't `[exec]` something in a [vfs],
can you?). Apparently there has been some work
[http://git.or.cz/gitwiki/SoC2007Projects#head-f604c29a605c7c5fe1e993ef5aa74ce34f3fb84e]
on turning it into a library, but that only got part of the way.

Makes me wonder, though… Could there be a semi-automatic way of turning a suite
of C programs (like git, or at least the git plumbing) into a [load]able
extension which exposes each program as a Tcl command? (I expect one would have
to do things like turning static C variables into fields of some dynamically
allocated struct, to ensure reentrancy, but C is not my forte.)

FWIW, I later noticed that git has a concept of '''builtin''' command, with
something rather close to a Tcl_CmdProc for every built-in subcommand of git.
Probably not too hard to wrap manually, provided the built-in commands don't
try to exec each other.

----

A thing that seems to be special about git is that it tracks content (e.g.
procedure definitions) rather than files (as [CVS], [SVN], and [Mercurial]
does).  See
[http://wincent.com/a/about/wincent/weblog/archives/2007/07/a_look_back_bra.php%|%A look back: Bram Cohen vs Linus Torvalds].

<<categories>> Application | Category Dev. Tools