Skip to content

基础原理

理解下面几块,读命令文档会轻松很多;不必一次记全,遇到现象时再对照即可。

三个「区域」

  1. 工作区(Working Directory)
    磁盘上你能直接编辑的文件。git status 里「未暂存」的改动发生在这里。

  2. 暂存区(Index / Staging Area)
    下一次提交要包含哪些变更 的清单。git add 是把工作区的修改登记进暂存区,而不是立刻生成历史。

  3. 本地仓库(.git 目录)
    提交、分支、标签等元数据与对象数据库都在这里。git commit 会把暂存区快照写成一次不可变(原则上)的提交。

简记:改文件 → add 进暂存 → commit 写入历史

提交是什么

一次 commit 大致包含:

  • 指向树对象的根引用(这次快照的目录结构);
  • 父提交指针(首个提交没有父提交,合并提交可有多个父提交);
  • 作者、时间、说明等元信息。

每个提交由 SHA-1(或新仓库中的 SHA-256) 标识。历史是一条(或合并成的多条)有向无环图,而不是简单线性列表。

分支是什么

分支名是指向某一提交的「可移动指针」。创建分支不会复制文件,只是多了一个指向当前提交的名字。

HEAD 通常指向「当前所在分支的最新提交」;checkout / switch 切换分支时,HEAD 跟着移动,工作区文件会更新为该提交对应的快照。

因此:分支很轻,频繁建分支成本低。

远程在做什么

远程仓库(如 origin)是另一份 Git 对象与引用。git fetch 只拉对象与远程分支指针到本地,不自动改你的工作分支;git pull 一般是 fetch + merge(或 rebase),把远程进展合进当前分支。

推送 git push 则是把你的新提交与分支指针上传到远程,前提是远程允许快进或可接受的合并策略。

合并与快进

  • 快进(fast-forward):当前分支没有独有提交,合并只是把指针「向前滑」到目标分支的最新提交,历史是一条直线。
  • 合并提交:双方都有新提交时,往往会产生一个合并提交,有两个父提交,记录「汇合点」。

冲突发生在:同一文件的同一区域 在两份快照里都被改过,Git 无法自动裁决,需要人在工作区编辑后再 add + commit

小结

概念一句话
暂存区下一次 commit 的快照预览
提交不可变快照 + 父链 + 元数据
分支指向提交的移动指针
HEAD当前检出位置
远程交换提交与引用的协作端

回到实践命令,见 常用命令;安装与配置见 介绍与安装

最近更新