blob: 0982f74ef6212577afb74d86079472662e2bffba [file] [log] [blame]
Junio C Hamanodfccbb02008-05-26 01:16:141gittutorial(7)
2==============
3
4NAME
5----
6gittutorial - A tutorial introduction to git (for version 1.5.1 or newer)
7
8SYNOPSIS
9--------
10git *
11
12DESCRIPTION
13-----------
Junio C Hamano1a4e8412005-12-27 08:17:2314
Junio C Hamanoc2b0a492006-01-23 07:54:3615This tutorial explains how to import a new project into git, make
16changes to it, and share changes with other developers.
Junio C Hamano1a4e8412005-12-27 08:17:2317
Junio C Hamanoed7f4f62007-05-20 09:09:0918If you are instead primarily interested in using git to fetch a project,
19for example, to test the latest version, you may prefer to start with
20the first two chapters of link:user-manual.html[The Git User's Manual].
21
Junio C Hamanofce7c7e2008-07-02 03:06:3822First, note that you can get documentation for a command such as
23`git log --graph` with:
Junio C Hamano1a4e8412005-12-27 08:17:2324
25------------------------------------------------
Junio C Hamanofce7c7e2008-07-02 03:06:3826$ man git-log
Junio C Hamano1a4e8412005-12-27 08:17:2327------------------------------------------------
28
Junio C Hamanof66ecee2008-11-17 18:25:4329or:
30
31------------------------------------------------
32$ git help log
33------------------------------------------------
34
35With the latter, you can use the manual viewer of your choice; see
36linkgit:git-help[1] for more information.
37
Junio C Hamanoedd2b0a2007-01-15 06:12:4538It is a good idea to introduce yourself to git with your name and
39public email address before doing any operation. The easiest
40way to do so is:
Junio C Hamano699660b2006-11-29 20:40:1041
42------------------------------------------------
Junio C Hamano7ad22dc2007-01-29 02:55:4843$ git config --global user.name "Your Name Comes Here"
44$ git config --global user.email you@yourdomain.example.com
Junio C Hamano699660b2006-11-29 20:40:1045------------------------------------------------
46
47
Junio C Hamanoc2b0a492006-01-23 07:54:3648Importing a new project
Junio C Hamano1a4e8412005-12-27 08:17:2349-----------------------
50
Junio C Hamanoc2b0a492006-01-23 07:54:3651Assume you have a tarball project.tar.gz with your initial work. You
52can place it under git revision control as follows.
Junio C Hamano1a4e8412005-12-27 08:17:2353
Junio C Hamano1a4e8412005-12-27 08:17:2354------------------------------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:3655$ tar xzf project.tar.gz
56$ cd project
Junio C Hamanofc4d38c2007-01-08 06:53:3257$ git init
Junio C Hamano1a4e8412005-12-27 08:17:2358------------------------------------------------
59
Junio C Hamanoc2b0a492006-01-23 07:54:3660Git will reply
Junio C Hamano1a4e8412005-12-27 08:17:2361
Junio C Hamano1a4e8412005-12-27 08:17:2362------------------------------------------------
Junio C Hamano7d23f5e2006-12-16 07:44:0463Initialized empty Git repository in .git/
Junio C Hamano1a4e8412005-12-27 08:17:2364------------------------------------------------
Junio C Hamano1a4e8412005-12-27 08:17:2365
Junio C Hamanoc2b0a492006-01-23 07:54:3666You've now initialized the working directory--you may notice a new
Junio C Hamanoed7f4f62007-05-20 09:09:0967directory created, named ".git".
68
69Next, tell git to take a snapshot of the contents of all files under the
Junio C Hamano1aa40d22010-01-21 17:46:4370current directory (note the '.'), with 'git add':
Junio C Hamano1a4e8412005-12-27 08:17:2371
Junio C Hamanoc2b0a492006-01-23 07:54:3672------------------------------------------------
73$ git add .
74------------------------------------------------
75
Junio C Hamanoed7f4f62007-05-20 09:09:0976This snapshot is now stored in a temporary staging area which git calls
77the "index". You can permanently store the contents of the index in the
Junio C Hamano1aa40d22010-01-21 17:46:4378repository with 'git commit':
Junio C Hamanoc2b0a492006-01-23 07:54:3679
80------------------------------------------------
Junio C Hamano699660b2006-11-29 20:40:1081$ git commit
Junio C Hamanoc2b0a492006-01-23 07:54:3682------------------------------------------------
83
Junio C Hamanoed7f4f62007-05-20 09:09:0984This will prompt you for a commit message. You've now stored the first
85version of your project in git.
Junio C Hamanoc2b0a492006-01-23 07:54:3686
Junio C Hamano79770b62007-01-07 07:43:5887Making changes
88--------------
89
Junio C Hamanoed7f4f62007-05-20 09:09:0990Modify some files, then add their updated contents to the index:
Junio C Hamanoc2b0a492006-01-23 07:54:3691
92------------------------------------------------
Junio C Hamano79770b62007-01-07 07:43:5893$ git add file1 file2 file3
Junio C Hamanoed7f4f62007-05-20 09:09:0994------------------------------------------------
95
96You are now ready to commit. You can see what is about to be committed
Junio C Hamano1aa40d22010-01-21 17:46:4397using 'git diff' with the --cached option:
Junio C Hamanoed7f4f62007-05-20 09:09:0998
99------------------------------------------------
100$ git diff --cached
101------------------------------------------------
102
Junio C Hamano1aa40d22010-01-21 17:46:43103(Without --cached, 'git diff' will show you any changes that
Junio C Hamanoed7f4f62007-05-20 09:09:09104you've made but not yet added to the index.) You can also get a brief
Junio C Hamano1aa40d22010-01-21 17:46:43105summary of the situation with 'git status':
Junio C Hamanoed7f4f62007-05-20 09:09:09106
107------------------------------------------------
108$ git status
109# On branch master
110# Changes to be committed:
111# (use "git reset HEAD <file>..." to unstage)
112#
113# modified: file1
114# modified: file2
115# modified: file3
116#
117------------------------------------------------
118
119If you need to make any further adjustments, do so now, and then add any
120newly modified content to the index. Finally, commit your changes with:
121
122------------------------------------------------
Junio C Hamanoeb692952007-01-03 22:02:12123$ git commit
Junio C Hamanoc2b0a492006-01-23 07:54:36124------------------------------------------------
125
Junio C Hamano6fb124c2008-06-13 10:04:01126This will again prompt you for a message describing the change, and then
Junio C Hamanoed7f4f62007-05-20 09:09:09127record a new version of the project.
Junio C Hamano79770b62007-01-07 07:43:58128
Junio C Hamano1aa40d22010-01-21 17:46:43129Alternatively, instead of running 'git add' beforehand, you can use
Junio C Hamano699660b2006-11-29 20:40:10130
131------------------------------------------------
132$ git commit -a
133------------------------------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:36134
Junio C Hamanoed7f4f62007-05-20 09:09:09135which will automatically notice any modified (but not new) files, add
136them to the index, and commit, all in one step.
Junio C Hamano79770b62007-01-07 07:43:58137
Junio C Hamanoc2b0a492006-01-23 07:54:36138A note on commit messages: Though not required, it's a good idea to
139begin the commit message with a single short (less than 50 character)
140line summarizing the change, followed by a blank line and then a more
141thorough description. Tools that turn commits into email, for
Junio C Hamanoeb692952007-01-03 22:02:12142example, use the first line on the Subject: line and the rest of the
Junio C Hamanoc2b0a492006-01-23 07:54:36143commit in the body.
144
Junio C Hamanoe7935c42006-12-13 21:32:17145Git tracks content not files
146----------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:36147
Junio C Hamanofce7c7e2008-07-02 03:06:38148Many revision control systems provide an `add` command that tells the
149system to start tracking changes to a new file. Git's `add` command
Junio C Hamano1aa40d22010-01-21 17:46:43150does something simpler and more powerful: 'git add' is used both for new
Junio C Hamanoed7f4f62007-05-20 09:09:09151and newly modified files, and in both cases it takes a snapshot of the
152given files and stages that content in the index, ready for inclusion in
153the next commit.
Junio C Hamanoe7935c42006-12-13 21:32:17154
Junio C Hamanof614c642007-06-11 01:21:54155Viewing project history
156-----------------------
Junio C Hamanoc2b0a492006-01-23 07:54:36157
158At any point you can view the history of your changes using
159
160------------------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13161$ git log
Junio C Hamanoc2b0a492006-01-23 07:54:36162------------------------------------------------
163
164If you also want to see complete diffs at each step, use
165
166------------------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13167$ git log -p
Junio C Hamanoc2b0a492006-01-23 07:54:36168------------------------------------------------
169
Junio C Hamanoeb692952007-01-03 22:02:12170Often the overview of the change is useful to get a feel of
171each step
172
173------------------------------------------------
174$ git log --stat --summary
175------------------------------------------------
176
Junio C Hamanoc2b0a492006-01-23 07:54:36177Managing branches
178-----------------
179
180A single git repository can maintain multiple branches of
181development. To create a new branch named "experimental", use
182
183------------------------------------------------
184$ git branch experimental
185------------------------------------------------
186
187If you now run
188
189------------------------------------------------
190$ git branch
191------------------------------------------------
192
193you'll get a list of all existing branches:
194
195------------------------------------------------
196 experimental
197* master
198------------------------------------------------
199
200The "experimental" branch is the one you just created, and the
201"master" branch is a default branch that was created for you
202automatically. The asterisk marks the branch you are currently on;
203type
204
205------------------------------------------------
206$ git checkout experimental
207------------------------------------------------
208
209to switch to the experimental branch. Now edit a file, commit the
210change, and switch back to the master branch:
211
212------------------------------------------------
213(edit file)
214$ git commit -a
215$ git checkout master
216------------------------------------------------
217
218Check that the change you made is no longer visible, since it was
219made on the experimental branch and you're back on the master branch.
220
221You can make a different change on the master branch:
222
223------------------------------------------------
224(edit file)
225$ git commit -a
226------------------------------------------------
227
228at this point the two branches have diverged, with different changes
Junio C Hamano0df34342006-11-22 08:28:50229made in each. To merge the changes made in experimental into master, run
Junio C Hamanoc2b0a492006-01-23 07:54:36230
231------------------------------------------------
Junio C Hamanoedd2b0a2007-01-15 06:12:45232$ git merge experimental
Junio C Hamanoc2b0a492006-01-23 07:54:36233------------------------------------------------
234
235If the changes don't conflict, you're done. If there are conflicts,
236markers will be left in the problematic files showing the conflict;
237
238------------------------------------------------
239$ git diff
240------------------------------------------------
241
242will show this. Once you've edited the files to resolve the
243conflicts,
244
245------------------------------------------------
246$ git commit -a
247------------------------------------------------
248
249will commit the result of the merge. Finally,
250
251------------------------------------------------
252$ gitk
253------------------------------------------------
254
255will show a nice graphical representation of the resulting history.
256
Junio C Hamanoeb692952007-01-03 22:02:12257At this point you could delete the experimental branch with
258
259------------------------------------------------
260$ git branch -d experimental
261------------------------------------------------
262
263This command ensures that the changes in the experimental branch are
264already in the current branch.
265
Junio C Hamanoc2b0a492006-01-23 07:54:36266If you develop on a branch crazy-idea, then regret it, you can always
267delete the branch with
268
269-------------------------------------
270$ git branch -D crazy-idea
Junio C Hamano1a4e8412005-12-27 08:17:23271-------------------------------------
272
Junio C Hamanoc2b0a492006-01-23 07:54:36273Branches are cheap and easy, so this is a good way to try something
274out.
Junio C Hamano1a4e8412005-12-27 08:17:23275
Junio C Hamanoc2b0a492006-01-23 07:54:36276Using git for collaboration
Junio C Hamano1a4e8412005-12-27 08:17:23277---------------------------
278
Junio C Hamanoc2b0a492006-01-23 07:54:36279Suppose that Alice has started a new project with a git repository in
280/home/alice/project, and that Bob, who has a home directory on the
281same machine, wants to contribute.
Junio C Hamano1a4e8412005-12-27 08:17:23282
Junio C Hamanoc2b0a492006-01-23 07:54:36283Bob begins with:
Junio C Hamano1a4e8412005-12-27 08:17:23284
Junio C Hamanoc2b0a492006-01-23 07:54:36285------------------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03286bob$ git clone /home/alice/project myrepo
Junio C Hamanoc2b0a492006-01-23 07:54:36287------------------------------------------------
Junio C Hamano1a4e8412005-12-27 08:17:23288
Junio C Hamanoc2b0a492006-01-23 07:54:36289This creates a new directory "myrepo" containing a clone of Alice's
290repository. The clone is on an equal footing with the original
Junio C Hamano341071d2006-06-04 07:24:48291project, possessing its own copy of the original project's history.
Junio C Hamano1a4e8412005-12-27 08:17:23292
Junio C Hamanoc2b0a492006-01-23 07:54:36293Bob then makes some changes and commits them:
Junio C Hamano1a4e8412005-12-27 08:17:23294
Junio C Hamanoc2b0a492006-01-23 07:54:36295------------------------------------------------
296(edit files)
Junio C Hamano38ddcce2008-07-15 15:49:03297bob$ git commit -a
Junio C Hamanoc2b0a492006-01-23 07:54:36298(repeat as necessary)
299------------------------------------------------
Junio C Hamano1a4e8412005-12-27 08:17:23300
Junio C Hamanoc2b0a492006-01-23 07:54:36301When he's ready, he tells Alice to pull changes from the repository
302at /home/bob/myrepo. She does this with:
Junio C Hamano1a4e8412005-12-27 08:17:23303
Junio C Hamanoc2b0a492006-01-23 07:54:36304------------------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03305alice$ cd /home/alice/project
306alice$ git pull /home/bob/myrepo master
Junio C Hamanoc2b0a492006-01-23 07:54:36307------------------------------------------------
Junio C Hamano1a4e8412005-12-27 08:17:23308
Junio C Hamanof98fd882006-11-26 07:28:29309This merges the changes from Bob's "master" branch into Alice's
310current branch. If Alice has made her own changes in the meantime,
Junio C Hamano20d47e32009-01-26 06:36:02311then she may need to manually fix any conflicts.
Junio C Hamano1a4e8412005-12-27 08:17:23312
Junio C Hamanof98fd882006-11-26 07:28:29313The "pull" command thus performs two operations: it fetches changes
314from a remote branch, then merges them into the current branch.
Junio C Hamano1a4e8412005-12-27 08:17:23315
Junio C Hamano38ddcce2008-07-15 15:49:03316Note that in general, Alice would want her local changes committed before
317initiating this "pull". If Bob's work conflicts with what Alice did since
318their histories forked, Alice will use her working tree and the index to
319resolve conflicts, and existing local changes will interfere with the
320conflict resolution process (git will still perform the fetch but will
321refuse to merge --- Alice will have to get rid of her local changes in
322some way and pull again when this happens).
323
324Alice can peek at what Bob did without merging first, using the "fetch"
325command; this allows Alice to inspect what Bob did, using a special
326symbol "FETCH_HEAD", in order to determine if he has anything worth
327pulling, like this:
328
329------------------------------------------------
330alice$ git fetch /home/bob/myrepo master
Junio C Hamanoa387df32008-08-29 08:56:58331alice$ git log -p HEAD..FETCH_HEAD
Junio C Hamano38ddcce2008-07-15 15:49:03332------------------------------------------------
333
334This operation is safe even if Alice has uncommitted local changes.
Junio C Hamano73d812c2009-07-01 02:33:06335The range notation "HEAD..FETCH_HEAD" means "show everything that is reachable
336from the FETCH_HEAD but exclude anything that is reachable from HEAD".
Junio C Hamanoa387df32008-08-29 08:56:58337Alice already knows everything that leads to her current state (HEAD),
Junio C Hamano73d812c2009-07-01 02:33:06338and reviews what Bob has in his state (FETCH_HEAD) that she has not
339seen with this command.
Junio C Hamanoa387df32008-08-29 08:56:58340
341If Alice wants to visualize what Bob did since their histories forked
342she can issue the following command:
343
344------------------------------------------------
345$ gitk HEAD..FETCH_HEAD
346------------------------------------------------
347
348This uses the same two-dot range notation we saw earlier with 'git log'.
349
350Alice may want to view what both of them did since they forked.
351She can use three-dot form instead of the two-dot form:
352
353------------------------------------------------
354$ gitk HEAD...FETCH_HEAD
355------------------------------------------------
356
357This means "show everything that is reachable from either one, but
358exclude anything that is reachable from both of them".
359
360Please note that these range notation can be used with both gitk
361and "git log".
Junio C Hamano38ddcce2008-07-15 15:49:03362
363After inspecting what Bob did, if there is nothing urgent, Alice may
364decide to continue working without pulling from Bob. If Bob's history
365does have something Alice would immediately need, Alice may choose to
366stash her work-in-progress first, do a "pull", and then finally unstash
367her work-in-progress on top of the resulting history.
368
Junio C Hamano35bd0252007-01-17 05:40:22369When you are working in a small closely knit group, it is not
370unusual to interact with the same repository over and over
371again. By defining 'remote' repository shorthand, you can make
372it easier:
373
374------------------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03375alice$ git remote add bob /home/bob/myrepo
Junio C Hamano35bd0252007-01-17 05:40:22376------------------------------------------------
377
Junio C Hamano73d812c2009-07-01 02:33:06378With this, Alice can perform the first part of the "pull" operation
Junio C Hamano1aa40d22010-01-21 17:46:43379alone using the 'git fetch' command without merging them with her own
Junio C Hamano73d812c2009-07-01 02:33:06380branch, using:
Junio C Hamano1a4e8412005-12-27 08:17:23381
Junio C Hamanoc2b0a492006-01-23 07:54:36382-------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03383alice$ git fetch bob
Junio C Hamanoc2b0a492006-01-23 07:54:36384-------------------------------------
Junio C Hamano1a4e8412005-12-27 08:17:23385
Junio C Hamano35bd0252007-01-17 05:40:22386Unlike the longhand form, when Alice fetches from Bob using a
Junio C Hamano1aa40d22010-01-21 17:46:43387remote repository shorthand set up with 'git remote', what was
Junio C Hamano97bcb482010-11-25 03:16:07388fetched is stored in a remote-tracking branch, in this case
Junio C Hamano35bd0252007-01-17 05:40:22389`bob/master`. So after this:
Junio C Hamanoc2b0a492006-01-23 07:54:36390
391-------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03392alice$ git log -p master..bob/master
Junio C Hamanoc2b0a492006-01-23 07:54:36393-------------------------------------
394
395shows a list of all the changes that Bob made since he branched from
396Alice's master branch.
397
Junio C Hamano35bd0252007-01-17 05:40:22398After examining those changes, Alice
Junio C Hamanoedd2b0a2007-01-15 06:12:45399could merge the changes into her master branch:
Junio C Hamanoc2b0a492006-01-23 07:54:36400
401-------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03402alice$ git merge bob/master
Junio C Hamanoc2b0a492006-01-23 07:54:36403-------------------------------------
404
Junio C Hamano97bcb482010-11-25 03:16:07405This `merge` can also be done by 'pulling from her own remote-tracking
406branch', like this:
Junio C Hamanof98fd882006-11-26 07:28:29407
408-------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03409alice$ git pull . remotes/bob/master
Junio C Hamanof98fd882006-11-26 07:28:29410-------------------------------------
411
Junio C Hamano35bd0252007-01-17 05:40:22412Note that git pull always merges into the current branch,
Junio C Hamanoa6387422007-08-25 03:54:27413regardless of what else is given on the command line.
Junio C Hamanof98fd882006-11-26 07:28:29414
Junio C Hamanoc2b0a492006-01-23 07:54:36415Later, Bob can update his repo with Alice's latest changes using
416
417-------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03418bob$ git pull
Junio C Hamanoc2b0a492006-01-23 07:54:36419-------------------------------------
420
421Note that he doesn't need to give the path to Alice's repository;
422when Bob cloned Alice's repository, git stored the location of her
Junio C Hamanod3361ad2007-01-01 03:20:24423repository in the repository configuration, and that location is
424used for pulls:
Junio C Hamanoc2b0a492006-01-23 07:54:36425
426-------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03427bob$ git config --get remote.origin.url
Junio C Hamano330aae62007-07-06 17:01:58428/home/alice/project
Junio C Hamanoc2b0a492006-01-23 07:54:36429-------------------------------------
430
Junio C Hamano1aa40d22010-01-21 17:46:43431(The complete configuration created by 'git clone' is visible using
Junio C Hamanofce7c7e2008-07-02 03:06:38432`git config -l`, and the linkgit:git-config[1] man page
Junio C Hamanod3361ad2007-01-01 03:20:24433explains the meaning of each option.)
434
435Git also keeps a pristine copy of Alice's master branch under the
436name "origin/master":
437
438-------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03439bob$ git branch -r
Junio C Hamanod3361ad2007-01-01 03:20:24440 origin/master
441-------------------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:36442
443If Bob later decides to work from a different host, he can still
444perform clones and pulls using the ssh protocol:
445
446-------------------------------------
Junio C Hamano38ddcce2008-07-15 15:49:03447bob$ git clone alice.org:/home/alice/project myrepo
Junio C Hamanoc2b0a492006-01-23 07:54:36448-------------------------------------
449
450Alternatively, git has a native protocol, or can use rsync or http;
Junio C Hamano35738e82008-01-07 07:55:46451see linkgit:git-pull[1] for details.
Junio C Hamanoc2b0a492006-01-23 07:54:36452
453Git can also be used in a CVS-like mode, with a central repository
Junio C Hamano35738e82008-01-07 07:55:46454that various users push changes to; see linkgit:git-push[1] and
Junio C Hamanofce7c7e2008-07-02 03:06:38455linkgit:gitcvs-migration[7].
Junio C Hamanoc2b0a492006-01-23 07:54:36456
Junio C Hamano6f8a7902006-05-22 01:10:13457Exploring history
458-----------------
Junio C Hamanoc2b0a492006-01-23 07:54:36459
Junio C Hamano6f8a7902006-05-22 01:10:13460Git history is represented as a series of interrelated commits. We
Junio C Hamano1aa40d22010-01-21 17:46:43461have already seen that the 'git log' command can list those commits.
Junio C Hamano6f8a7902006-05-22 01:10:13462Note that first line of each git log entry also gives a name for the
463commit:
Junio C Hamanoc2b0a492006-01-23 07:54:36464
465-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13466$ git log
467commit c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
468Author: Junio C Hamano <junkio@cox.net>
469Date: Tue May 16 17:18:22 2006 -0700
470
471 merge-base: Clarify the comments on post processing.
Junio C Hamanoc2b0a492006-01-23 07:54:36472-------------------------------------
473
Junio C Hamano1aa40d22010-01-21 17:46:43474We can give this name to 'git show' to see the details about this
Junio C Hamano6f8a7902006-05-22 01:10:13475commit.
Junio C Hamanoc2b0a492006-01-23 07:54:36476
477-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13478$ git show c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
Junio C Hamanoc2b0a492006-01-23 07:54:36479-------------------------------------
480
Junio C Hamanoeb692952007-01-03 22:02:12481But there are other ways to refer to commits. You can use any initial
Junio C Hamano6f8a7902006-05-22 01:10:13482part of the name that is long enough to uniquely identify the commit:
Junio C Hamanoc2b0a492006-01-23 07:54:36483
484-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13485$ git show c82a22c39c # the first few characters of the name are
486# usually enough
487$ git show HEAD # the tip of the current branch
488$ git show experimental # the tip of the "experimental" branch
Junio C Hamanoc2b0a492006-01-23 07:54:36489-------------------------------------
490
Junio C Hamanoeb692952007-01-03 22:02:12491Every commit usually has one "parent" commit
492which points to the previous state of the project:
Junio C Hamanoc2b0a492006-01-23 07:54:36493
494-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13495$ git show HEAD^ # to see the parent of HEAD
496$ git show HEAD^^ # to see the grandparent of HEAD
497$ git show HEAD~4 # to see the great-great grandparent of HEAD
Junio C Hamanoc2b0a492006-01-23 07:54:36498-------------------------------------
499
Junio C Hamano6f8a7902006-05-22 01:10:13500Note that merge commits may have more than one parent:
Junio C Hamanoc2b0a492006-01-23 07:54:36501
502-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13503$ git show HEAD^1 # show the first parent of HEAD (same as HEAD^)
504$ git show HEAD^2 # show the second parent of HEAD
Junio C Hamanoc2b0a492006-01-23 07:54:36505-------------------------------------
506
Junio C Hamano6f8a7902006-05-22 01:10:13507You can also give commits names of your own; after running
Junio C Hamanoc2b0a492006-01-23 07:54:36508
509-------------------------------------
Junio C Hamanofce7c7e2008-07-02 03:06:38510$ git tag v2.5 1b2e1d63ff
Junio C Hamanoc2b0a492006-01-23 07:54:36511-------------------------------------
512
Junio C Hamano6f8a7902006-05-22 01:10:13513you can refer to 1b2e1d63ff by the name "v2.5". If you intend to
514share this name with other people (for example, to identify a release
Junio C Hamanoc2b0a492006-01-23 07:54:36515version), you should create a "tag" object, and perhaps sign it; see
Junio C Hamano35738e82008-01-07 07:55:46516linkgit:git-tag[1] for details.
Junio C Hamanoc2b0a492006-01-23 07:54:36517
Junio C Hamano6f8a7902006-05-22 01:10:13518Any git command that needs to know a commit can take any of these
519names. For example:
Junio C Hamanoc2b0a492006-01-23 07:54:36520
521-------------------------------------
Junio C Hamano6f8a7902006-05-22 01:10:13522$ git diff v2.5 HEAD # compare the current HEAD to v2.5
523$ git branch stable v2.5 # start a new branch named "stable" based
524 # at v2.5
525$ git reset --hard HEAD^ # reset your current branch and working
Junio C Hamano33db4372006-06-07 19:51:45526 # directory to its state at HEAD^
Junio C Hamanoc2b0a492006-01-23 07:54:36527-------------------------------------
528
Junio C Hamano6f8a7902006-05-22 01:10:13529Be careful with that last command: in addition to losing any changes
530in the working directory, it will also remove all later commits from
531this branch. If this branch is the only branch containing those
Junio C Hamano1aa40d22010-01-21 17:46:43532commits, they will be lost. Also, don't use 'git reset' on a
Junio C Hamanoee1e4282007-02-04 08:32:04533publicly-visible branch that other developers pull from, as it will
534force needless merges on other developers to clean up the history.
Junio C Hamano1aa40d22010-01-21 17:46:43535If you need to undo changes that you have pushed, use 'git revert'
Junio C Hamano16cf1582007-02-05 07:21:48536instead.
Junio C Hamano6f8a7902006-05-22 01:10:13537
Junio C Hamano1aa40d22010-01-21 17:46:43538The 'git grep' command can search for strings in any version of your
Junio C Hamano6f8a7902006-05-22 01:10:13539project, so
540
541-------------------------------------
542$ git grep "hello" v2.5
543-------------------------------------
544
Junio C Hamano341071d2006-06-04 07:24:48545searches for all occurrences of "hello" in v2.5.
Junio C Hamano6f8a7902006-05-22 01:10:13546
Junio C Hamano1aa40d22010-01-21 17:46:43547If you leave out the commit name, 'git grep' will search any of the
Junio C Hamano6f8a7902006-05-22 01:10:13548files it manages in your current directory. So
549
550-------------------------------------
551$ git grep "hello"
552-------------------------------------
553
554is a quick way to search just the files that are tracked by git.
555
556Many git commands also take sets of commits, which can be specified
Junio C Hamano1aa40d22010-01-21 17:46:43557in a number of ways. Here are some examples with 'git log':
Junio C Hamano6f8a7902006-05-22 01:10:13558
559-------------------------------------
560$ git log v2.5..v2.6 # commits between v2.5 and v2.6
561$ git log v2.5.. # commits since v2.5
562$ git log --since="2 weeks ago" # commits from the last 2 weeks
563$ git log v2.5.. Makefile # commits since v2.5 which modify
564# Makefile
565-------------------------------------
566
Junio C Hamano1aa40d22010-01-21 17:46:43567You can also give 'git log' a "range" of commits where the first is not
Junio C Hamano6f8a7902006-05-22 01:10:13568necessarily an ancestor of the second; for example, if the tips of
Junio C Hamano73d812c2009-07-01 02:33:06569the branches "stable" and "master" diverged from a common
Junio C Hamano6f8a7902006-05-22 01:10:13570commit some time ago, then
571
572-------------------------------------
Junio C Hamano73d812c2009-07-01 02:33:06573$ git log stable..master
Junio C Hamano6f8a7902006-05-22 01:10:13574-------------------------------------
575
Junio C Hamano73d812c2009-07-01 02:33:06576will list commits made in the master branch but not in the
Junio C Hamano6f8a7902006-05-22 01:10:13577stable branch, while
578
579-------------------------------------
Junio C Hamano73d812c2009-07-01 02:33:06580$ git log master..stable
Junio C Hamano6f8a7902006-05-22 01:10:13581-------------------------------------
582
583will show the list of commits made on the stable branch but not
Junio C Hamano73d812c2009-07-01 02:33:06584the master branch.
Junio C Hamano6f8a7902006-05-22 01:10:13585
Junio C Hamano1aa40d22010-01-21 17:46:43586The 'git log' command has a weakness: it must present commits in a
Junio C Hamano6f8a7902006-05-22 01:10:13587list. When the history has lines of development that diverged and
Junio C Hamano1aa40d22010-01-21 17:46:43588then merged back together, the order in which 'git log' presents
Junio C Hamano6f8a7902006-05-22 01:10:13589those commits is meaningless.
590
Junio C Hamano4fbdd442009-01-06 05:56:24591Most projects with multiple contributors (such as the Linux kernel,
Junio C Hamanoba4b9282008-07-06 05:20:31592or git itself) have frequent merges, and 'gitk' does a better job of
Junio C Hamano6f8a7902006-05-22 01:10:13593visualizing their history. For example,
594
595-------------------------------------
596$ gitk --since="2 weeks ago" drivers/
597-------------------------------------
598
599allows you to browse any commits from the last 2 weeks of commits
Junio C Hamanobb8fb052006-05-30 07:21:12600that modified files under the "drivers" directory. (Note: you can
601adjust gitk's fonts by holding down the control key while pressing
602"-" or "+".)
Junio C Hamano6f8a7902006-05-22 01:10:13603
604Finally, most commands that take filenames will optionally allow you
605to precede any filename by a commit, to specify a particular version
Junio C Hamanobb8fb052006-05-30 07:21:12606of the file:
Junio C Hamano6f8a7902006-05-22 01:10:13607
608-------------------------------------
609$ git diff v2.5:Makefile HEAD:Makefile.in
610-------------------------------------
Junio C Hamanoc2b0a492006-01-23 07:54:36611
Junio C Hamano1aa40d22010-01-21 17:46:43612You can also use 'git show' to see any such file:
Junio C Hamanobb8fb052006-05-30 07:21:12613
614-------------------------------------
Junio C Hamanoeb692952007-01-03 22:02:12615$ git show v2.5:Makefile
Junio C Hamanobb8fb052006-05-30 07:21:12616-------------------------------------
617
Junio C Hamanoc2b0a492006-01-23 07:54:36618Next Steps
619----------
620
Junio C Hamano6f8a7902006-05-22 01:10:13621This tutorial should be enough to perform basic distributed revision
622control for your projects. However, to fully understand the depth
623and power of git you need to understand two simple ideas on which it
624is based:
Junio C Hamanoc2b0a492006-01-23 07:54:36625
Junio C Hamano6f8a7902006-05-22 01:10:13626 * The object database is the rather elegant system used to
627 store the history of your project--files, directories, and
628 commits.
629
630 * The index file is a cache of the state of a directory tree,
631 used to create commits, check out working directories, and
632 hold the various trees involved in a merge.
633
Junio C Hamanofce7c7e2008-07-02 03:06:38634Part two of this tutorial explains the object
Junio C Hamano6f8a7902006-05-22 01:10:13635database, the index file, and a few other odds and ends that you'll
Junio C Hamanofce7c7e2008-07-02 03:06:38636need to make the most of git. You can find it at linkgit:gittutorial-2[7].
Junio C Hamano6f8a7902006-05-22 01:10:13637
Junio C Hamanoed7f4f62007-05-20 09:09:09638If you don't want to continue with that right away, a few other
Junio C Hamano6f8a7902006-05-22 01:10:13639digressions that may be interesting at this point are:
Junio C Hamanoc2b0a492006-01-23 07:54:36640
Junio C Hamano35738e82008-01-07 07:55:46641 * linkgit:git-format-patch[1], linkgit:git-am[1]: These convert
Junio C Hamanoc2b0a492006-01-23 07:54:36642 series of git commits into emailed patches, and vice versa,
Junio C Hamano4fbdd442009-01-06 05:56:24643 useful for projects such as the Linux kernel which rely heavily
Junio C Hamanoc2b0a492006-01-23 07:54:36644 on emailed patches.
645
Junio C Hamano35738e82008-01-07 07:55:46646 * linkgit:git-bisect[1]: When there is a regression in your
Junio C Hamanoc2b0a492006-01-23 07:54:36647 project, one way to track down the bug is by searching through
648 the history to find the exact commit that's to blame. Git bisect
649 can help you perform a binary search for that commit. It is
650 smart enough to perform a close-to-optimal search even in the
651 case of complex non-linear history with lots of merged branches.
652
Junio C Hamano804b5212009-06-07 16:05:03653 * linkgit:gitworkflows[7]: Gives an overview of recommended
654 workflows.
655
Junio C Hamano341071d2006-06-04 07:24:48656 * link:everyday.html[Everyday GIT with 20 Commands Or So]
Junio C Hamano6f8a7902006-05-22 01:10:13657
Junio C Hamanofce7c7e2008-07-02 03:06:38658 * linkgit:gitcvs-migration[7]: Git for CVS users.
Junio C Hamanodfccbb02008-05-26 01:16:14659
660SEE ALSO
661--------
662linkgit:gittutorial-2[7],
663linkgit:gitcvs-migration[7],
Junio C Hamano9e1793f2008-06-02 07:31:16664linkgit:gitcore-tutorial[7],
665linkgit:gitglossary[7],
Junio C Hamanof66ecee2008-11-17 18:25:43666linkgit:git-help[1],
Junio C Hamano804b5212009-06-07 16:05:03667linkgit:gitworkflows[7],
Junio C Hamanodfccbb02008-05-26 01:16:14668link:everyday.html[Everyday git],
669link:user-manual.html[The Git User's Manual]
670
671GIT
672---
Junio C Hamanof7c042d2008-06-06 22:50:53673Part of the linkgit:git[1] suite.