QuickStart
From Git SCM Wiki
OBSOLETE CONTENT
This wiki has been archived and the content is no longer updated. Please visit git-scm.com/doc for up-to-date documentation.
Setting up a Git project
If you want to work with an existing project, clone it:
$ git clone <url>
If you do not have an existing git project, create one:
$ cd project/ $ git init # initializes the repository $ git add --all # add those 'unknown' files $ git rm --cached <file>... # undo, in case you forgot .gitignore, and you do not want to start over by removing the .git directory $ git commit # commit all changes, edit changelog entry
Git will look for a file named .gitignore in the root of your repository which contains a set of shell patterns to ignore in file paths.
Inspecting
Git stores commits in a tree structure. Every leaf which is not referred might be garbage collected. The status may be shown, the references listed, as well as the commits
$ git log $ git status $ git show-ref
Different types of references do exist, and the commands to create, move and delete them differ alongside the type:
- heads
- remotes
- stash
- meta
Branching and merging
$ git checkout -b linux-work # create a new branch named "linux-work" $ <make changes> $ git commit -a $ git checkout master # go back to master branch $ git merge linux-work # merge changesets from linux-work (Git >= 1.5) $ git pull . linux-work # merge changesets from linux-work (all Git versions)
Importing patches
$ git apply < ../p/foo.patch $ git commit -a
Exporting a patch
$ <make changes> $ git commit -a -m "commit message" $ git format-patch HEAD^ # creates 0001-commit-message.txt # (HEAD^ means every patch since one revision before the # tip of the branch, also known as HEAD)
Network support
# clone from the primary Git repo $ git clone git://git.kernel.org/pub/scm/git/git.git $ cd git # pushing changes to a remote repo with SSH $ git push user@example.com:my-repository.git/ # fetch changes to a remote branch into a local branch $ git fetch user@example.com:my-repository.git/ remote-branch:local-branch # merge changes from a remote machine bar$ git pull git://foo/repo.git/ branch # Serve repository via git protocol $ cd /my/repository/ $ touch .git/git-daemon-export-ok $ git daemon # now others can fetch from git://your.machine/my/repository/.git/ # Set up a bare (= without working directory) repository (e.g. on a webserver) $ mkdir my-repo.git $ cd my-repo.git $ git --bare init $ chmod a+x hooks/post-update # this is needed for HTTP transport # you need to populate this repository via push
Inspecting revisions
# inspect history visually $ gitk # this opens a Tk window, and shows you how the revisions are connected # inspect history $ git log # this pipes a log of the current branch into your PAGER $ git log -p # ditto, but append a patch after each commit message # inspect a specific commit $ git show HEAD # show commit info, diffstat and patch # of the tip of the current branch
Referring to revisions
# by name $ git log v1.0.0 # show history leading up to tag "v1.0.0" $ git log master # show history of branch "master" # relative to a name $ git show master^ # show parent to last revision of master $ git show master~2 # show grand parent to tip of master $ git show master~3 # show great grand parent to tip of master (you get the idea) # by output of "git describe" $ git show v1.4.4-g730996f # you get this string by calling "git describe" # by hash (internally, all objects are identified by a hash) $ git show f665776185ad074b236c00751d666da7d1977dbe $ git show f665776 # a unique prefix is sufficient # tag a revision $ git tag v1.0.0 # make current HEAD known as "v1.0.0" $ git tag interesting v1.4.4-g730996f # tag a specific revision (not HEAD)
Comparing revisions
# diff between two branches $ git diff origin..master # pipes a diff into PAGER $ git diff origin..master > my.patch # pipes a diff into my.patch # get diffstat of uncommitted work $ git diff --stat HEAD
Cherry picking patches
$ git cherry-pick other-branch~3 # apply 4th last patch of other-branch to current branch