http://git-scm.com/book/zh
一.配置git,例如账户/编辑器/差异分析工具等
可以使用git config --list命令查看,还涉及到全局配置,此用户配置,项目单独配置。
http://git-scm.com/book/zh/%E8%B5%B7%E6%AD%A5-%E5%88%9D%E6%AC%A1%E8%BF%90%E8%A1%8C-Git-%E5%89%8D%E7%9A%84%E9%85%8D%E7%BD%AE
二.查看帮助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
例如git help config
三.如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
git clone git://github.com/schacon/grit.git mygrit
四.git status表述
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
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: benchmarks.rb
changes to be commited表述下面的文件目前在暂存区
changes not staged commit表述已经跟踪的文件修改了,但是还没提交到暂存区。
git add是一个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等)
五.配置.gitignore
- 所有空行或者以注释符号
#
开头的行都会被 Git 忽略。 - 可以使用标准的 glob 模式匹配。
- 匹配模式最后跟反斜杠(
/
)说明要忽略的是目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(
!
)取反。
glob 模式是指 shell 所使用的简化了的正则表达式
六.修改地方查看
使用git diff命令:此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用 git diff --cached
命令。
记住,提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态。
七.跳过暂存区域
加-a选项
八.移除文件,移动文件,回顾历史
git rm 移除暂存区
git mv
git log:
常用 -p
选项展开显示每次提交的内容差异,用 -2
则仅显示最近的两次更新
单词层面的对比,比行层面的对比,更加容易观察。Git 提供了 --word-diff
选项,添加到-p后
许多摘要选项可以用,比如 --stat
,仅显示简要的增改行数统计
常用的 --pretty
选项,可以指定使用完全不同于默认格式的方式展示提交历史,用 oneline
将每个提交放在一行显示,这在提交数很大时非常有用。另外还有 short
,full
和 fuller
可以用。
git log --pretty=oneline
最有意思的是 format
,可以定制要显示的记录格式,这样的输出便于后期编程提取分析
git log --pretty=format:"%h - %an, %ar : %s"
更多选项查看http://git-scm.com/book/zh/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86%E5%8F%B2
用 oneline 或 format 时结合 --graph
选项,可以看到开头多出一些 ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况
实用的限制输出长度的选项,按照时间作限制的选项,比如 --since
和 --until
用 --author
选项显示指定作者的提交,用 --grep
选项搜索提交说明中的关键字。(请注意,如果要得到同时满足这两个选项搜索条件的提交,就必须用 --all-match
选项。否则,满足任意一个条件的提交都会被匹配出来)
git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \ --before="2008-11-01" --no-merges -- t/
九.撤销操作
1.修改最后一次提交
有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 --amend
选项重新提交
git commit --amend
2.取消已经暂存的文件
就在 “Changes to be committed” 下面,括号中有提示,可以使用 git reset HEAD <file>...
的方式取消暂存
3.取消对文件的修改
如果觉得刚才对 benchmarks.rb 的修改完全没有必要,该如何取消修改,回到之前的状态(也就是修改之前的版本)呢?git status
同样提示了具体的撤消方法
十.远程仓库的使用
要查看当前配置有哪些远程仓库,可以用 git remote
命令
1.添加远程仓库
git remote add [shortname] [url]
2.从远程仓库抓取数据
git fetch remote-name
如果设置了某个分支用于跟踪某个远端仓库的分支(参见下节及第三章的内容),可以使用 git pull
命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下 git clone
命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行 git pull
,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
3.推送数据到仓库
实现这个任务的命令很简单: git push [remote-name] [branch-name]
。如果要把本地的 master 分支推送到 origin
服务器上(再次说明下,克隆操作会自动使用默认的 master 和 origin 名字)
4.查看远程仓库信息
我们可以通过命令 git remote show [remote-name]
查看某个远程仓库的详细信息,比如要看所克隆的 origin
仓库
5.远程仓库的删除和从命名
在新版 Git 中可以用 git remote rename
命令修改某个远程仓库在本地的简称
删除可以运行 git remote rm
命令
十一.打标签
1.显示已有的标签
git tag
2.新建标签
Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特 定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标 签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。
git tag -a v1.4 -m 'my version 1.4' # 含附注标签
可以使用 git show
命令查看相应标签的版本信息,并连同显示打标签时的提交对象
签署标签
如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a
改为 -s
(译注: 取 signed
的首字母)即可:
git tag -s v1.5 -m 'my signed 1.5 tag'
轻量级标签
轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a
,-s
或 -m
选项都不用,直接给出标签名字即可:
git tag v1.4-lw # 轻量级标签
验证标签:
可以使用 git tag -v [tag-name]
(译注:取 verify
的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证。
后期加注标签:
你甚至可以在后期对早先的某次提交加注标签
分享标签:
默认情况下,git push
并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname]
即可
如果要一次推送所有本地新增的标签上去,可以使用 --tags
选项
十二.技巧和窍门
1.自动补全
如果你用的是 Bash shell,可以试试看 Git 提供的自动补全脚本。下载 Git 的源代码,进入 contrib/completion
目录,会看到一个 git-completion.bash
文件。将此文件复制到你自己的用户主目录中(译注:按照下面的示例,还应改名加上点:cp git-completion.bash ~/.git-completion.bash
),并把下面一行内容添加到你的 .bashrc
文件中:
source ~/.git-completion.bash
在输入 Git 命令的时候可以敲两次跳格键(Tab),就会看到列出所有匹配的可用命令建议
2.git命令别名
第三章:分支模型
一.何为分支
commit对象,tree对象,blog类型
看图理解:http://git-scm.com/book/zh/Git-%E5%88%86%E6%94%AF-%E4%BD%95%E8%B0%93%E5%88%86%E6%94%AF
Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。
1.创建分支
git branch test
它保存着一个名为 HEAD 的特别指针,要切换到其他分支,可以执行 git checkout
命令
二.分支的创建与合并
- 返回到原先已经发布到生产服务器上的分支。
- 为这次紧急修补建立一个新分支,并在其中修复问题。
- 通过测试后,回到生产服务器所在的分支,将修补分支合并进来,然后再推送到生产服务器上。
- 切换到之前实现新需求的分支,继续工作。
1.分支的新建与切换
切换分支的时候最好保持一个清洁的工作区域
有必要作些测试,确保修补是成功的,然后回到 master
分支并把它合并进来,然后发布到生产服务器。用 git merge
命令来进行合并
2.删除
使用 git branch
的 -d
选项执行删除操作
3.分支的合并
4.遇到冲突时的分支合并
这个解决方案各采纳了两个分支中的一部分内容,而且我还删除了 <<<<<<<
,=======
和 >>>>>>>
这些行。在解决了所有文件里的所有冲突后,运行 git add
将把它们标记为已解决状态(译注:实际上就是来一次快照保存到暂存区域。)。因为一旦暂存,就表示冲突已经解决。
三.分支的管理
git branch
命令不仅仅能创建和删除分支,如果不加任何参数,它会给出当前所有分支的清单
若要查看各个分支最后一个提交对象的信息,运行 git branch -v
要从该清单中筛选出你已经(或尚未)与当前分支合并的分支,可以用 --merged
和 --no-merged
选项
一般来说,列表中没有 *
的分支通常都可以用 git branch -d
来删掉。原因很简单,既然已经把它们所包含的工作整合到了其他分支,删掉也不会损失什么。
四.利用分支进行开发的工作流程(都说的时本地分支)
1.长期分支
2.特性分支
一个特性分支是指一个短期的,用来实现单一特性或与其相关工作的分支。
五.远程分支
1.推送本地分支
如果你有个叫 serverfix
的分支需要和他人一起开发,可以运行 git push (远程仓库名) (分支名)
2.跟踪远程分支
从远程分支 checkout
出来的本地分支,称为 跟踪分支 (tracking branch)。
3.删除远程分支
可以用这个非常无厘头的语法来删除它:git push [远程名] :[分支名]
。
五.分支的衍合
把一个分支中的修改整合到另一个分支的办法有两种:merge
和 rebase(翻译为衍合)
1.基本的衍合操作
有了 rebase
命令,就可以把在一个分支里提交的改变移到另一个分支里重放一遍。
虽然最后整合得到的结果没有任何区别,但衍合能产生一个更为整洁的提交历史。
2.有趣的衍合
3.衍合的风险
一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。
第四章:服务器上的git
一.协议
Git 可以使用四种主要的协议来传输数据:本地传输,SSH 协议,Git 协议和 HTTP 协议。
二.在服务器上部署git
三.生产ssh公钥
SSH 公钥默认储存在账户的主目录下的 ~/.ssh
目录
ssh-keygen
四、架设服务器
五、公共访问
六、gitweb
七、gitosis
简单地说,Gitosis 就是一套用来管理 authorized_keys
文件和实现简单连接限制的脚本。
八、gitolite
Gitolite是在Git之上的一个授权层,依托sshd
或者httpd
来进行认证。
九、git守护进程
十、git托管服务
https://git.wiki.kernel.org/index.php/GitHosting
托管服务列表
第五章:分布式git
当作为项目贡献者时,我们该怎么做才能方便维护者采纳更新;或者作为项目维护者时,又该怎样有效管理大量贡献者的提交。
一、分布式工作流程
1、集中式工作流
2.集中管理员工作流
- 项目维护者可以推送数据到公共仓库 blessed repository。
- 贡献者克隆此仓库,修订或编写新代码。
- 贡献者推送数据到自己的公共仓库 developer public。
- 贡献者给维护者发送邮件,请求拉取自己的最新修订。
- 维护者在自己本地的 integration manger 仓库中,将贡献者的仓库加为远程仓库,合并更新并做测试。
- 维护者将合并后的更新推送到主仓库 blessed repository。
3.司令官与副官工作流
这其实是上一种工作流的变体。一般超大型的项目才会用到这样的工作方式,像是拥有数百协作开发者的 Linux 内核项目就是如此。各个集成管理员分别负责集成项目中的特定部分,所以称为副官(lieutenant)。而所有这些集成管理员头上还有一位负责统筹的总集成管理员,称为司令官(dictator)。司令官维护的仓库用于提供所有协作者拉取最新集成的项目代码。
二、为项目做贡献
1.提交指南
2.私有的小型团队
3.私有团队间协作
4.公共小型项目
5、公共大型项目
三、项目的管理
第九章:git内部原理
从根本上来讲 Git 是一套内容寻址 (content-addressable) 文件系统
一、底层命令和高层命令
1.底层命令和高层命令
2.git对象
tree对象
所有内容以 tree 或 blob 对象存储,其中 tree 对象对应于 UNIX 中的目录,blob 对象则大致对应于 inodes 或文件内容
commit对象
blob对象
tag对象
二.git references
四.packfile
五.the refspec
六.传输协议
七.维护及数据恢复