123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678 |
- gittutorial(7)
- ==============
- NAME
- ----
- gittutorial - A tutorial introduction to Git
- SYNOPSIS
- --------
- [verse]
- git *
- DESCRIPTION
- -----------
- This tutorial explains how to import a new project into Git, make
- changes to it, and share changes with other developers.
- If you are instead primarily interested in using Git to fetch a project,
- for example, to test the latest version, you may prefer to start with
- the first two chapters of link:user-manual.html[The Git User's Manual].
- First, note that you can get documentation for a command such as
- `git log --graph` with:
- ------------------------------------------------
- $ man git-log
- ------------------------------------------------
- or:
- ------------------------------------------------
- $ git help log
- ------------------------------------------------
- With the latter, you can use the manual viewer of your choice; see
- linkgit:git-help[1] for more information.
- It is a good idea to introduce yourself to Git with your name and
- public email address before doing any operation. The easiest
- way to do so is:
- ------------------------------------------------
- $ git config --global user.name "Your Name Comes Here"
- $ git config --global user.email you@yourdomain.example.com
- ------------------------------------------------
- Importing a new project
- -----------------------
- Assume you have a tarball project.tar.gz with your initial work. You
- can place it under Git revision control as follows.
- ------------------------------------------------
- $ tar xzf project.tar.gz
- $ cd project
- $ git init
- ------------------------------------------------
- Git will reply
- ------------------------------------------------
- Initialized empty Git repository in .git/
- ------------------------------------------------
- You've now initialized the working directory--you may notice a new
- directory created, named ".git".
- Next, tell Git to take a snapshot of the contents of all files under the
- current directory (note the '.'), with 'git add':
- ------------------------------------------------
- $ git add .
- ------------------------------------------------
- This snapshot is now stored in a temporary staging area which Git calls
- the "index". You can permanently store the contents of the index in the
- repository with 'git commit':
- ------------------------------------------------
- $ git commit
- ------------------------------------------------
- This will prompt you for a commit message. You've now stored the first
- version of your project in Git.
- Making changes
- --------------
- Modify some files, then add their updated contents to the index:
- ------------------------------------------------
- $ git add file1 file2 file3
- ------------------------------------------------
- You are now ready to commit. You can see what is about to be committed
- using 'git diff' with the --cached option:
- ------------------------------------------------
- $ git diff --cached
- ------------------------------------------------
- (Without --cached, 'git diff' will show you any changes that
- you've made but not yet added to the index.) You can also get a brief
- summary of the situation with 'git status':
- ------------------------------------------------
- $ git status
- On branch master
- Changes to be committed:
- Your branch is up to date with 'origin/master'.
- (use "git restore --staged <file>..." to unstage)
- modified: file1
- modified: file2
- modified: file3
- ------------------------------------------------
- If you need to make any further adjustments, do so now, and then add any
- newly modified content to the index. Finally, commit your changes with:
- ------------------------------------------------
- $ git commit
- ------------------------------------------------
- This will again prompt you for a message describing the change, and then
- record a new version of the project.
- Alternatively, instead of running 'git add' beforehand, you can use
- ------------------------------------------------
- $ git commit -a
- ------------------------------------------------
- which will automatically notice any modified (but not new) files, add
- them to the index, and commit, all in one step.
- A note on commit messages: Though not required, it's a good idea to
- begin the commit message with a single short (less than 50 character)
- line summarizing the change, followed by a blank line and then a more
- thorough description. The text up to the first blank line in a commit
- message is treated as the commit title, and that title is used
- throughout Git. For example, linkgit:git-format-patch[1] turns a
- commit into email, and it uses the title on the Subject line and the
- rest of the commit in the body.
- Git tracks content not files
- ----------------------------
- Many revision control systems provide an `add` command that tells the
- system to start tracking changes to a new file. Git's `add` command
- does something simpler and more powerful: 'git add' is used both for new
- and newly modified files, and in both cases it takes a snapshot of the
- given files and stages that content in the index, ready for inclusion in
- the next commit.
- Viewing project history
- -----------------------
- At any point you can view the history of your changes using
- ------------------------------------------------
- $ git log
- ------------------------------------------------
- If you also want to see complete diffs at each step, use
- ------------------------------------------------
- $ git log -p
- ------------------------------------------------
- Often the overview of the change is useful to get a feel of
- each step
- ------------------------------------------------
- $ git log --stat --summary
- ------------------------------------------------
- Managing branches
- -----------------
- A single Git repository can maintain multiple branches of
- development. To create a new branch named "experimental", use
- ------------------------------------------------
- $ git branch experimental
- ------------------------------------------------
- If you now run
- ------------------------------------------------
- $ git branch
- ------------------------------------------------
- you'll get a list of all existing branches:
- ------------------------------------------------
- experimental
- * master
- ------------------------------------------------
- The "experimental" branch is the one you just created, and the
- "master" branch is a default branch that was created for you
- automatically. The asterisk marks the branch you are currently on;
- type
- ------------------------------------------------
- $ git switch experimental
- ------------------------------------------------
- to switch to the experimental branch. Now edit a file, commit the
- change, and switch back to the master branch:
- ------------------------------------------------
- (edit file)
- $ git commit -a
- $ git switch master
- ------------------------------------------------
- Check that the change you made is no longer visible, since it was
- made on the experimental branch and you're back on the master branch.
- You can make a different change on the master branch:
- ------------------------------------------------
- (edit file)
- $ git commit -a
- ------------------------------------------------
- at this point the two branches have diverged, with different changes
- made in each. To merge the changes made in experimental into master, run
- ------------------------------------------------
- $ git merge experimental
- ------------------------------------------------
- If the changes don't conflict, you're done. If there are conflicts,
- markers will be left in the problematic files showing the conflict;
- ------------------------------------------------
- $ git diff
- ------------------------------------------------
- will show this. Once you've edited the files to resolve the
- conflicts,
- ------------------------------------------------
- $ git commit -a
- ------------------------------------------------
- will commit the result of the merge. Finally,
- ------------------------------------------------
- $ gitk
- ------------------------------------------------
- will show a nice graphical representation of the resulting history.
- At this point you could delete the experimental branch with
- ------------------------------------------------
- $ git branch -d experimental
- ------------------------------------------------
- This command ensures that the changes in the experimental branch are
- already in the current branch.
- If you develop on a branch crazy-idea, then regret it, you can always
- delete the branch with
- -------------------------------------
- $ git branch -D crazy-idea
- -------------------------------------
- Branches are cheap and easy, so this is a good way to try something
- out.
- Using Git for collaboration
- ---------------------------
- Suppose that Alice has started a new project with a Git repository in
- /home/alice/project, and that Bob, who has a home directory on the
- same machine, wants to contribute.
- Bob begins with:
- ------------------------------------------------
- bob$ git clone /home/alice/project myrepo
- ------------------------------------------------
- This creates a new directory "myrepo" containing a clone of Alice's
- repository. The clone is on an equal footing with the original
- project, possessing its own copy of the original project's history.
- Bob then makes some changes and commits them:
- ------------------------------------------------
- (edit files)
- bob$ git commit -a
- (repeat as necessary)
- ------------------------------------------------
- When he's ready, he tells Alice to pull changes from the repository
- at /home/bob/myrepo. She does this with:
- ------------------------------------------------
- alice$ cd /home/alice/project
- alice$ git pull /home/bob/myrepo master
- ------------------------------------------------
- This merges the changes from Bob's "master" branch into Alice's
- current branch. If Alice has made her own changes in the meantime,
- then she may need to manually fix any conflicts.
- The "pull" command thus performs two operations: it fetches changes
- from a remote branch, then merges them into the current branch.
- Note that in general, Alice would want her local changes committed before
- initiating this "pull". If Bob's work conflicts with what Alice did since
- their histories forked, Alice will use her working tree and the index to
- resolve conflicts, and existing local changes will interfere with the
- conflict resolution process (Git will still perform the fetch but will
- refuse to merge --- Alice will have to get rid of her local changes in
- some way and pull again when this happens).
- Alice can peek at what Bob did without merging first, using the "fetch"
- command; this allows Alice to inspect what Bob did, using a special
- symbol "FETCH_HEAD", in order to determine if he has anything worth
- pulling, like this:
- ------------------------------------------------
- alice$ git fetch /home/bob/myrepo master
- alice$ git log -p HEAD..FETCH_HEAD
- ------------------------------------------------
- This operation is safe even if Alice has uncommitted local changes.
- The range notation "HEAD..FETCH_HEAD" means "show everything that is reachable
- from the FETCH_HEAD but exclude anything that is reachable from HEAD".
- Alice already knows everything that leads to her current state (HEAD),
- and reviews what Bob has in his state (FETCH_HEAD) that she has not
- seen with this command.
- If Alice wants to visualize what Bob did since their histories forked
- she can issue the following command:
- ------------------------------------------------
- $ gitk HEAD..FETCH_HEAD
- ------------------------------------------------
- This uses the same two-dot range notation we saw earlier with 'git log'.
- Alice may want to view what both of them did since they forked.
- She can use three-dot form instead of the two-dot form:
- ------------------------------------------------
- $ gitk HEAD...FETCH_HEAD
- ------------------------------------------------
- This means "show everything that is reachable from either one, but
- exclude anything that is reachable from both of them".
- Please note that these range notation can be used with both gitk
- and "git log".
- After inspecting what Bob did, if there is nothing urgent, Alice may
- decide to continue working without pulling from Bob. If Bob's history
- does have something Alice would immediately need, Alice may choose to
- stash her work-in-progress first, do a "pull", and then finally unstash
- her work-in-progress on top of the resulting history.
- When you are working in a small closely knit group, it is not
- unusual to interact with the same repository over and over
- again. By defining 'remote' repository shorthand, you can make
- it easier:
- ------------------------------------------------
- alice$ git remote add bob /home/bob/myrepo
- ------------------------------------------------
- With this, Alice can perform the first part of the "pull" operation
- alone using the 'git fetch' command without merging them with her own
- branch, using:
- -------------------------------------
- alice$ git fetch bob
- -------------------------------------
- Unlike the longhand form, when Alice fetches from Bob using a
- remote repository shorthand set up with 'git remote', what was
- fetched is stored in a remote-tracking branch, in this case
- `bob/master`. So after this:
- -------------------------------------
- alice$ git log -p master..bob/master
- -------------------------------------
- shows a list of all the changes that Bob made since he branched from
- Alice's master branch.
- After examining those changes, Alice
- could merge the changes into her master branch:
- -------------------------------------
- alice$ git merge bob/master
- -------------------------------------
- This `merge` can also be done by 'pulling from her own remote-tracking
- branch', like this:
- -------------------------------------
- alice$ git pull . remotes/bob/master
- -------------------------------------
- Note that git pull always merges into the current branch,
- regardless of what else is given on the command line.
- Later, Bob can update his repo with Alice's latest changes using
- -------------------------------------
- bob$ git pull
- -------------------------------------
- Note that he doesn't need to give the path to Alice's repository;
- when Bob cloned Alice's repository, Git stored the location of her
- repository in the repository configuration, and that location is
- used for pulls:
- -------------------------------------
- bob$ git config --get remote.origin.url
- /home/alice/project
- -------------------------------------
- (The complete configuration created by 'git clone' is visible using
- `git config -l`, and the linkgit:git-config[1] man page
- explains the meaning of each option.)
- Git also keeps a pristine copy of Alice's master branch under the
- name "origin/master":
- -------------------------------------
- bob$ git branch -r
- origin/master
- -------------------------------------
- If Bob later decides to work from a different host, he can still
- perform clones and pulls using the ssh protocol:
- -------------------------------------
- bob$ git clone alice.org:/home/alice/project myrepo
- -------------------------------------
- Alternatively, Git has a native protocol, or can use http;
- see linkgit:git-pull[1] for details.
- Git can also be used in a CVS-like mode, with a central repository
- that various users push changes to; see linkgit:git-push[1] and
- linkgit:gitcvs-migration[7].
- Exploring history
- -----------------
- Git history is represented as a series of interrelated commits. We
- have already seen that the 'git log' command can list those commits.
- Note that first line of each git log entry also gives a name for the
- commit:
- -------------------------------------
- $ git log
- commit c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
- Author: Junio C Hamano <junkio@cox.net>
- Date: Tue May 16 17:18:22 2006 -0700
- merge-base: Clarify the comments on post processing.
- -------------------------------------
- We can give this name to 'git show' to see the details about this
- commit.
- -------------------------------------
- $ git show c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
- -------------------------------------
- But there are other ways to refer to commits. You can use any initial
- part of the name that is long enough to uniquely identify the commit:
- -------------------------------------
- $ git show c82a22c39c # the first few characters of the name are
- # usually enough
- $ git show HEAD # the tip of the current branch
- $ git show experimental # the tip of the "experimental" branch
- -------------------------------------
- Every commit usually has one "parent" commit
- which points to the previous state of the project:
- -------------------------------------
- $ git show HEAD^ # to see the parent of HEAD
- $ git show HEAD^^ # to see the grandparent of HEAD
- $ git show HEAD~4 # to see the great-great grandparent of HEAD
- -------------------------------------
- Note that merge commits may have more than one parent:
- -------------------------------------
- $ git show HEAD^1 # show the first parent of HEAD (same as HEAD^)
- $ git show HEAD^2 # show the second parent of HEAD
- -------------------------------------
- You can also give commits names of your own; after running
- -------------------------------------
- $ git tag v2.5 1b2e1d63ff
- -------------------------------------
- you can refer to 1b2e1d63ff by the name "v2.5". If you intend to
- share this name with other people (for example, to identify a release
- version), you should create a "tag" object, and perhaps sign it; see
- linkgit:git-tag[1] for details.
- Any Git command that needs to know a commit can take any of these
- names. For example:
- -------------------------------------
- $ git diff v2.5 HEAD # compare the current HEAD to v2.5
- $ git branch stable v2.5 # start a new branch named "stable" based
- # at v2.5
- $ git reset --hard HEAD^ # reset your current branch and working
- # directory to its state at HEAD^
- -------------------------------------
- Be careful with that last command: in addition to losing any changes
- in the working directory, it will also remove all later commits from
- this branch. If this branch is the only branch containing those
- commits, they will be lost. Also, don't use 'git reset' on a
- publicly-visible branch that other developers pull from, as it will
- force needless merges on other developers to clean up the history.
- If you need to undo changes that you have pushed, use 'git revert'
- instead.
- The 'git grep' command can search for strings in any version of your
- project, so
- -------------------------------------
- $ git grep "hello" v2.5
- -------------------------------------
- searches for all occurrences of "hello" in v2.5.
- If you leave out the commit name, 'git grep' will search any of the
- files it manages in your current directory. So
- -------------------------------------
- $ git grep "hello"
- -------------------------------------
- is a quick way to search just the files that are tracked by Git.
- Many Git commands also take sets of commits, which can be specified
- in a number of ways. Here are some examples with 'git log':
- -------------------------------------
- $ git log v2.5..v2.6 # commits between v2.5 and v2.6
- $ git log v2.5.. # commits since v2.5
- $ git log --since="2 weeks ago" # commits from the last 2 weeks
- $ git log v2.5.. Makefile # commits since v2.5 which modify
- # Makefile
- -------------------------------------
- You can also give 'git log' a "range" of commits where the first is not
- necessarily an ancestor of the second; for example, if the tips of
- the branches "stable" and "master" diverged from a common
- commit some time ago, then
- -------------------------------------
- $ git log stable..master
- -------------------------------------
- will list commits made in the master branch but not in the
- stable branch, while
- -------------------------------------
- $ git log master..stable
- -------------------------------------
- will show the list of commits made on the stable branch but not
- the master branch.
- The 'git log' command has a weakness: it must present commits in a
- list. When the history has lines of development that diverged and
- then merged back together, the order in which 'git log' presents
- those commits is meaningless.
- Most projects with multiple contributors (such as the Linux kernel,
- or Git itself) have frequent merges, and 'gitk' does a better job of
- visualizing their history. For example,
- -------------------------------------
- $ gitk --since="2 weeks ago" drivers/
- -------------------------------------
- allows you to browse any commits from the last 2 weeks of commits
- that modified files under the "drivers" directory. (Note: you can
- adjust gitk's fonts by holding down the control key while pressing
- "-" or "+".)
- Finally, most commands that take filenames will optionally allow you
- to precede any filename by a commit, to specify a particular version
- of the file:
- -------------------------------------
- $ git diff v2.5:Makefile HEAD:Makefile.in
- -------------------------------------
- You can also use 'git show' to see any such file:
- -------------------------------------
- $ git show v2.5:Makefile
- -------------------------------------
- Next Steps
- ----------
- This tutorial should be enough to perform basic distributed revision
- control for your projects. However, to fully understand the depth
- and power of Git you need to understand two simple ideas on which it
- is based:
- * The object database is the rather elegant system used to
- store the history of your project--files, directories, and
- commits.
- * The index file is a cache of the state of a directory tree,
- used to create commits, check out working directories, and
- hold the various trees involved in a merge.
- Part two of this tutorial explains the object
- database, the index file, and a few other odds and ends that you'll
- need to make the most of Git. You can find it at linkgit:gittutorial-2[7].
- If you don't want to continue with that right away, a few other
- digressions that may be interesting at this point are:
- * linkgit:git-format-patch[1], linkgit:git-am[1]: These convert
- series of git commits into emailed patches, and vice versa,
- useful for projects such as the Linux kernel which rely heavily
- on emailed patches.
- * linkgit:git-bisect[1]: When there is a regression in your
- project, one way to track down the bug is by searching through
- the history to find the exact commit that's to blame. Git bisect
- can help you perform a binary search for that commit. It is
- smart enough to perform a close-to-optimal search even in the
- case of complex non-linear history with lots of merged branches.
- * linkgit:gitworkflows[7]: Gives an overview of recommended
- workflows.
- * linkgit:giteveryday[7]: Everyday Git with 20 Commands Or So.
- * linkgit:gitcvs-migration[7]: Git for CVS users.
- SEE ALSO
- --------
- linkgit:gittutorial-2[7],
- linkgit:gitcvs-migration[7],
- linkgit:gitcore-tutorial[7],
- linkgit:gitglossary[7],
- linkgit:git-help[1],
- linkgit:gitworkflows[7],
- linkgit:giteveryday[7],
- link:user-manual.html[The Git User's Manual]
- GIT
- ---
- Part of the linkgit:git[1] suite
|