blob: 129c5c5f5b8657175db7efed2c06078affd05ab6 [file] [log] [blame]
Junio C Hamanoc2b0a492006-01-23 07:54:361A tutorial introduction to git
2==============================
Junio C Hamano1a4e8412005-12-27 08:17:233
Junio C Hamanoc2b0a492006-01-23 07:54:364This tutorial explains how to import a new project into git, make
5changes to it, and share changes with other developers.
Junio C Hamano1a4e8412005-12-27 08:17:236
Junio C Hamanoc2b0a492006-01-23 07:54:367First, note that you can get documentation for a command such as "git
8diff" with:
Junio C Hamano1a4e8412005-12-27 08:17:239
10------------------------------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:3611$ man git-diff
Junio C Hamano1a4e8412005-12-27 08:17:2312------------------------------------------------
13
Junio C Hamanoedd2b0a2007-01-15 06:12:4514It is a good idea to introduce yourself to git with your name and
15public email address before doing any operation. The easiest
16way to do so is:
Junio C Hamano699660b2006-11-29 20:40:1017
18------------------------------------------------
Junio C Hamano7ad22dc2007-01-29 02:55:4819$ git config --global user.name "Your Name Comes Here"
20$ git config --global user.email you@yourdomain.example.com
Junio C Hamano699660b2006-11-29 20:40:1021------------------------------------------------
22
23
Junio C Hamanoc2b0a492006-01-23 07:54:3624Importing a new project
Junio C Hamano1a4e8412005-12-27 08:17:2325-----------------------
26
Junio C Hamanoc2b0a492006-01-23 07:54:3627Assume you have a tarball project.tar.gz with your initial work. You
28can place it under git revision control as follows.
Junio C Hamano1a4e8412005-12-27 08:17:2329
Junio C Hamano1a4e8412005-12-27 08:17:2330------------------------------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:3631$ tar xzf project.tar.gz
32$ cd project
Junio C Hamanofc4d38c2007-01-08 06:53:3233$ git init
Junio C Hamano1a4e8412005-12-27 08:17:2334------------------------------------------------
35
Junio C Hamanoc2b0a492006-01-23 07:54:3636Git will reply
Junio C Hamano1a4e8412005-12-27 08:17:2337
Junio C Hamano1a4e8412005-12-27 08:17:2338------------------------------------------------
Junio C Hamano7d23f5e2006-12-16 07:44:0439Initialized empty Git repository in .git/
Junio C Hamano1a4e8412005-12-27 08:17:2340------------------------------------------------
Junio C Hamano1a4e8412005-12-27 08:17:2341
Junio C Hamanoc2b0a492006-01-23 07:54:3642You've now initialized the working directory--you may notice a new
43directory created, named ".git". Tell git that you want it to track
Junio C Hamano79770b62007-01-07 07:43:5844every file under the current directory (note the '.') with:
Junio C Hamano1a4e8412005-12-27 08:17:2345
Junio C Hamanoc2b0a492006-01-23 07:54:3646------------------------------------------------
47$ git add .
48------------------------------------------------
49
50Finally,
51
52------------------------------------------------
Junio C Hamano699660b2006-11-29 20:40:1053$ git commit
Junio C Hamanoc2b0a492006-01-23 07:54:3654------------------------------------------------
55
56will prompt you for a commit message, then record the current state
57of all the files to the repository.
58
Junio C Hamano79770b62007-01-07 07:43:5859Making changes
60--------------
61
Junio C Hamanoc2b0a492006-01-23 07:54:3662Try modifying some files, then run
63
64------------------------------------------------
65$ git diff
66------------------------------------------------
67
Junio C Hamanoeb692952007-01-03 22:02:1268to review your changes. When you're done, tell git that you
69want the updated contents of these files in the commit and then
70make a commit, like this:
Junio C Hamanoc2b0a492006-01-23 07:54:3671
72------------------------------------------------
Junio C Hamano79770b62007-01-07 07:43:5873$ git add file1 file2 file3
Junio C Hamanoeb692952007-01-03 22:02:1274$ git commit
Junio C Hamanoc2b0a492006-01-23 07:54:3675------------------------------------------------
76
Junio C Hamanoeb692952007-01-03 22:02:1277This will again prompt your for a message describing the change, and then
Junio C Hamano79770b62007-01-07 07:43:5878record the new versions of the files you listed.
79
80Alternatively, instead of running `git add` beforehand, you can use
Junio C Hamano699660b2006-11-29 20:40:1081
82------------------------------------------------
83$ git commit -a
84------------------------------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:3685
Junio C Hamano79770b62007-01-07 07:43:5886which will automatically notice modified (but not new) files.
87
Junio C Hamanoc2b0a492006-01-23 07:54:3688A note on commit messages: Though not required, it's a good idea to
89begin the commit message with a single short (less than 50 character)
90line summarizing the change, followed by a blank line and then a more
91thorough description. Tools that turn commits into email, for
Junio C Hamanoeb692952007-01-03 22:02:1292example, use the first line on the Subject: line and the rest of the
Junio C Hamanoc2b0a492006-01-23 07:54:3693commit in the body.
94
Junio C Hamanoc2b0a492006-01-23 07:54:3695
Junio C Hamanoe7935c42006-12-13 21:32:1796Git tracks content not files
97----------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:3698
Junio C Hamanoe7935c42006-12-13 21:32:1799With git you have to explicitly "add" all the changed _content_ you
100want to commit together. This can be done in a few different ways:
101
1021) By using 'git add <file_spec>...'
103
Junio C Hamano8a66a652007-02-03 08:07:35104This can be performed multiple times before a commit. Note that this
105is not only for adding new files. Even modified files must be
106added to the set of changes about to be committed. The "git status"
107command gives you a summary of what is included so far for the
108next commit. When done you should use the 'git commit' command to
109make it real.
Junio C Hamanoe7935c42006-12-13 21:32:17110
Junio C Hamano8a66a652007-02-03 08:07:35111Note: don't forget to 'add' a file again if you modified it after the
112first 'add' and before 'commit'. Otherwise only the previous added
113state of that file will be committed. This is because git tracks
114content, so what you're really 'add'ing to the commit is the *content*
115of the file in the state it is in when you 'add' it.
Junio C Hamanoe7935c42006-12-13 21:32:17116
1172) By using 'git commit -a' directly
118
Junio C Hamano8a66a652007-02-03 08:07:35119This is a quick way to automatically 'add' the content from all files
120that were modified since the previous commit, and perform the actual
121commit without having to separately 'add' them beforehand. This will
122not add content from new files i.e. files that were never added before.
123Those files still have to be added explicitly before performing a
124commit.
Junio C Hamanoe7935c42006-12-13 21:32:17125
126But here's a twist. If you do 'git commit <file1> <file2> ...' then only
127the changes belonging to those explicitly specified files will be
128committed, entirely bypassing the current "added" changes. Those "added"
129changes will still remain available for a subsequent commit though.
130
131However, for normal usage you only have to remember 'git add' + 'git commit'
132and/or 'git commit -a'.
133
134
135Viewing the changelog
136---------------------
Junio C Hamanoc2b0a492006-01-23 07:54:36137
138At any point you can view the history of your changes using
139
140------------------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13141$ git log
Junio C Hamanoc2b0a492006-01-23 07:54:36142------------------------------------------------
143
144If you also want to see complete diffs at each step, use
145
146------------------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13147$ git log -p
Junio C Hamanoc2b0a492006-01-23 07:54:36148------------------------------------------------
149
Junio C Hamanoeb692952007-01-03 22:02:12150Often the overview of the change is useful to get a feel of
151each step
152
153------------------------------------------------
154$ git log --stat --summary
155------------------------------------------------
156
Junio C Hamanoc2b0a492006-01-23 07:54:36157Managing branches
158-----------------
159
160A single git repository can maintain multiple branches of
161development. To create a new branch named "experimental", use
162
163------------------------------------------------
164$ git branch experimental
165------------------------------------------------
166
167If you now run
168
169------------------------------------------------
170$ git branch
171------------------------------------------------
172
173you'll get a list of all existing branches:
174
175------------------------------------------------
176 experimental
177* master
178------------------------------------------------
179
180The "experimental" branch is the one you just created, and the
181"master" branch is a default branch that was created for you
182automatically. The asterisk marks the branch you are currently on;
183type
184
185------------------------------------------------
186$ git checkout experimental
187------------------------------------------------
188
189to switch to the experimental branch. Now edit a file, commit the
190change, and switch back to the master branch:
191
192------------------------------------------------
193(edit file)
194$ git commit -a
195$ git checkout master
196------------------------------------------------
197
198Check that the change you made is no longer visible, since it was
199made on the experimental branch and you're back on the master branch.
200
201You can make a different change on the master branch:
202
203------------------------------------------------
204(edit file)
205$ git commit -a
206------------------------------------------------
207
208at this point the two branches have diverged, with different changes
Junio C Hamano0df34342006-11-22 08:28:50209made in each. To merge the changes made in experimental into master, run
Junio C Hamanoc2b0a492006-01-23 07:54:36210
211------------------------------------------------
Junio C Hamanoedd2b0a2007-01-15 06:12:45212$ git merge experimental
Junio C Hamanoc2b0a492006-01-23 07:54:36213------------------------------------------------
214
215If the changes don't conflict, you're done. If there are conflicts,
216markers will be left in the problematic files showing the conflict;
217
218------------------------------------------------
219$ git diff
220------------------------------------------------
221
222will show this. Once you've edited the files to resolve the
223conflicts,
224
225------------------------------------------------
226$ git commit -a
227------------------------------------------------
228
229will commit the result of the merge. Finally,
230
231------------------------------------------------
232$ gitk
233------------------------------------------------
234
235will show a nice graphical representation of the resulting history.
236
Junio C Hamanoeb692952007-01-03 22:02:12237At this point you could delete the experimental branch with
238
239------------------------------------------------
240$ git branch -d experimental
241------------------------------------------------
242
243This command ensures that the changes in the experimental branch are
244already in the current branch.
245
Junio C Hamanoc2b0a492006-01-23 07:54:36246If you develop on a branch crazy-idea, then regret it, you can always
247delete the branch with
248
249-------------------------------------
250$ git branch -D crazy-idea
Junio C Hamano1a4e8412005-12-27 08:17:23251-------------------------------------
252
Junio C Hamanoc2b0a492006-01-23 07:54:36253Branches are cheap and easy, so this is a good way to try something
254out.
Junio C Hamano1a4e8412005-12-27 08:17:23255
Junio C Hamanoc2b0a492006-01-23 07:54:36256Using git for collaboration
Junio C Hamano1a4e8412005-12-27 08:17:23257---------------------------
258
Junio C Hamanoc2b0a492006-01-23 07:54:36259Suppose that Alice has started a new project with a git repository in
260/home/alice/project, and that Bob, who has a home directory on the
261same machine, wants to contribute.
Junio C Hamano1a4e8412005-12-27 08:17:23262
Junio C Hamanoc2b0a492006-01-23 07:54:36263Bob begins with:
Junio C Hamano1a4e8412005-12-27 08:17:23264
Junio C Hamanoc2b0a492006-01-23 07:54:36265------------------------------------------------
266$ git clone /home/alice/project myrepo
267------------------------------------------------
Junio C Hamano1a4e8412005-12-27 08:17:23268
Junio C Hamanoc2b0a492006-01-23 07:54:36269This creates a new directory "myrepo" containing a clone of Alice's
270repository. The clone is on an equal footing with the original
Junio C Hamano341071d2006-06-04 07:24:48271project, possessing its own copy of the original project's history.
Junio C Hamano1a4e8412005-12-27 08:17:23272
Junio C Hamanoc2b0a492006-01-23 07:54:36273Bob then makes some changes and commits them:
Junio C Hamano1a4e8412005-12-27 08:17:23274
Junio C Hamanoc2b0a492006-01-23 07:54:36275------------------------------------------------
276(edit files)
277$ git commit -a
278(repeat as necessary)
279------------------------------------------------
Junio C Hamano1a4e8412005-12-27 08:17:23280
Junio C Hamanoc2b0a492006-01-23 07:54:36281When he's ready, he tells Alice to pull changes from the repository
282at /home/bob/myrepo. She does this with:
Junio C Hamano1a4e8412005-12-27 08:17:23283
Junio C Hamanoc2b0a492006-01-23 07:54:36284------------------------------------------------
285$ cd /home/alice/project
Junio C Hamanof98fd882006-11-26 07:28:29286$ git pull /home/bob/myrepo master
Junio C Hamanoc2b0a492006-01-23 07:54:36287------------------------------------------------
Junio C Hamano1a4e8412005-12-27 08:17:23288
Junio C Hamanof98fd882006-11-26 07:28:29289This merges the changes from Bob's "master" branch into Alice's
290current branch. If Alice has made her own changes in the meantime,
291then she may need to manually fix any conflicts. (Note that the
292"master" argument in the above command is actually unnecessary, as it
293is the default.)
Junio C Hamano1a4e8412005-12-27 08:17:23294
Junio C Hamanof98fd882006-11-26 07:28:29295The "pull" command thus performs two operations: it fetches changes
296from a remote branch, then merges them into the current branch.
Junio C Hamano1a4e8412005-12-27 08:17:23297
Junio C Hamano35bd0252007-01-17 05:40:22298When you are working in a small closely knit group, it is not
299unusual to interact with the same repository over and over
300again. By defining 'remote' repository shorthand, you can make
301it easier:
302
303------------------------------------------------
304$ git remote add bob /home/bob/myrepo
305------------------------------------------------
306
307With this, you can perform the first operation alone using the
308"git fetch" command without merging them with her own branch,
309using:
Junio C Hamano1a4e8412005-12-27 08:17:23310
Junio C Hamanoc2b0a492006-01-23 07:54:36311-------------------------------------
Junio C Hamano35bd0252007-01-17 05:40:22312$ git fetch bob
Junio C Hamanoc2b0a492006-01-23 07:54:36313-------------------------------------
Junio C Hamano1a4e8412005-12-27 08:17:23314
Junio C Hamano35bd0252007-01-17 05:40:22315Unlike the longhand form, when Alice fetches from Bob using a
316remote repository shorthand set up with `git remote`, what was
317fetched is stored in a remote tracking branch, in this case
318`bob/master`. So after this:
Junio C Hamanoc2b0a492006-01-23 07:54:36319
320-------------------------------------
Junio C Hamano35bd0252007-01-17 05:40:22321$ git log -p master..bob/master
Junio C Hamanoc2b0a492006-01-23 07:54:36322-------------------------------------
323
324shows a list of all the changes that Bob made since he branched from
325Alice's master branch.
326
Junio C Hamano35bd0252007-01-17 05:40:22327After examining those changes, Alice
Junio C Hamanoedd2b0a2007-01-15 06:12:45328could merge the changes into her master branch:
Junio C Hamanoc2b0a492006-01-23 07:54:36329
330-------------------------------------
Junio C Hamano35bd0252007-01-17 05:40:22331$ git merge bob/master
Junio C Hamanoc2b0a492006-01-23 07:54:36332-------------------------------------
333
Junio C Hamano35bd0252007-01-17 05:40:22334This `merge` can also be done by 'pulling from her own remote
335tracking branch', like this:
Junio C Hamanof98fd882006-11-26 07:28:29336
337-------------------------------------
Junio C Hamano35bd0252007-01-17 05:40:22338$ git pull . remotes/bob/master
Junio C Hamanof98fd882006-11-26 07:28:29339-------------------------------------
340
Junio C Hamano35bd0252007-01-17 05:40:22341Note that git pull always merges into the current branch,
342regardless of what else is given on the commandline.
Junio C Hamanof98fd882006-11-26 07:28:29343
Junio C Hamanoc2b0a492006-01-23 07:54:36344Later, Bob can update his repo with Alice's latest changes using
345
346-------------------------------------
347$ git pull
348-------------------------------------
349
350Note that he doesn't need to give the path to Alice's repository;
351when Bob cloned Alice's repository, git stored the location of her
Junio C Hamanod3361ad2007-01-01 03:20:24352repository in the repository configuration, and that location is
353used for pulls:
Junio C Hamanoc2b0a492006-01-23 07:54:36354
355-------------------------------------
Junio C Hamano7ad22dc2007-01-29 02:55:48356$ git config --get remote.origin.url
Junio C Hamanod3361ad2007-01-01 03:20:24357/home/bob/myrepo
Junio C Hamanoc2b0a492006-01-23 07:54:36358-------------------------------------
359
Junio C Hamanod3361ad2007-01-01 03:20:24360(The complete configuration created by git-clone is visible using
Junio C Hamano7ad22dc2007-01-29 02:55:48361"git config -l", and the gitlink:git-config[1] man page
Junio C Hamanod3361ad2007-01-01 03:20:24362explains the meaning of each option.)
363
364Git also keeps a pristine copy of Alice's master branch under the
365name "origin/master":
366
367-------------------------------------
368$ git branch -r
369 origin/master
370-------------------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:36371
372If Bob later decides to work from a different host, he can still
373perform clones and pulls using the ssh protocol:
374
375-------------------------------------
376$ git clone alice.org:/home/alice/project myrepo
377-------------------------------------
378
379Alternatively, git has a native protocol, or can use rsync or http;
380see gitlink:git-pull[1] for details.
381
382Git can also be used in a CVS-like mode, with a central repository
383that various users push changes to; see gitlink:git-push[1] and
384link:cvs-migration.html[git for CVS users].
385
Junio C Hamano6f8a7902006-05-22 01:10:13386Exploring history
387-----------------
Junio C Hamanoc2b0a492006-01-23 07:54:36388
Junio C Hamano6f8a7902006-05-22 01:10:13389Git history is represented as a series of interrelated commits. We
390have already seen that the git log command can list those commits.
391Note that first line of each git log entry also gives a name for the
392commit:
Junio C Hamanoc2b0a492006-01-23 07:54:36393
394-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13395$ git log
396commit c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
397Author: Junio C Hamano <junkio@cox.net>
398Date: Tue May 16 17:18:22 2006 -0700
399
400 merge-base: Clarify the comments on post processing.
Junio C Hamanoc2b0a492006-01-23 07:54:36401-------------------------------------
402
Junio C Hamano6f8a7902006-05-22 01:10:13403We can give this name to git show to see the details about this
404commit.
Junio C Hamanoc2b0a492006-01-23 07:54:36405
406-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13407$ git show c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
Junio C Hamanoc2b0a492006-01-23 07:54:36408-------------------------------------
409
Junio C Hamanoeb692952007-01-03 22:02:12410But there are other ways to refer to commits. You can use any initial
Junio C Hamano6f8a7902006-05-22 01:10:13411part of the name that is long enough to uniquely identify the commit:
Junio C Hamanoc2b0a492006-01-23 07:54:36412
413-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13414$ git show c82a22c39c # the first few characters of the name are
415# usually enough
416$ git show HEAD # the tip of the current branch
417$ git show experimental # the tip of the "experimental" branch
Junio C Hamanoc2b0a492006-01-23 07:54:36418-------------------------------------
419
Junio C Hamanoeb692952007-01-03 22:02:12420Every commit usually has one "parent" commit
421which points to the previous state of the project:
Junio C Hamanoc2b0a492006-01-23 07:54:36422
423-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13424$ git show HEAD^ # to see the parent of HEAD
425$ git show HEAD^^ # to see the grandparent of HEAD
426$ git show HEAD~4 # to see the great-great grandparent of HEAD
Junio C Hamanoc2b0a492006-01-23 07:54:36427-------------------------------------
428
Junio C Hamano6f8a7902006-05-22 01:10:13429Note that merge commits may have more than one parent:
Junio C Hamanoc2b0a492006-01-23 07:54:36430
431-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13432$ git show HEAD^1 # show the first parent of HEAD (same as HEAD^)
433$ git show HEAD^2 # show the second parent of HEAD
Junio C Hamanoc2b0a492006-01-23 07:54:36434-------------------------------------
435
Junio C Hamano6f8a7902006-05-22 01:10:13436You can also give commits names of your own; after running
Junio C Hamanoc2b0a492006-01-23 07:54:36437
438-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13439$ git-tag v2.5 1b2e1d63ff
Junio C Hamanoc2b0a492006-01-23 07:54:36440-------------------------------------
441
Junio C Hamano6f8a7902006-05-22 01:10:13442you can refer to 1b2e1d63ff by the name "v2.5". If you intend to
443share this name with other people (for example, to identify a release
Junio C Hamanoc2b0a492006-01-23 07:54:36444version), you should create a "tag" object, and perhaps sign it; see
445gitlink:git-tag[1] for details.
446
Junio C Hamano6f8a7902006-05-22 01:10:13447Any git command that needs to know a commit can take any of these
448names. For example:
Junio C Hamanoc2b0a492006-01-23 07:54:36449
450-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13451$ git diff v2.5 HEAD # compare the current HEAD to v2.5
452$ git branch stable v2.5 # start a new branch named "stable" based
453 # at v2.5
454$ git reset --hard HEAD^ # reset your current branch and working
Junio C Hamano33db4372006-06-07 19:51:45455 # directory to its state at HEAD^
Junio C Hamanoc2b0a492006-01-23 07:54:36456-------------------------------------
457
Junio C Hamano6f8a7902006-05-22 01:10:13458Be careful with that last command: in addition to losing any changes
459in the working directory, it will also remove all later commits from
460this branch. If this branch is the only branch containing those
Junio C Hamanoee1e4282007-02-04 08:32:04461commits, they will be lost. Also, don't use "git reset" on a
462publicly-visible branch that other developers pull from, as it will
463force needless merges on other developers to clean up the history.
Junio C Hamano16cf1582007-02-05 07:21:48464If you need to undo changes that you have pushed, use gitlink:git-revert[1]
465instead.
Junio C Hamano6f8a7902006-05-22 01:10:13466
467The git grep command can search for strings in any version of your
468project, so
469
470-------------------------------------
471$ git grep "hello" v2.5
472-------------------------------------
473
Junio C Hamano341071d2006-06-04 07:24:48474searches for all occurrences of "hello" in v2.5.
Junio C Hamano6f8a7902006-05-22 01:10:13475
476If you leave out the commit name, git grep will search any of the
477files it manages in your current directory. So
478
479-------------------------------------
480$ git grep "hello"
481-------------------------------------
482
483is a quick way to search just the files that are tracked by git.
484
485Many git commands also take sets of commits, which can be specified
486in a number of ways. Here are some examples with git log:
487
488-------------------------------------
489$ git log v2.5..v2.6 # commits between v2.5 and v2.6
490$ git log v2.5.. # commits since v2.5
491$ git log --since="2 weeks ago" # commits from the last 2 weeks
492$ git log v2.5.. Makefile # commits since v2.5 which modify
493# Makefile
494-------------------------------------
495
496You can also give git log a "range" of commits where the first is not
497necessarily an ancestor of the second; for example, if the tips of
498the branches "stable-release" and "master" diverged from a common
499commit some time ago, then
500
501-------------------------------------
502$ git log stable..experimental
503-------------------------------------
504
505will list commits made in the experimental branch but not in the
506stable branch, while
507
508-------------------------------------
509$ git log experimental..stable
510-------------------------------------
511
512will show the list of commits made on the stable branch but not
513the experimental branch.
514
515The "git log" command has a weakness: it must present commits in a
516list. When the history has lines of development that diverged and
517then merged back together, the order in which "git log" presents
518those commits is meaningless.
519
520Most projects with multiple contributors (such as the linux kernel,
521or git itself) have frequent merges, and gitk does a better job of
522visualizing their history. For example,
523
524-------------------------------------
525$ gitk --since="2 weeks ago" drivers/
526-------------------------------------
527
528allows you to browse any commits from the last 2 weeks of commits
Junio C Hamanobb8fb052006-05-30 07:21:12529that modified files under the "drivers" directory. (Note: you can
530adjust gitk's fonts by holding down the control key while pressing
531"-" or "+".)
Junio C Hamano6f8a7902006-05-22 01:10:13532
533Finally, most commands that take filenames will optionally allow you
534to precede any filename by a commit, to specify a particular version
Junio C Hamanobb8fb052006-05-30 07:21:12535of the file:
Junio C Hamano6f8a7902006-05-22 01:10:13536
537-------------------------------------
538$ git diff v2.5:Makefile HEAD:Makefile.in
539-------------------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:36540
Junio C Hamanoeb692952007-01-03 22:02:12541You can also use "git show" to see any such file:
Junio C Hamanobb8fb052006-05-30 07:21:12542
543-------------------------------------
Junio C Hamanoeb692952007-01-03 22:02:12544$ git show v2.5:Makefile
Junio C Hamanobb8fb052006-05-30 07:21:12545-------------------------------------
546
Junio C Hamanoc2b0a492006-01-23 07:54:36547Next Steps
548----------
549
Junio C Hamano6f8a7902006-05-22 01:10:13550This tutorial should be enough to perform basic distributed revision
551control for your projects. However, to fully understand the depth
552and power of git you need to understand two simple ideas on which it
553is based:
Junio C Hamanoc2b0a492006-01-23 07:54:36554
Junio C Hamano6f8a7902006-05-22 01:10:13555 * The object database is the rather elegant system used to
556 store the history of your project--files, directories, and
557 commits.
558
559 * The index file is a cache of the state of a directory tree,
560 used to create commits, check out working directories, and
561 hold the various trees involved in a merge.
562
563link:tutorial-2.html[Part two of this tutorial] explains the object
564database, the index file, and a few other odds and ends that you'll
565need to make the most of git.
566
567If you don't want to consider with that right away, a few other
568digressions that may be interesting at this point are:
Junio C Hamanoc2b0a492006-01-23 07:54:36569
570 * gitlink:git-format-patch[1], gitlink:git-am[1]: These convert
571 series of git commits into emailed patches, and vice versa,
572 useful for projects such as the linux kernel which rely heavily
573 on emailed patches.
574
575 * gitlink:git-bisect[1]: When there is a regression in your
576 project, one way to track down the bug is by searching through
577 the history to find the exact commit that's to blame. Git bisect
578 can help you perform a binary search for that commit. It is
579 smart enough to perform a close-to-optimal search even in the
580 case of complex non-linear history with lots of merged branches.
581
Junio C Hamano341071d2006-06-04 07:24:48582 * link:everyday.html[Everyday GIT with 20 Commands Or So]
Junio C Hamano6f8a7902006-05-22 01:10:13583
584 * link:cvs-migration.html[git for CVS users].