Git 是一个 分布式版本控制系统,它的核心思想是允许每个开发者在本地管理整个项目的完整版本历史,而不仅仅依赖于中央服务器。这样,Git 提供了非常强大的版本管理和团队协作能力。
1. 版本控制
Git 主要用于记录和管理文件的变更,它将每次文件的修改保存为一个 提交(Commit)。这些提交是一个快照,它记录了文件的状态,包括文件内容、作者、时间戳等。
提交(Commit)的特点:
快照:Git 将每次修改保存为文件的快照,而不是记录每一行的差异。
唯一标识:每个提交都有一个 哈希值(SHA-1),是由提交内容自动生成的唯一标识符。即使是微小的修改,Git 也会生成不同的哈希值。
历史追踪:每个提交记录都有历史,可以回溯到任意一个历史状态,方便查找问题。
2. 分布式结构
Git 是 分布式的,这意味着每个开发者的机器上都有一个完整的版本库(仓库),包括项目的所有历史记录。每个人的本地仓库都是独立的,开发者可以在本地进行工作,不依赖于中央服务器。
本地仓库(Local Repository):每个开发者在自己的计算机上有一个完整的仓库,包括所有的版本历史。
远程仓库(Remote Repository):为了共享代码,开发者将自己的本地仓库的更新推送(push)到远程仓库,通常使用 GitHub、GitLab 等代码托管平台。
3. 三大区域
Git 将工作分为三个主要区域:工作区(Working Directory)、暂存区(Staging Area)和本地仓库(Local Repository)。
工作区:就是项目文件夹,存放着正在开发的文件。在工作区中修改文件,Git 会监控这些修改。
暂存区:也叫 索引(Index),当对文件进行了修改并准备提交时,需要先将修改添加到暂存区,使用
git add命令。这相当于将文件的修改标记为 "准备提交"。本地仓库:将文件提交(
git commit)时,修改会从暂存区进入到本地仓库中,并保存为一个新的提交记录。
4. Git 提交的原理
每次 git commit,Git 会创建一个新的提交对象(Commit Object),该提交对象包含以下信息:
一个 哈希值,唯一标识该提交。
提交时的 时间戳 和 作者信息。
该提交包含的 文件差异(即文件的快照)。
Git 采用的是 基于快照的版本管理,每次提交实际上是将文件的当前状态存储下来。当查看历史提交时,Git 会根据这些快照呈现项目的不同版本。
5. 分支与合并
Git 支持 分支(Branch),这允许多个开发者或者同一个开发者并行进行不同的工作。例如,可以在一个分支上开发新功能,而不影响主分支(master/main)。
分支:Git 会创建一个新的分支指向当前提交,允许开发者独立进行开发。分支的切换和管理非常轻量,不会影响其他分支。
合并:当完成一个分支的工作后,可以将该分支的改动合并回主分支(master/main)。Git 会自动合并,如果有冲突,则需要手动解决。
6. 远程仓库交互
远程仓库是 Git 支持多人协作的关键。开发者通过 克隆(Clone) 远程仓库,将其内容拉取到本地;通过 推送(Push) 将本地的更改上传到远程仓库,和其他开发者共享更新。
克隆仓库:当第一次参与一个项目时,可以使用
git clone从远程仓库克隆整个项目到本地。拉取更新:使用
git pull从远程仓库拉取最新的更改到本地。推送更改:将本地的更改通过
git push推送到远程仓库。
7. Git 的工作流
Git 支持多种工作流,常见的工作流有:
集中式工作流:所有开发者都从一个单一的远程仓库中拉取代码并推送更改。
功能分支工作流:每个新功能或 bugfix 使用一个新的分支,开发完成后合并回主分支。
Git Flow:一个比较复杂的工作流,规定了开发、发布、维护等不同的分支策略。
8. 冲突管理
当不同开发者修改了同一文件的同一部分时,会发生 合并冲突。Git 会提示冲突,并要求开发者手动解决冲突。开发者需要编辑冲突的文件,决定保留哪些修改,然后提交。