读书笔记:Pro Git 中文版

书籍名称:Pro Git 中文版

一本介绍 Git 的小书,看看写了些什么。


目录


起步

本地版本控制系统(简单数据库记录文件各次变动差异)-> 集中化的版本控制系统(CVCS)-> 分布式版本控制系统(D VCS)

分布式体现在不仅仅是将最新的文件下载下来,而是整个仓库的镜像,可以理解成集中式只是一些最新的文件,而分布式是一个“本地版本控制系统”,可以用这个恢复远端数据库。

Git 是 Linux 社区开发的产物(ps.伟大的开源!伟大的 Linux!)。

其他分布式管理系统保存一组基本文件和每个文件随着时间逐步积累的差异:

其他分布式版本管理系统运行的方式

Git 将数据看成小型文件系统的一组快照:

存储一组快照

Git 的工作区、暂存区和 Git 仓库:

Git 的一些概念


Git 基础

工作目录下的文件只有可能是两种状态其中之一:已跟踪或者未跟踪。

已跟踪文件表示被纳入版本控制的文件,可能处于:未修改、已修改、已放入暂存区。

文件的状态变化周期

忽略文件

文件 .gitignore 的格式规范如下:

  • #开头的行表示注释
  • 使用标准的 glob 模式匹配
  • 匹配模式可以以 / 开头防止递归
  • 匹配模式可以以 / 结尾指定目录
  • !取反
# no .a files
*.a

# but do track lib.a, even though you're ignoring .a files above
!lib.a

# only ignore the TODO file in the current directory, not subdir/TODO
/TODO

# ignore all files in the build/ directory
build/

# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt

# ignore all .pdf files in the doc/ directory
doc/**/*.pdf

Git 分支

Git 使用 blob 对象来保存文件快照,当首次提交时,存在一个包含提交信息的 commit 对象、对应文件索引的 tree 对象,还有对应文件快照的 blob 对象:

首次提交时 Git 结构

修改内容后再次提交,本次提交对象将会包含一个指向上次提交对象(父对象)的指针。

git branch 创建一个新的,可以移动的指针:

git checkout 切换 HEAD 指向的分支:

在执行 merge 时,如果当前分支是被合并分支的祖先分支,那么执行的操作就仅仅是将指针向右移动:

当需要合并两个并非以上情况的分支时,需要做一次三方合并:

当使用 git clone 时会同时存在 master 分支和 origin / master 分支:

git fetch origin 会根据远程仓库更新本地的 origin / master 分支:

git pull 在多数情况下的含义是 git fetch + git merge。

git rebase 将提取当前分支与基底分支针对于共同祖先分支的变化,然后形成一个临时文件。

无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。


分布式 Git

集成管理者工作流程:

  1. 项目维护者推送到主仓库。
  2. 贡献者克隆此仓库,做出修改。
  3. 贡献者将数据推送到自己的公开仓库。
  4. 贡献者给维护者发邮件,请求拉取自己的更新。
  5. 维护者在本地的仓库中,将贡献者的仓库加为远程仓库并合并修改。
  6. 维护者将合并后的修改推送到主仓库。

Github

派生(Fork)项目:

派生的意思是指,Github 将在你的空间里面创建一个完全属于你的项目副本,并且你对其具有推送的权限。

当对开源项目修改代码后但不能进行干净合并时,有两种方法解决这个问题:合并或者变基,Github 上多数开发者会选择合并,因为我们看重的是历史记录和最后的合并,变基除了带来看上去简洁的历史记录,只会让工作更加困难和更容易犯错。


Git 工具

储存

当在一个分支工作了一段时间,需要切换到另一个分支工作,但是又不希望创建一次提交的时候,可以使用 git stash 来将修改保存在栈上。

git stash apply 可以将栈中保存的代码应用。

git stash drop 可以将栈中保存的代码移除。

git stash pop 可以立即应用并移除。

高级合并

中断一次合并:可以简单通过 git merge –abort 来简单的退出合并。


总结

讲的很全面,有些内容超出了一般开发者需要掌握的程度,可以遇到问题或者日后需要用到的时候再回来看。