本文针对git初学者入门之用,目标为“快速的在git世界里生存下来”。当然,生存下来是不够的,严重推荐git-scm上教程深入学习,另外git客户端、开发库、部署方案等参看git wiki。
本文主要以命令行操作为主。
git安装,不多说。
linux或mac os x下,应该已经安装过了,如没有请通过yum/apt-get等安装。windows下可以使用git-scm的win32版本,自带命令行;推荐在cygwin下的git。可参考 git-scm下载合适的版本
第0步,基础知识。
git是分布式、去中心化的。通俗的说,git项目里的就是每个人都有所有版本的副本;不要服务器也能工作。
几乎所有的git的操作,都被集成到git 这个命令下,如 git add, git branch, git commit, git push 等,可以运行 git --help 浏览一下。
第一步,配置个性化的名字
运行下面的命令,配置一下你的名字与邮箱地址。注意花括号只是为了看起来方便,实际执行不要带它们,除非你的名字带花括号。但强烈不建议使用特殊符号,以免为自己挖抗!
git config --global user.name {你的名字}
git config --global user.email {你的邮箱地址}
第二步,忘掉“服务器”的概念,并搞个git库。
先不考虑服务器;尤其如果有svn使用经历的话,先忘掉这个概念。因为git是“去中心化”的,即不要服务器就可以工作。所以一开始我们先简化掉不必要的东西,有助于快速入门。
打开命令行。windows下使用git-scim者,可以在某个文件夹里点右键-Git Bash (?)。切换到一个空目录里。下面以/cygdrive/e/git_repo/foobar/ 目录为例(cygwin的目录风格)
执行命令 git init ,你将看到类似下面的提示消息
Initialized empty Git repository in /cygdrive/e/git_repo/foobar/.git/
看到了吧,git在本目录下创建了一个子目录 .git 这就是本地的git仓库。受git控制的文件的所有历史版本都会存储在这里面;本git仓库的配置也在里面。有兴趣可以到里面随便看看。有探索精神的童鞋注意了,不要指望在里面按文件找到你的文件;请在入门后了解一下git原理。
第三步,熟悉一下git环境。
回到前面创建的目录(注意不要跑到.git子目录里),运行 git status,你将看到类似如下的消息:
$ git status
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
简单说明一下,On branch master -> 你在 master 分支(branch)下
Initial commit -> 当前是初始提交。刚刚初始化的一个版本库,即是空的 (别想歪,没色字)。
nothing to commit (create/copy files and use "git add" to track) -> 接上行“初始提交” 但没有任何东西待提交(创建或拷贝进来一些文件并使用git add 追踪它们)。
[提示] git status这个命令非常常用。
第四步,搞几个文件,纳入git版本库。
按照git的提示,随便搞几个文本文件,最好小一点,只有几行。从别的地方拷来也行,在这里新建也可以。
假设创建了文件 readme.txt ,内容如下3行,最后一行是空行
this is a text file
line 2 aaa
line 3 bbbbb
再运行一下git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
readme.txt
nothing added to commit but untracked files present (use "git add" to track)
消息变了,大意是说:
有了未追踪的文件(Untracked files):
(使用 git add <文件名> ... 把你需要追踪的文件加入进来。)
readme.txt
现在还没有添加到待提交列表里,但是有未追踪的文件,使用git add 追踪它们.
有点啰嗦.....
git 里,文件被追踪(track),就是被纳入git版本控制。每次提交(commit)就是每一次的版本变更。
那我们就按提示添加文件到追踪列表吧.
git add readme.txt
咦,没有任何消息?是的,再运行git status看看。多了如下的部分,不细讲了
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: readme.txt
第五步,首次提交一个版本
运行命令 git commit -m "first commit, file readme.txt"
本行命令有点小麻烦,因为带了个 -m 参数,后面双引号里是一段简短的说明,为本次提交加点注释,方便以后查阅。git默认强制要求每次提交都要带说明。注释随便写,但强烈建议有概括性,简洁直观的文字说明,会给你及你的团队带来帮助。
[本步下面的内容非必须,但还是建议了解一下] 如果不带 -m 参数,git默认会给你一个vim 的编辑器,并给出一些有意义的提示文字,你可以在这里写注释,然后保存退出,git会把你写的内容当作注释。
vim编辑器是神器,但入门有门槛。对于 git 提交来说,只要死记下面的步骤即可:
默认是不是打字的,要先敲一下 i 键(注意是小写状态),即可以正常输入文字。
写完确认无误后,按 Esc 键,按一次或N多次都行,如果不确定是否真的按下过,那就多几次,反正没有副作用。然后击键:
:wq
然后按回车。提交就完成了,将大概如下所示的消息。
$ git commit
[master (root-commit) fbc00df] first commit, file readme.txt
1 file changed, 3 insertions(+)
create mode 100644 readme.txt
啰嗦 一下,前面保存注释用的是三个键,冒号、w、q,然后回车。
第六步,做下修改,再提交一个版本
随便修改一下前述文件,然后运行 git status ,消息大概如下 :
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
说得很明白,readme.txt这个文件有修改,你可以通过 git add 添加到待提交列表。这个“待提交列表”有个名字“暂存区域”。
消息里还说,可以通过git checkout -- <file> 丢弃你做的修改。这点下一步再尝试。
执行git add readme.txt ,然后执行 git commit -m "add a new test line",完成本次提交。
第七步,体验丢弃修改功能
随便在readme.txt里修改点东西,然后git status,看到git认出来 了文件的修改。消息从略
然后执行 git checkout -- readme.txt
注意命令里的两个连字符(--) ,其前后都是有空格的。
然后再执行git status,消息如下:
$ git status
On branch master
nothing to commit, working directory clean
查看readme.txt文件,会发现你做的修改确实已经没了,恢复为上次提交时的内容。
当然,这个命令只能恢复到上次提交时的版本,要想回复到更早的版本,继续下面
第八步,历史长廊
先随便做几次提交吧,可以多建几个文件并加到追踪里。
差不多了,就通过git log 查阅提交历史,大概如下
$ git log
commit 9ab41ac68ae6fe8e0e3ccc0013af91e5d3aa0ca9
Author: fengyqf <fengyqf@gmail.com>
Date: Thu Nov 20 21:15:55 2014 +0800
remove a line
commit f72675d78dfa6c5a7c0a9e742fb3e5a19d9d62d7
Author: fengyqf <fengyqf@gmail.com>
Date: Thu Nov 20 21:15:28 2014 +0800
add serival lines
commit e063544aacdff53f4d971179720bd1f83f1f9634
Author: fengyqf <fengyqf@gmail.com>
Date: Thu Nov 20 21:13:48 2014 +0800
append a line
commit fbc00dfcc90e395aa0491a4aaaca7659d74b9d5d
Author: fengyqf <fengyqf@gmail.com>
Date: Thu Nov 20 20:41:47 2014 +0800
add some file
这里按时间倒序列出最近的提交。如果你提交次数较多,你会看到屏幕最后一行行首是一个冒号,紧跟着光标。这时,你可以按空格键查看下一屏,或 b 键返回上一屏,或Esc键退出回到命令行(shell)下。
看上面的日志,每次提交一节,每节首行是 commit 后面跟着本次提交的ID,这段id是即是版本号,当然它对人类不太友好。第二三行是提交人、时间,然后空一行接着是本次提交注释文字。
如果我们的某个文件被玩坏了,需要恢复到历史上的某个版本,那就git checkout 出来
假设需要恢复上上次提交
commit f72675d78dfa6c5a7c0a9e742fb3e5a19d9d62d7
执行 git checkout f726 readme.txt
其中 f726 是该次提交的ID前4个字符,也就是,通常我们不需要写完整的ID就可以指定某次提交。当然,你使用前5个字符或前6个或更多,都是可以的。
提交ID后台跟需要检出的文件名。注意一定要带这个“文件名”的参数,不然会出乱子:下次提交后,在该版本后的版本将会被你抹掉!
看到了吧,文件readme.txt 历史版本又回来了。
差点忘了,可以通过git checkout --help查阅帮助,其它命令,也可以同样查帮助。帮助内容自己看,这里不讲了。
第九步,分支
git最强悍的功能之一,就是它的分支,比svn彪悍得多!
是否注意到前面所说的“master”分支,这是默认分支,我们可以创建一个新的分支。
git branch -b
第十步,比较
git diff
第十一步,分支合并
git merge
第十二步,checkout --patch
git checkout --patch
第十三步,远程仓库
git remote add
git push
git fetch
git pull