Kernel Hackers' Guide to git [zt]
http://linux.yyz.us/git-howto.htmlThis tutorial is a cookbook of recipes getting up and running with Linus's source code management (SCM) software, "git."Its targetted mainly at Linux kernel hackers, though others may find it useful.
Table of Contents
[*]Getting Started
[*]Installing git
[*]First kernel tree download
[*]Basic tasks
[*]Download remote tree updates
[*]Undo all working dir modifications
[*]Undo recent commits
[*]Check in changes
[*]Generate diff of working dir changes
[*]Generate summary of working dir changes
[*]List all changeset descriptions
[*]List all changeset descriptionsbelonging to a specific file
[*]Branches
[*]List all branches
[*]Switch working dir to new branch
[*]Create new branch
[*]List current branch
[*]Diff against master branch
[*]List changes present only on local branch
[*]Merge changes from one branch into another
[*]Misc. debris
[*]Check out an older kernel version
[*]Apply mailbox full of patches
[*]Download tags periodically
[*]Create a tag
[*]Further reading
Getting StartedInstalling git git requires bootstrapping, since you must have git installed in order to check out git.git (git repository), and linux-2.6.git (kernel repository).You may find that your distribution already provides a usable version of git.If so, try that first.
[*]Fedora 7 and later:The git-core package is available through the standard package repositories.Fedora Core 3 through 6: git-core package is in Fedora Extras. yum install git-core
If your distro does not package git, you may download the latest stable> http://www.kernel.org/pub/software/scm/git/
tarball build-deps:zlib, libcurl, libcrypto (openssl)
install tarball:
unpack && make prefix=/usr/local && sudo make prefix=/usr/local install After reading the rest of this document, come back and update your copy of git to the latest: git://git.kernel.org/pub/scm/git/git.git
Download a linux kernel tree for the very first time$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6 NOTE:The kernel tree is very large.This constitutes downloading just over 300 megabytes of compressed data (as of Jun 2008).
Basic TasksUpdate local kernel tree to latest 2.6.x upstream ("fast-forward merge")$ cd linux-2.6 $ git pull git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
or more simply, to pull from the location from which you cloned:
$ cd linux-2.6 $ git pullto pull from the origin repository from which you originally cloned the tree.Undo all local modifications:$ git checkout -fCheck in your own modifications (e.g. do some hacking, or apply a patch)# go to repository
$ cd linux-2.6
# make some modifications
$ vi drivers/net/sk98lin/skdim.c
# NOTE: Run git-add and git-rm if adding or removing files.
# check in all modifications
$ git commit -aUndo recent commits:
Sometimes you have made a few commits, or just pulled a change, and simply want those commits to go away.
$ cd my-kernel-tree-2.6 $ git reset HEAD~2 # make last 2 commits disappear
will "disappear" the top two commits.DO NOT do this, if anyone has downloaded a tree containing the commits you just eliminated.
Note that this is quite different from git revert, which applies a reversed patch as an additional commit.
List all changes in working dir, in diff format. Display changes since last git-add or git-rm:
$ git diff Display changes since last commit:
$ git diff HEADObtain summary of all changes in working dir$ git statusList all changeset descriptions$ git logThe git-log option "-p" shows diffs in addition to changeset text.The option "--stat" shows the diffstat in addition to the changeset text.List all changesets belonging to a specific file(in this case, net/ieee80211/ieee80211_module.c)$ git log net/ieee80211/ieee80211_module.cBranchesList all branches$ git branchMake desired branch current in working directory$ git checkout $branchCreate a new branch, and make it current$ git checkout -b my-new-branch-name masterExamine which branch is current$ git status (git-branch also shows you the current branch, using a "*" to indicate this)
Obtain a diff between current branch, and master branch In most trees with branches, .git/refs/heads/master contains the current 'vanilla' upstream tree, for easy diffing and merging.(in trees without branches, 'master' simply contains your latest changes)
$ git diff master..HEAD (this is equivalent to git diff HEAD, when used with HEAD branch)
Obtain a list of changes between current branch, and master branch$ git log master..HEAD (this is equivalent to git log, when used with HEAD)
or rather than full changeset descriptions, obtain a one-line summary of each changes:$ git shortlog master..HEADMerge changes from one branch into anotherLet us suppose that you do work on branch A and branch B, and after work on those two branches is complete, you merge the work into mainline branch M.$ git checkout M # switch to branch M $ git merge A# merge A into M
$ git merge B# merge B into M
Misc. DebrisOptimize your repository git is heavily optimized for fast storage and retrieval on a per-command basis.However, over a long period of time, it can be useful to perform further optimizations, including packing all git objects into single "packfile" for fast retrieval and less wasted disk space.
$ cd my-kernel-tree-2.6 $ git gc
will optimize your repository.You don't need to run this frequently — git is quite fast even without it.See the git-gc man page for more details.
Check out an older kernel version$ cd my-kernel-tree-2.6 $ git checkout -b tmp v2.6.22
This creates a temporary branch 'tmp', with the contents of kernel version 2.6.22.
Apply all patches in a Berkeley mbox-format file First, make sure that the tools subdirectory of the git-core repository is in your PATH.
$ cd my-kernel-tree-2.6 $ git-am --utf8 --signoff /path/to/mbox
The file /path/to/mbox is a Berkeley mbox file, containing one or more patches to be committed to the git repository.The --signoff option indicates that git-am should append the
Signed-off-by: Your Name
line that is common to almost all kernel submissions.The name and email address are taken from the GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL environment variables (I recommend setting these in your .bash_profile or similar file).
Don't forget to download tags from time to time. git pull only downloads sha1-indexed object data, and the requested remote head.This misses updates to the .git/refs/tags/ and .git/refs/heads/ directories.For tags, run git fetch --tags $URL.
Tag a particular commit. For your own repositories, you may wish to give interesting or significant commits a name, known as a tag.The Linux kernel uses tags to for each kernel version:"v2.6.21", "v2.6.22", etc.
$ cd my-kernel-tree-2.6 $ git tag my-tag
creates a new tag named "my-tag", based on the current commit.You can do a lot more with tagging, including GPG-signing, so read the man page for more details.
Further reading Another good introduction is the official git tutorial, followed by the more in-depth git man page documentation.
页:
[1]