内容提要
《Pro Git》前3章要点:Git以快照而非差异存储数据,多数操作在本地完成,用SHA-1校验完整性,文件有已提交、已修改、已暂存三种状态。常用命令包括clone、status、add、commit、rm、mv、log、reset、fetch、pull、push、tag及别名。分支创建轻量,HEAD指向当前分支,可合并、删除、变基,但不要变基已推送的提交。
延伸解读
Git 的本地化优势
文章指出 Git 的绝大多数操作只需本地文件和资源,无需网络连接。这意味着你可以在离线环境下提交、查看历史、创建分支等,大大提升了开发效率。与集中式版本控制系统相比,Git 减少了对中央服务器的依赖,即使服务器故障,本地仓库仍可正常工作。
暂存区的实际作用
Git 的文件有三种状态:已提交、已修改、已暂存。暂存区允许你精心挑选要提交的修改,而不是一次性提交所有改动。例如,你可以用 git add 将部分文件加入暂存区,然后提交,从而保持提交的原子性和清晰度。理解暂存区是掌握 Git 工作流的关键。
分支操作的轻量性
Git 的分支本质上只是一个包含 40 字符 SHA-1 校验和的简单文件,因此创建和销毁分支非常快速。这鼓励开发者频繁使用分支进行功能开发或实验,而不会造成性能负担。HEAD 指针则指向当前所在的分支,切换分支只是改变 HEAD 的指向。
变基的禁忌
文章强调:不要对已经推送到公共仓库的提交进行变基。因为变基会重写提交历史,如果其他人已经基于这些提交进行了工作,将会导致混乱。变基适合整理本地未推送的提交,以保持历史线性整洁,但一旦推送,就应避免变基。
Q&A
Git 和其他版本控制系统(如 Subversion)在数据存储方式上有什么根本区别?
Git 以快照的方式存储数据,而大多数其他系统(包括 Subversion)存储的是基于文件的变更列表。
Git 中文件有哪三种状态?分别代表什么含义?
Git 中文件有三种状态:已提交(committed)表示数据已安全保存到本地数据库;已修改(modified)表示修改了文件但尚未提交;已暂存(staged)表示已将修改的文件标记为下次提交的快照。
git fetch 和 git pull 有什么区别?
git fetch 从远程仓库拉取本地没有的数据,但不会自动合并或修改当前工作;git pull 则会在拉取后自动合并到当前分支。
如何为 Git 命令设置别名?能举个例子吗?
可以使用 git config 设置别名,例如 git config --global alias.ci commit 之后就可以用 git ci 代替 git commit。也可以设置更复杂的别名,如 git config --global alias.last 'log -1 HEAD',之后用 git last 查看最后一次提交。
为什么 Git 中创建和销毁分支非常廉价?
因为 Git 中的分支本质上只是一个包含 40 个字符 SHA-1 校验和的简单文件,创建新分支就像写入 41 字节(40 个字符加换行符)一样快。
使用 git rebase 时需要注意什么?
不要对已经推送到公共仓库的提交进行变基。