偶然在网上找到了Progit的中文版,顿时觉得大树底下好乘凉啊,感谢前辈的辛勤付出。。。。
中文版的Progit在51cto的下载中心有提供。
第3章 分支
Git提交时,会保存一个提交对象,它包含一个指向暂存内容的指针,作者和相关信息,以及一定数量(也可能没有)指向该提交对象直接祖先的指针。当用git commit新建一个提交对象前,Git会先计算每一个子目录的检验和,然后在Git 仓库中将这些目录保存为树对象。之后Git创建的提交对象除了包含相关提交信息以外,还包含指向这个树对象的指针,这样就能在需要的时候,重现此刻快照内容。
Git中的分支其本质仅是个指向提交对象的可变指针。Git使用master作为分支的默认名字,它在每次提交时自动向前移动。
Git通过创建一个新的分支指针来创建新分支:git branch <branch-name> 。新创建的分支指针指向当前提交对象。
HEAD指针用来指向当前工作的分支,每次提交后HEAD随着分支指针一起向前移动。
get checkout <branch-name> 切换工作分支。
git checkout -b <branch-name> 新建一个分支并切换。
注:转换分区前最好保持一个清洁的工作区域,因为切换分区会使未提交的修改丢失,可以用stashing或amending处理)
git merge <branch-name> 合并分支
git branch -d <branch-name>删除分支
如果合并的一方是另一方的直接祖先,则合并相当于是指针的移动。若不为直接祖先,则Git会先寻找双方的共同祖先,然后三方进行合并,对结果做一新的快照,并自动创建一个新的提交对象。因为这个新对象的祖先不只有一个,所以称之为合并对象。
冲突合并:如果修改了两个待合并分支里同一文件的同一部分,就无法顺利合并。这时使用git merge时,Git做了合并但未提交,可用git status查看冲突处,无非是二选一或者用一个新的。解决冲突后调用git add标记,最后提交。当前分支指向的即为合并后的最新提交对象
git mergetool:调用可视化工具解决冲突。
分支管理:git branch:查看所有分支。-v:查看各分支最后一此commit信息。--merged,--no-merged:查看已合并或未合并的分支。
分布式工作流程:可以同时拥有多个开放的分支,每个分支用于完成特定的任务,随着开发的推进,可以随时把某个特定分支的成果并到其他分支中。
远程分支:从远程服务器进行克隆,Git默认将远程仓库命名为origin,并下载所有内容,建立一个指向它的master分支指针。在本地命名为origin/master,但无法在本地更改其数据,接着Git建立一个属于你自己的本地master分支,位于和origin/master相同位置,然后可以开始工作。
可以运行git fetch <仓库名> 与远程仓库进行同步
推送:git push <远程仓库名> <分支名> 可以推送到一个拥有写权限的远程仓库中,与别人共同开发。
跟踪分支:从远程分支检出的本地分支,称为跟踪分支跟踪分支是一种和远程分支有直接联系的本地分支。在跟踪分支里输入git push,Git会自行推断应该向哪个服务器的哪个分支推送数据。反过来,在
这些分支里运行git pull会获取所有远程索引,并把它们的数据都合并到本地分支中来。
删除远程分支:git push [远程名] :[分支名]
衍合
把一个分支合并到另一个分支的方法。两个不同的分支进行合并,merge用的是寻找两个分支的共同祖先,然后三方一起合并。衍合是把一个分支里产生的变化补丁在另一个分支再打一遍。原理是回到两个分支(所在分支和想要衍合的分支)的共同祖先,提取所在分支每次提交时产生的差异,把这些差异分别保存到临时的文件里,然后从当前分支转换到需要衍合入的分支,依序使用每一个差异补丁文件。
git rebase <branch-name>
衍合和合并结果相同,但提交历史不同。
git rebase <主分支> <特性分支>:先检出特性分支,然后在主分支上重演,再快进(fast forward)主分支。
衍合并非没有风险,永远不要衍合那些已经推送到公共仓库的更新。因为在衍合的时候,实际上抛弃了一些现存的commit而创造了一些类似但不同的commit。
第4章 服务器上的Git
可以自己架设Git服务器作为远程仓库,也可以使用网络上的仓库托管服务。
架设Git服务器的第一步是选择与服务器通讯的协议。Git使用四种协议来传输数据:本地传输、SSH协议、Git协议和HTTP协议,除了HTTP协议外,其他都要求在服务器端安装和运行Git。
1、本地协议:远程仓库就是硬盘上的一个目录,一般是共享目录,git cloen /opt/git/project.git
2、SSH:SSH是四个中唯一一个同时便于读和写的协议,另外两个(HTTP和Git)通常都是只读。
git clone ssh://user@server:project.git或git clone user@server:project.git
SSH不支持匿名只读访问,这不利于开源的项目。
3、Git协议
这是一个包含在Git软件包中的特殊守护进程,它会监听一个提供类似于SSH服务的特定端口(9418)。用Git协议运营仓库,需要创建git-export-daemon-ok文件。
4、HTTP(S)协议:
只需要把Git的纯仓库文件放在HTTP的文件根目录下,配置一个特定的post-update挂钩就行了。具体做法详见文档。。。
开始架设Git服务器的时候,需要把一个现存的仓库导出为一个纯的仓库,不包含当前工作目录的仓库。用git clone命令的--bare选项,纯仓库的目录名以.git结尾。再把纯仓库放到服务器上去。更加详细的配置请看文档。。。
Git托管服务
Github:侧重于用户而不是项目
关于Github的注册,以及创建仓库,派生(fork)其他人的代码的操作都较为容易,可看官方教程。