Git 全面指南:核心概念、命令精讲与深度对比
Git 是一个分布式版本控制系统,它能够高效、灵活地管理项目代码,并支持团队协作。掌握 Git 不仅是开发者的基本技能,更是提升工作效率和代码质量的关键。
一、Git 核心概念与工作原理
理解 Git 的内部机制是高效使用的基础。
1.1 Git 的三大区域:工作区、暂存区、本地仓库
- 工作区 (Working Directory)
- 定义:你电脑上实际可见、编辑和操作的文件和目录。这是你进行代码开发的地方。
- 状态:文件可以是“未修改”、“已修改”或“未跟踪”。
- 暂存区 (Staging Area / Index)
- 定义:一个介于工作区和本地仓库之间的缓存区域。它是一个文件(通常在
.git/index),记录了你下次提交时要包含的文件的快照。 - 作用:允许你精确控制每次提交的内容。你可以选择性地将工作区中的部分更改添加到暂存区,多次
git add来逐步构建一个逻辑清晰的提交。
- 定义:一个介于工作区和本地仓库之间的缓存区域。它是一个文件(通常在
- 本地仓库 (Local Repository)
- 定义:项目根目录下隐藏的
.git文件夹。它包含了项目所有的版本历史信息,包括所有提交对象、分支指针、标签、配置等。 - 作用:存储了项目完整的历史记录。即使没有网络连接,你也可以进行提交、查看历史、切换分支等操作。
- 定义:项目根目录下隐藏的
1.2 HEAD 指针与分支
- HEAD:
- 定义:一个特殊的指针,它总是指向你当前所在分支的最新提交。
- 作用:标识你当前工作区和暂存区所基于的提交。当你进行新的提交时,HEAD 会随着当前分支一起向前移动。
- 分支 (Branch):
- 定义:一个轻量级的可移动指针,指向某个提交。默认分支通常是
main或master。 - 作用:允许你在不影响主线开发的情况下进行并行工作。每个分支都代表了项目历史中的一个独立开发路径。
- 定义:一个轻量级的可移动指针,指向某个提交。默认分支通常是
1.3 远程仓库与远程跟踪分支
- 远程仓库 (Remote Repository):
- 定义:托管在网络上的 Git 仓库(如 GitHub、GitLab、Gerrit 等),用于团队成员之间共享代码和协作。
- 作用:作为团队协作的中心枢纽,方便代码的同步、备份和发布。
- 远程跟踪分支 (Remote-tracking Branch):
- 定义:本地仓库中对远程仓库分支的引用(例如
origin/main)。它是一个只读的本地指针,反映了你上次与远程仓库通信时,远程分支所处的位置。 - 作用:让你知道远程分支的最新状态,而无需实际切换到远程分支。它不是你可以在其上直接工作的分支。
- 定义:本地仓库中对远程仓库分支的引用(例如
1.4 Git 对象模型 (Blob, Tree, Commit, Tag)
Git 内部存储数据是通过四种基本对象:
- Blob (二进制大对象):存储文件的内容。每个文件的内容都有一个唯一的 Blob 对象。
- Tree (树对象):存储目录结构和文件名的映射。它包含指向 Blob 对象(文件)和其它 Tree 对象(子目录)的指针。
- Commit (提交对象):存储了项目在某个时间点的快照。它包含:
- 指向一个 Tree 对象的指针(代表项目根目录的快照)。
- 作者信息、提交者信息、提交时间。
- 提交信息。
- 一个或多个父提交的指针(通常是一个,合并提交有多个)。
- Tag (标签对象):指向一个提交的永久性引用,通常用于标记发布版本。
1.5 Git 工作流程概览
- 修改:在工作区中修改文件。
- 暂存:使用
git add将修改后的文件从工作区添加到暂存区。 - 提交:使用
git commit将暂存区中的快照永久保存到本地仓库,形成一个新的提交。 - 同步:使用
git push将本地仓库的提交推送到远程仓库,或使用git pull从远程仓库获取更新到本地仓库。
二、Git 基础配置与仓库管理
2.1 git config:配置 Git 环境
- 目的:配置 Git 的行为,包括用户信息、编辑器、别名、换行符处理等。
- 作用域:
--system:系统级别,对所有用户和所有仓库生效(通常需要管理员权限)。--global:用户级别,对当前用户的所有仓库生效。--local(默认):仓库级别,只对当前仓库生效。
- 常用用法:
# 设置全局用户名(用于提交记录的 Author) git config --global user.name "Your Name" # 设置全局用户邮箱 git config --global user.email "your.email@example.com" # 查看所有配置 git config --list # 查看特定配置 git config user.name # 设置默认文本编辑器(如 VS Code, Vim) git config --global core.editor "code --wait" # VS Code git config --global core.editor "vim" # Vim # 配置 Git 别名 (快捷方式) git config --global alias.co checkout #git checkout=git co git config --global alias.br branch git config --global alias.ci commit git config --global alias.st status git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" # 配置换行符自动转换 (重要,尤其在跨平台协作时) # Windows 用户推荐: git config --global core.autocrlf true # Linux/macOS 用户推荐: git config --global core.autocrlf input - 细致讲解:
core.autocrlf用于处理 Windows (CRLF) 和 Unix/Linux (LF) 之间不同的换行符约定。true表示 Git 在提交时将 CRLF 转换为 LF,在签出时将 LF 转换回 CRLF;input表示 Git 在提交时将 CRLF 转换为 LF,但签出时不转换(保持 LF)。
2.2 git init:初始化本地仓库
- 目的:在一个空目录或现有项目目录中创建空的 Git 仓库。
- 用法:
mkdir my_new_project cd my_new_project git init - 细致讲解:执行
git init后,会在当前目录下创建一个.git隐藏文件夹。这个文件夹就是你的本地仓库,包含了 Git 管理项目所需的所有元数据。此时,你的工作区和暂存区都是空的,但已准备好接收文件。
2.3 git clone:克隆远程仓库
- 目的:从远程仓库复制一份完整的仓库到本地,包括所有历史记录和分支。
- 用法:
git clone <远程仓库URL> [本地目录名] # 示例:git clone https://github.com/user/repo.git MyProject - 细致讲解:
git clone会在当前目录下创建一个与远程仓库同名的目录(如果未指定本地目录名),并将远程仓库的所有历史记录下载到本地。- 它会自动:
- 将远程仓库命名为
origin(这是一个别名)。 - 设置本地的
main(或master) 分支跟踪远程的origin/main(或origin/master) 分支。 - 检出远程仓库的默认分支到你的本地工作区。
- 将远程仓库命名为
- 克隆完成后,你就可以在本地进行开发、提交,并与远程仓库同步。
2.4 git remote:管理远程仓库连接
- 目的:管理你的本地仓库与远程仓库之间的连接信息。
- 用法:
git remote -v # 列出所有远程仓库的名称及其URL (verbose 模式) git remote add <名称> <URL> # 添加一个新的远程仓库连接 # 示例:git remote add upstream https://github.original.com/repo.git git remote rm <名称> # 删除一个远程仓库连接 git remote rename <旧名称> <新名称> # 重命名一个远程仓库连接 git remote set-url <名称> <新URL> # 修改远程仓库的URL - 细致讲解:
origin是git clone自动为你创建的默认远程仓库名称。你可以添加多个远程仓库,例如upstream来指代原始上游仓库,而origin指代你自己的 Fork。
三、日常开发:文件状态与本地提交
3.1 git status:查看工作区状态
- 目的:显示工作区和暂存区中文件的当前状态,帮助你了解哪些文件被修改、哪些已暂存、哪些未跟踪。
- 用法:
git status - 细致讲解:
- Untracked files (未跟踪):新创建的文件,Git 还没有开始跟踪它们。需要
git add才能将其纳入版本控制。 - Changes to be committed (待提交的更改):已添加到暂存区的文件,这些更改将在下次
git commit时被包含。 - Changes not staged for commit (未暂存的更改):已修改但尚未添加到暂存区的文件。
- nothing to commit, working tree clean (工作区干净):所有更改都已提交,工作区没有未暂存的修改。
- Untracked files (未跟踪):新创建的文件,Git 还没有开始跟踪它们。需要
- 常用选项:
git status -s或git status --short:以简洁的格式显示状态,每行一个文件,用两个字符表示状态(如M表示已修改未暂存,AM表示已添加到暂存区但工作区又被修改)。
3.2 git add:添加文件到暂存区
- 目的:将工作区中的更改(新建、修改、删除)添加到暂存区,准备提交。
- 用法:
git add <文件名> # 添加指定文件 git add dir/ # 添加指定目录下的所有文件 - 细致讲解:
git add并不是真的“添加”文件到仓库,而是将文件在工作区的当前状态的快照记录到暂存区。下次git commit时,就会根据暂存区的快照来创建提交。 - 功能相似命令的对比区分:
git add .:- 作用:添加所有当前目录及其子目录下已修改和新建的文件到暂存区。
- 注意:不包括已删除的文件。在 Git 2.0 之前的版本,它也不处理目录重命名。
- 适用场景:当你希望提交所有修改和新增的文件,且没有删除文件时。
git add -u(或--update):- 作用:添加所有已修改和已删除的文件到暂存区。
- 注意:不包括新建的未跟踪文件。
- 适用场景:当你只关注现有文件的修改和删除,不希望将新文件包含在当前提交中时。
git add -A(或--all):

最低0.47元/天 解锁文章
255

被折叠的 条评论
为什么被折叠?



