Reordered analogies in "Work How You Want"
[gitmagic/dustin.git] / grandmaster.txt
blob3aa5e64534d1d5ceeea4e671ceb9e546abf9596d
1 = Git Grandmastery =
3 This pretentiously named page is my dumping ground for uncategorized Git tricks.
5 == Source Releases ==
7 For my projects, Git tracks exactly the files I'd like to archive and release to users. So to create a tarball of the source code, I run:
9  $ git-archive --format=tar --prefix=proj-1.2.3/ HEAD
11 == Changelog Generation ==
13 It's good practice to keep a [[http://en.wikipedia.org/wiki/Changelog][changelog]], and some projects even require it. If you've been committing frequently, which you should, generate a Changelog by typing
15  $ git-log > ChangeLog
17 == Git Over SSH, HTTP ==
19 Suppose you have ssh access to your web server, and it does not have Git installed, which is not an uncommon situation. Then download, compile and install Git in your account.
21 Create a repository in your web directory:
23  $ GIT_DIR=proj.git git-init
25 and in the "proj.git" directory, run
27  $ git --bare update-server-info
28  $ chmod a+x hooks/post-update
30 From your computer, you can push via ssh:
32  $ git push web.server:/path/to/proj.git HEAD
34 and people can get your project via
36  $ git clone http://web.server/proj.git
38 == Commit What Changed ==
40 Telling Git when you've added, deleted and renamed files gets tedious. Instead, try:
42  $ git-ls-files -d -m -o -z | xargs -0 git-update-index --add --remove
44 and Git will look at the files in the current directory and work everything out for itself. The *-z* and *-0* options prevent ill side-effects from filenames containing strange characters.
46 You might want it to ignore particular files:
48  $ git-ls-files -d -m -o -z -x *.tmp | xargs -0 git-update-index --add --remove
50 If you have a big list of directories and files that should never be version controlled, type them into a separate file named ".gitignore" and run:
52  $ git-ls-files -d -m -o -z -X .gitignore | xargs -0 git-update-index --add --remove
54 You can also exclude files on a per-directory basis. See the help page.
56 == I Stand Corrected ==
58 Did you just commit, but wish you had typed a different message? Realized you forgot to add a file? Then:
60  $ git commit --amend
62 can help you out.
64 == Don't Lose Your HEAD ==
66 The HEAD tag is like a cursor that normally points at the latest commit, advancing with each new commit. Some Git commands let you move it. For example:
68  $ git reset HEAD~3
70 will move the HEAD three commits backwards in time. Thus all Git commands now act as if you hadn't made those last three commits, while your files remain in the present. See the git-reset man page for some applications.
72 But how can you go back to the future? The past commits do not know anything of the future.
74 If you have the SHA1 of the original HEAD then:
76  $ git reset SHA1
78 But suppose you never took it down? Don't worry, for commands like these, Git saves the original HEAD as a tag called ORIG_HEAD, and you can return safe and sound with:
80  $ git reset ORIG_HEAD
82 == Building On Git ==
84 In true UNIX fashion, Git's design allows it to be easily used as a low-level component of other programs. There are GUI interfaces, web interfaces, alternative command-line interfaces, and perhaps soon you will have a script or two of your own that calls Git.
86 See [[http://git.or.cz/][the Git homepage]] for some examples.