* SSH里,让用户向服务器提供公钥,以实现授权;而在SSL协议里,是服务器公开自己的公钥,用户通过公钥对报文进行加密,服务器端再用对应的私钥进行解密。
* 为了匿名访问,还要设置一种简单的匿名读取权限。使用静态web实现,把它的根目录设定为 Git 仓库所在的位置,然后开启 post-update 挂钩。
* SSH可读可写,HTTP方式只可读
* Gitosis 就是一套用来管理 authorized_keys 文件和实现简单连接限制的脚本。
* authentication is identifying who the user is, authorization is deciding if he is allowed to do what he is attempting to。
* git apply与patch -p1的区别:git apply 是一个事务性操作的命令,也就是说,要么所有补丁都打上去,要么全部放弃。所以不会出现 patch 命令那样,一部分文件打上了补丁而另一部分却没有,这样一种不上不下的修订状态。
* git apply --check
* format-patch 补丁
* $ git log contrib --not master 查看contrib的补丁,如果master是contrib的直接祖先,那么结果会没有问题。否则是增加了特性分支上相对于公共祖先的新代码,同时删除了 master 分支上相对于公共祖先的新代码。
* 定位公共祖先
$ git merge-base contrib master
36c7dba2c95e6bbb78dfa822519ecfec6e1ca649
$ git diff 36c7db
或者
$ git diff master...contrib
* 挑拣某个没有标记的补丁合并到当前分支,通过SHA-1值选择
$ git cherry-pick e43a6fd3e94888d76779ad79fb568ed180e5fcdf
* SHA-1值通过git log命令查看
通常在一个项目中,使用八到十个字符来避免 SHA-1 歧义已经足够了。最大的 Git 项目之一,Linux 内核,目前也只需要最长 40 个字符中的 12 个字符来保持唯一性。
* 查找分支指向的SHA-1值
$ git rev-parse topic1
* 使用 git reflog 来查看引用日志
* 以流程线方式显示版本流动
$ git log --pretty=format:'%h %s' --graph
* 所有可以从experiment而不能从master获得的提交
$ git log master..experiment
交互式暂存
* 列出暂存/为暂存的变更
$ git add -i
暂存和撤回文件
暂存补丁 暂存文件的某些部分而忽略其他
* 逐个显示文件的差异区块并询问你是否希望暂存他们
储藏
当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。
git stash
可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。
* 要查看现有的储藏
git stash list
* 返回某个储藏点
$ git stash apply stash@{2} 原来暂存的文件会被修改,变成not staged状态
$ git stash apply --index 回到原来的位置
重写历史
修订你的提交历史
核弹级选项: filter-branch
* 从所有提交中删除一个文件
$ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
* 将一个子目录设置为新的根目录
* 全局性地更换电子邮件地址
$ git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
then
GIT_AUTHOR_NAME="Scott Chacon";
GIT_AUTHOR_EMAIL="schacon@example.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
文件标注,追踪代码中的缺陷想知道这是什么时候为什么被引进来的。显示文件中对每一行进行修改的最近一次提交
子模块允许你将一个 Git 仓库当作另外一个Git仓库的子目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。
* git submodule add将外部项目加为子模块
* Git 把它视作一个子模块,当你不在那个目录里时并不记录它的内容。取而代之的是,Git 将它记录成来自那个仓库的一个特殊的提交。
子树合并
* 递归策略可以处理复杂的三路归并情况——比如多于一个共同祖先的——但是它只能处理两个分支的归并。
* 章鱼归并可以处理多个分支但是但必须更加小心以避免冲突带来的麻烦,因此它被选中作为归并两个以上分支的默认策略。