2.Git常用方法
Git配置
Git第一件事是设置你的Name和Email,这些时你提交的Commit的签名。
$ git config --global user.name "Scott Chacon"
$ git config --global user.email schacon@gmail.com
执行了上面的命令后,会在你的主目录(home directory)建立一个叫 ~/.gitconfig 的文件。内容一般像下面这样:
[user]
name = Scott Chacon
email = schacon@gmail.com
初始化仓库
Git仓库有两种方法可以得到它:一种是从已有的Git仓库中clone (克隆,复制);还有一种是新建一个仓库,把未进行版本控制的文件进行版本控制。
1.Clone:
git clone git://git.kernel.org/pub/scm/git/git.git
也可以通过http 协议来访问:
git clone http://www.kernel.org/pub/scm/git/git.git
git://协议较为快速和有效,但是有时必须使用http协议,比如你公司的防火墙阻止了你的非http访问请求.如果你执行了
上面两行命令中的任意一个,你会看到一个新目录: ‘git’,它包含所有的Git源代码和历史记录.
2.新建仓库:
现在假设有一个叫”project.tar.gz”的压缩文件里包含了你的一些文件,你可以用下面的命令让它置于Git的版本控制管理之下.
$ tar xzf project.tar.gz
$ cd project
$ git init
如果你仔细观查会发现project目录下会有一个名叫”.git” 的目录被创建,这意味着一个仓库被初始化了。
正常使用流程
1. 修改文件,将它们更新的内容添加到索引中.
$ git add file1 file2 file3
你可以使用 git diff 命令再加上 –cached 参数 ,看看哪些文件将被提交(commit)。
$ git diff –cached
如果没有–cached参数,git diff 会显示当前你所有已做的但没有加入到索引里的修改.
2. 提交:
$ git commit
除了用git add 命令,我还可以用$ git commit –a,这会自动把所有内容被修改的文件(不包括新创建的文件)都添加到索引中,并且同时把它们提交。commit注释最好以一行短句子作为开头,来简要描述一下这次commit所作的修改(最好不要超过50个字符);然后空一行再把详细的注释写清楚。这样就可以很方便的用工具把commit注释变成email通知,第一行作为标题,剩下的部分就作email的正文.
3. 分支
一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫“experimental”的分支:
$ git branch experimental
如果你运行下面这条命令:
$ git branch
可以得到当前仓库中存在的所有分支列表。
experimental
* master
“experimental” 分支是你刚才创建的,“master”分支是Git系统默认创建的主分支。星号(“*”)标识了你当工作在哪个分支下,输入:
$ git checkout experimental
切换到”experimental”分支,先编辑里面的一个文件,再提交(commit)改动,最后切换回 “master”分支。
输入:
$ git merge experimental
两个分支就有了各自不同的修改(diverged);我们可以通过上面的命令来合并“experimental”和“master”两个分支。
如果这个两个分支间的修改没有冲突(conflict), 那么合并就完成了。如有有冲突,输入下面的命令就可以查看当前有哪些文件产生了冲突:
$ git diff
你可以用 git diff 来比较项目中任意两个版本的差异。
$ git diff master..test
上面这条命令只显示两个分支间的差异,如果你想找出‘master’,‘test’的共有 父分支和’test’分支之间的差异,你用3个‘.’来取代前面的两个’.’ 。
$ git diff master...test
当你编辑了有冲突的文件,解决了冲突后就可以提交了:
$ git commit -a
提交(commit)了合并的内容后就可查看一下:
$ gitk
执行了gitk后会有一个很漂亮的图形的显示项目的历史。
可以通过$ git branch -d experimental删掉分支,git branch -d只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D;
如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:
$ git reset --hard HEAD
或者你已经把合并后的代码提交,但还是想把它们撒销:
$ git reset --hard ORIG_HEAD
但是刚才这条命令在某些情况会很危险,如果你把一个已经被另一个分支合并的分支给删了,那么 以后在合并相关的分支时会出错。
4. 查看log
Git log命令可以显示所有的提交(commit).
$ git log v2.5.. # commits since (not reachable from) v2.5
$ git log test..master # commits reachable from master but not test
$ git log master..test # commits reachable from test but not master
$ git log master...test # commits reachable from either test or master, but not both
$ git log --since="2 weeks ago" # commits from the last 2 weeks
$ git log Makefile # commits that modify Makefile
$ git log fs/ # commits that modify any file under fs/
$ git log -S'foo()' # commits that add or remove any file data matching the string 'foo()'
$ git log --no-merges # dont show merge commits
如果用–stat选项使用’git log’,它会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容.
$ git log –stat
你也可以指定‘–topo-order’参数,这就会让提交(commits)按拓朴顺序来显示(就是子提交在它们的父提交前显示). 如果你用git log命令按拓朴顺序来显示git仓库的提交日志,你会看到“开发线”(development lines)都会集合在一起.
$ git log --pretty=format:'%h : %s' --topo-order –graph
也可以用’–date-order’参数,这样显示提交日志的顺序主要按提交日期来排序. 这个参数和’–topo-order’有一点像,没有父分支会在它们的子分支前显示,但是其它的东东还是按交时间来排序显示。你会看到”开发线”(development lines)没有集合一起,它们会像并行开发(parallel development)一样跳来跳去的
$ git log --pretty=format:'%h : %s' --date-order –graph
可以用 ‘–reverse’参数来逆向显示所有日志
gitcast:c4-git-log