1 A tutorial introduction to git
2 ==============================
4 This tutorial explains how to import a new project into git, make
5 changes to it, and share changes with other developers.
7 First, note that you can get documentation for a command such as "git
10 ------------------------------------------------
12 ------------------------------------------------
14 Importing a new project
15 -----------------------
17 Assume you have a tarball project.tar.gz with your initial work. You
18 can place it under git revision control as follows.
20 ------------------------------------------------
21 $ tar xzf project.tar.gz
24 ------------------------------------------------
28 ------------------------------------------------
29 defaulting to local storage area
30 ------------------------------------------------
32 You've now initialized the working directory--you may notice a new
33 directory created, named ".git". Tell git that you want it to track
34 every file under the current directory with
36 ------------------------------------------------
38 ------------------------------------------------
42 ------------------------------------------------
44 ------------------------------------------------
46 will prompt you for a commit message, then record the current state
47 of all the files to the repository.
49 Try modifying some files, then run
51 ------------------------------------------------
53 ------------------------------------------------
55 to review your changes. When you're done,
57 ------------------------------------------------
59 ------------------------------------------------
61 will again prompt your for a message describing the change, and then
62 record the new versions of the modified files.
64 A note on commit messages: Though not required, it's a good idea to
65 begin the commit message with a single short (less than 50 character)
66 line summarizing the change, followed by a blank line and then a more
67 thorough description. Tools that turn commits into email, for
68 example, use the first line on the Subject line and the rest of the
71 To add a new file, first create the file, then
73 ------------------------------------------------
74 $ git add path/to/new/file
75 ------------------------------------------------
77 then commit as usual. No special command is required when removing a
78 file; just remove it, then commit.
80 At any point you can view the history of your changes using
82 ------------------------------------------------
84 ------------------------------------------------
86 If you also want to see complete diffs at each step, use
88 ------------------------------------------------
90 ------------------------------------------------
95 A single git repository can maintain multiple branches of
96 development. To create a new branch named "experimental", use
98 ------------------------------------------------
99 $ git branch experimental
100 ------------------------------------------------
104 ------------------------------------------------
106 ------------------------------------------------
108 you'll get a list of all existing branches:
110 ------------------------------------------------
113 ------------------------------------------------
115 The "experimental" branch is the one you just created, and the
116 "master" branch is a default branch that was created for you
117 automatically. The asterisk marks the branch you are currently on;
120 ------------------------------------------------
121 $ git checkout experimental
122 ------------------------------------------------
124 to switch to the experimental branch. Now edit a file, commit the
125 change, and switch back to the master branch:
127 ------------------------------------------------
130 $ git checkout master
131 ------------------------------------------------
133 Check that the change you made is no longer visible, since it was
134 made on the experimental branch and you're back on the master branch.
136 You can make a different change on the master branch:
138 ------------------------------------------------
141 ------------------------------------------------
143 at this point the two branches have diverged, with different changes
144 made in each. To merge the changes made in experimental into master, run
146 ------------------------------------------------
147 $ git pull . experimental
148 ------------------------------------------------
150 If the changes don't conflict, you're done. If there are conflicts,
151 markers will be left in the problematic files showing the conflict;
153 ------------------------------------------------
155 ------------------------------------------------
157 will show this. Once you've edited the files to resolve the
160 ------------------------------------------------
162 ------------------------------------------------
164 will commit the result of the merge. Finally,
166 ------------------------------------------------
168 ------------------------------------------------
170 will show a nice graphical representation of the resulting history.
172 If you develop on a branch crazy-idea, then regret it, you can always
173 delete the branch with
175 -------------------------------------
176 $ git branch -D crazy-idea
177 -------------------------------------
179 Branches are cheap and easy, so this is a good way to try something
182 Using git for collaboration
183 ---------------------------
185 Suppose that Alice has started a new project with a git repository in
186 /home/alice/project, and that Bob, who has a home directory on the
187 same machine, wants to contribute.
191 ------------------------------------------------
192 $ git clone /home/alice/project myrepo
193 ------------------------------------------------
195 This creates a new directory "myrepo" containing a clone of Alice's
196 repository. The clone is on an equal footing with the original
197 project, possessing its own copy of the original project's history.
199 Bob then makes some changes and commits them:
201 ------------------------------------------------
204 (repeat as necessary)
205 ------------------------------------------------
207 When he's ready, he tells Alice to pull changes from the repository
208 at /home/bob/myrepo. She does this with:
210 ------------------------------------------------
211 $ cd /home/alice/project
212 $ git pull /home/bob/myrepo master
213 ------------------------------------------------
215 This merges the changes from Bob's "master" branch into Alice's
216 current branch. If Alice has made her own changes in the meantime,
217 then she may need to manually fix any conflicts. (Note that the
218 "master" argument in the above command is actually unnecessary, as it
221 The "pull" command thus performs two operations: it fetches changes
222 from a remote branch, then merges them into the current branch.
224 You can perform the first operation alone using the "git fetch"
225 command. For example, Alice could create a temporary branch just to
226 track Bob's changes, without merging them with her own, using:
228 -------------------------------------
229 $ git fetch /home/bob/myrepo master:bob-incoming
230 -------------------------------------
232 which fetches the changes from Bob's master branch into a new branch
233 named bob-incoming. Then
235 -------------------------------------
236 $ git log -p master..bob-incoming
237 -------------------------------------
239 shows a list of all the changes that Bob made since he branched from
240 Alice's master branch.
242 After examining those changes, and possibly fixing things, Alice
243 could pull the changes into her master branch:
245 -------------------------------------
246 $ git checkout master
247 $ git pull . bob-incoming
248 -------------------------------------
250 The last command is a pull from the "bob-incoming" branch in Alice's
253 Alice could also perform both steps at once with:
255 -------------------------------------
256 $ git pull /home/bob/myrepo master:bob-incoming
257 -------------------------------------
259 This is just like the "git pull /home/bob/myrepo master" that we saw
260 before, except that it also stores the unmerged changes from bob's
261 master branch in bob-incoming before merging them into Alice's
262 current branch. Note that git pull always merges into the current
263 branch, regardless of what else is given on the commandline.
265 Later, Bob can update his repo with Alice's latest changes using
267 -------------------------------------
269 -------------------------------------
271 Note that he doesn't need to give the path to Alice's repository;
272 when Bob cloned Alice's repository, git stored the location of her
273 repository in the file .git/remotes/origin, and that location is used
274 as the default for pulls.
276 Bob may also notice a branch in his repository that he didn't create:
278 -------------------------------------
282 -------------------------------------
284 The "origin" branch, which was created automatically by "git clone",
285 is a pristine copy of Alice's master branch; Bob should never commit
288 If Bob later decides to work from a different host, he can still
289 perform clones and pulls using the ssh protocol:
291 -------------------------------------
292 $ git clone alice.org:/home/alice/project myrepo
293 -------------------------------------
295 Alternatively, git has a native protocol, or can use rsync or http;
296 see gitlink:git-pull[1] for details.
298 Git can also be used in a CVS-like mode, with a central repository
299 that various users push changes to; see gitlink:git-push[1] and
300 link:cvs-migration.html[git for CVS users].
305 Git history is represented as a series of interrelated commits. We
306 have already seen that the git log command can list those commits.
307 Note that first line of each git log entry also gives a name for the
310 -------------------------------------
312 commit c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
313 Author: Junio C Hamano <junkio@cox.net>
314 Date: Tue May 16 17:18:22 2006 -0700
316 merge-base: Clarify the comments on post processing.
317 -------------------------------------
319 We can give this name to git show to see the details about this
322 -------------------------------------
323 $ git show c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
324 -------------------------------------
326 But there other ways to refer to commits. You can use any initial
327 part of the name that is long enough to uniquely identify the commit:
329 -------------------------------------
330 $ git show c82a22c39c # the first few characters of the name are
332 $ git show HEAD # the tip of the current branch
333 $ git show experimental # the tip of the "experimental" branch
334 -------------------------------------
336 Every commit has at least one "parent" commit, which points to the
337 previous state of the project:
339 -------------------------------------
340 $ git show HEAD^ # to see the parent of HEAD
341 $ git show HEAD^^ # to see the grandparent of HEAD
342 $ git show HEAD~4 # to see the great-great grandparent of HEAD
343 -------------------------------------
345 Note that merge commits may have more than one parent:
347 -------------------------------------
348 $ git show HEAD^1 # show the first parent of HEAD (same as HEAD^)
349 $ git show HEAD^2 # show the second parent of HEAD
350 -------------------------------------
352 You can also give commits names of your own; after running
354 -------------------------------------
355 $ git-tag v2.5 1b2e1d63ff
356 -------------------------------------
358 you can refer to 1b2e1d63ff by the name "v2.5". If you intend to
359 share this name with other people (for example, to identify a release
360 version), you should create a "tag" object, and perhaps sign it; see
361 gitlink:git-tag[1] for details.
363 Any git command that needs to know a commit can take any of these
366 -------------------------------------
367 $ git diff v2.5 HEAD # compare the current HEAD to v2.5
368 $ git branch stable v2.5 # start a new branch named "stable" based
370 $ git reset --hard HEAD^ # reset your current branch and working
371 # directory to its state at HEAD^
372 -------------------------------------
374 Be careful with that last command: in addition to losing any changes
375 in the working directory, it will also remove all later commits from
376 this branch. If this branch is the only branch containing those
377 commits, they will be lost. (Also, don't use "git reset" on a
378 publicly-visible branch that other developers pull from, as git will
379 be confused by history that disappears in this way.)
381 The git grep command can search for strings in any version of your
384 -------------------------------------
385 $ git grep "hello" v2.5
386 -------------------------------------
388 searches for all occurrences of "hello" in v2.5.
390 If you leave out the commit name, git grep will search any of the
391 files it manages in your current directory. So
393 -------------------------------------
395 -------------------------------------
397 is a quick way to search just the files that are tracked by git.
399 Many git commands also take sets of commits, which can be specified
400 in a number of ways. Here are some examples with git log:
402 -------------------------------------
403 $ git log v2.5..v2.6 # commits between v2.5 and v2.6
404 $ git log v2.5.. # commits since v2.5
405 $ git log --since="2 weeks ago" # commits from the last 2 weeks
406 $ git log v2.5.. Makefile # commits since v2.5 which modify
408 -------------------------------------
410 You can also give git log a "range" of commits where the first is not
411 necessarily an ancestor of the second; for example, if the tips of
412 the branches "stable-release" and "master" diverged from a common
413 commit some time ago, then
415 -------------------------------------
416 $ git log stable..experimental
417 -------------------------------------
419 will list commits made in the experimental branch but not in the
422 -------------------------------------
423 $ git log experimental..stable
424 -------------------------------------
426 will show the list of commits made on the stable branch but not
427 the experimental branch.
429 The "git log" command has a weakness: it must present commits in a
430 list. When the history has lines of development that diverged and
431 then merged back together, the order in which "git log" presents
432 those commits is meaningless.
434 Most projects with multiple contributors (such as the linux kernel,
435 or git itself) have frequent merges, and gitk does a better job of
436 visualizing their history. For example,
438 -------------------------------------
439 $ gitk --since="2 weeks ago" drivers/
440 -------------------------------------
442 allows you to browse any commits from the last 2 weeks of commits
443 that modified files under the "drivers" directory. (Note: you can
444 adjust gitk's fonts by holding down the control key while pressing
447 Finally, most commands that take filenames will optionally allow you
448 to precede any filename by a commit, to specify a particular version
451 -------------------------------------
452 $ git diff v2.5:Makefile HEAD:Makefile.in
453 -------------------------------------
455 You can also use "git cat-file -p" to see any such file:
457 -------------------------------------
458 $ git cat-file -p v2.5:Makefile
459 -------------------------------------
464 This tutorial should be enough to perform basic distributed revision
465 control for your projects. However, to fully understand the depth
466 and power of git you need to understand two simple ideas on which it
469 * The object database is the rather elegant system used to
470 store the history of your project--files, directories, and
473 * The index file is a cache of the state of a directory tree,
474 used to create commits, check out working directories, and
475 hold the various trees involved in a merge.
477 link:tutorial-2.html[Part two of this tutorial] explains the object
478 database, the index file, and a few other odds and ends that you'll
479 need to make the most of git.
481 If you don't want to consider with that right away, a few other
482 digressions that may be interesting at this point are:
484 * gitlink:git-format-patch[1], gitlink:git-am[1]: These convert
485 series of git commits into emailed patches, and vice versa,
486 useful for projects such as the linux kernel which rely heavily
489 * gitlink:git-bisect[1]: When there is a regression in your
490 project, one way to track down the bug is by searching through
491 the history to find the exact commit that's to blame. Git bisect
492 can help you perform a binary search for that commit. It is
493 smart enough to perform a close-to-optimal search even in the
494 case of complex non-linear history with lots of merged branches.
496 * link:everyday.html[Everyday GIT with 20 Commands Or So]
498 * link:cvs-migration.html[git for CVS users].