文章摘自: http://git-scm.com/book/zh
第一章 Git的安装
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install git
现在已经可以用
git
命令了,用
git
把 Git 项目仓库克隆到本地,以便日后随时更新:
$ git clone git://git.kernel.org/pub/scm/git/git.git
$ yum install git-core
用户信息
$ git config --global user.name "John Doe"$ git config --global user.email [email protected]
查看配置信息
要检查已有的配置信息,可以使用
git config --list
命令:
第二章 Git仓库常用命令
在工作目录中初始化新仓库
$ git init
如果当前目录下有几个文件想要纳入版本控制,需要先用
git add
命令告诉 Git 开始对这些文件进行跟踪,然后提交:
$ git add *.c$ git add README$ git commit -m 'initial project version'
从现有仓库克隆
比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:
$ git clone git://github.com/schacon/grit.git
如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
$ git clone git://github.com/schacon/grit.git mygrit
检查当前文件状态
要确定哪些文件当前处于什么状态,可以用
git status
命令。如果在克隆仓库之后立即执行此命令,会看到类似这样的输出:
$ git statusOn branch masternothing to commit, working directory clean
跟踪新文件
使用命令
git add
开始跟踪一个新文件。所以,要跟踪 README 文件,运行:
$ git add README
此时再运行
git status
命令,会看到 README 文件已被跟踪,并处于暂存状态:
$ git statusOn branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage) new file: README
忽略某些文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。我们可以创建一个名为
.gitignore
的文件,列出要忽略的文件模式。来看一个实际的例子:
$ cat .gitignore*.[oa]*~
我们再看一个
.gitignore
文件的例子:
# 此为注释 �C 将被 Git 忽略# 忽略所有 .a 结尾的文件*.a# 但 lib.a 除外!lib.a# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO/TODO# 忽略 build/ 目录下的所有文件build/# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txtdoc/*.txt# ignore all .txt files in the doc/ directorydoc/**/*.txt
提交更新
用 -m 参数后跟提交说明的方式,在一行命令中提交更新:
$ git commit -m "Story 182: Fix benchmarks for speed"
移除文件
$ rm grit.gemspec$ git status
On branch masterChanges not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: grit.gemspecno changes added to commit (use "git add" and/or "git commit -a")
然后再运行
git rm
记录此次移除文件的操作:
$ git rm grit.gemspec
rm 'grit.gemspec'
$ git status
On branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage) deleted: grit.gemspec
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在
.gitignore
文件中补上,用
--cached
选项即可:
$ git rm --cached readme.txt
$ git rm log/\*.log
$ git rm \*~
移动文件
$ git mv README.txt README$ git status
On branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.txt -> README
查看提交历史
下面的命令列出所有最近两周内的提交:
$ git log --since=2.weeks
表 2-3 还列出了其他常用的类似选项。
选项 |
说明 |
-(n) |
仅显示最近的 n 条提交 |
--since,--after |
仅显示指定时间之后的提交。 |
--until, --before |
仅显示指定时间之前的提交。 |
--author |
仅显示指定作者相关的提交。 |
--committer |
仅显示指定提交者相关的提交。 |
来看一个实际的例子,如果要查看 Git 仓库中,2008 年 10 月期间,Junio Hamano 提交的但未合并的测试脚本(位于项目的 t/ 目录下的文件),可以用下面的查询命令:
$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t/5610e3b - Fix testcase failure when extended attributeacd3b9e - Enhance hold_lock_file_for_{update,append}()f563754 - demonstrate breakage of detached checkout wid1a43f2 - reset --hard/read-tree --reset -u: remove un51a94af - Fix "checkout --track -b newbranch" on detacb0ad11e - pull: allow "git pull origin $something:$cur
修改最后一次提交
如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行
--amend
提交:
$ git commit -m 'initial commit'$ git add forgotten_file$ git commit --amend
上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。
取消已经暂存文件
可以使用
git reset HEAD <file>...
的方式取消暂存。好吧,我们来试试取消暂存 benchmarks.rb 文件:
$ git reset HEAD benchmarks.rb
取消对文件的修改
可以使用 "git checkout -- <file>..."的方式取消对文件的修改
$ git checkout -- benchmarks.rb
远程仓库的使用――查看当前的远程仓库
要查看当前配置有哪些远程仓库,可以用
git remote
命令,它会列出每个远程库的简短名字。
$ git remote
添加远程仓库
要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行
git remote add
$ git remoteorigin$ git remote add pb git://github.com/paulboone/ticgit.git$ git remote -vorigin git://github.com/schacon/ticgit.gitpb git://github.com/paulboone/ticgit.git
现在可以用字符串pb指代对应的仓库地址了。比如说,要抓取所有 Paul 有的,但本地仓库没有的信息,可以运行
git fetch pb:
$ git fetch pb
remote: Counting objects: 58, done.remote: Compressing objects: 100% (41/41), done.remote: Total 44 (delta 24), reused 1 (delta 0)Unpacking objects: 100% (44/44), done.From git://github.com/paulboone/ticgit * [new branch] master -> pb/master * [new branch] ticgit -> pb/ticgit
现在,Paul 的主干分支(master)已经完全可以在本地访问了,对应的名字是
pb/master
,你可以将它合并到自己的某个分支,或者切换到这个分支,看看有些什么有趣的更新。
从远程仓库抓取数据
$ git fetch [remote-name]
推送数据到远程仓库
$ git push origin master
查看远程仓库信息
我们可以通过命令
git remote show [remote-name]
查看某个远程仓库的详细信息,比如要看所克隆的
origin
仓库,可以运行:
$ git remote show origin* remote origin URL: git://github.com/schacon/ticgit.git Remote branch merged with 'git pull' while on branch master master Tracked remote branches master ticgit
远程仓库的删除和重命名
在新版 Git 中可以用
git remote rename
命令修改某个远程仓库在本地的简称,比如想把
pb
改成
paul
,可以这么运行:
$ git remote rename pb paul$ git remoteoriginpaul
注意,对远程仓库的重命名,也会使对应的分支名称发生变化,原来的
pb/master
分支现在成了
paul/master
。
碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库,可以运行
git remote rm
命令:
$ git remote rm paul$ git remoteorigin
新建标签
$ git tag -a v1.4 -m 'my version 1.4'
显示已有的标签
$ git tag
可以使用
git show
命令查看相应标签的版本信息,并连同显示打标签时的提交对象。
$ git show v1.4