一、Git 基础核心
1. 起源与定位
- 诞生背景:2005 年由 Linus Torvalds 为解决 Linux 内核代码管理问题开发,替代 BitKeeper(因协议冲突被收回授权)。
- 核心定位:分布式版本控制系统,优于集中式 VCS(CVS、SVN),无单点故障,支持离线操作。
- 发展里程碑:2008 年 GitHub 上线,推动 Git 成为开源项目首选版本控制工具。
2. 核心特性
- 分布式架构:每个本地库都是远程库的完整镜像,支持独立开发,服务器故障可通过本地库恢复。
- 快照式存储:不记录文件内容差异,直接保存每次提交的完整文件快照,未修改文件仅保留指针链接,提升性能。
- 本地优先设计:日志查看、版本对比、提交等操作均无需联网,依赖本地数据库,响应速度快。
- 分支轻量高效:分支本质是指向提交记录的指针,创建、切换、合并成本极低,支持并行开发。
3. 安装与环境配置
- 支持系统:Windows、Linux、Mac OS,安装需选择无中文、无空格的路径。
- 关键配置项:
- 用户名 / 邮箱:
git config --global user.name "xxx"、git config --global user.email "xxx"(提交记录的身份标识)。 - 换行符转换:
core.autocrlf(Windows 设为 true,自动转换 LF/CRLF;Unix 设为 input)。 - 路径环境变量:安装时可选择 "仅 Git Bash 使用""Windows 命令行可用" 等模式。
- 用户名 / 邮箱:
- 配置优先级:仓库级(.git/config)> 用户级(~/.gitconfig)> 系统级(Git 安装目录 /etc/gitconfig)。
二、仓库与核心概念
1. 仓库类型与结构
- 仓库(Repository):
- 本地库:包含工作区、暂存区、.git 版本库三部分。
- 远程库:用于团队协作的远程存储(如 Gitee、GitHub、GitLab)。
- 核心区域:
- 工作区(Workspace):本地可见目录(除 .git 文件夹外),存放实际文件。
- 暂存区(Stage/Index):位于 .git/index,临时存储待提交的修改,是工作区与版本库的中间层。
- 版本库(.git 目录):存储所有版本历史、分支、标签等元数据,不可手动修改。
- 关键概念:
- 分支(Branch):默认主分支为 master,可创建功能分支、修复分支等,实现并行开发。
- HEAD 指针:指向当前所在的分支或提交记录。
- 提交(Commit):每次提交生成唯一的 SHA-1 哈希值,记录版本快照及提交信息。
2. 基本工作流程
- 初始化 / 克隆:本地初始化(
git init)或克隆远程库(git clone <url>)。 - 本地开发:在工作区修改、新增文件。
- 暂存修改:
git add <file>或git add .(添加所有文件),将修改存入暂存区。 - 提交版本:
git commit -m "提交说明",将暂存区内容存入版本库,生成新的提交记录。 - 远程同步:拉取远程更新(
git pull)→ 推送本地修改(git push),完成团队协作。
三、核心命令操作(含场景与示例)
1. 仓库管理命令
| 命令 | 功能 | 示例 |
|---|---|---|
git init |
初始化本地 Git 仓库 | git init testGit(在 testGit 目录创建仓库) |
git clone <url> |
克隆远程仓库到本地 | git clone https://gitee.com/xxx/smart_breeding.git |
git remote add <name> <url> |
关联远程仓库 | git remote add origin https://gitee.com/xxx/xxx.git(origin 为远程库别名) |
git remote -v |
查看远程仓库关联信息 | 显示 origin 的 fetch/push 地址 |
git remote remove <name> |
删除远程仓库关联 | git remote remove origin |
2. 文件操作与状态查看
- 状态查看:
git status(显示工作区、暂存区文件状态,如未跟踪、已修改、待提交)。 - 暂存与取消:
git add <file>:添加单个文件到暂存区。git add .:添加所有新增 / 修改文件到暂存区。git rm --cached <file>:将暂存区文件移除,回归未跟踪状态。
- 提交与补充:
git commit -m "注释":提交暂存区文件到版本库,注释必填。git commit --amend:补充上次提交(未推送时可用)。
- 差异对比:
git diff:工作区与暂存区文件差异。git diff --cached:暂存区与版本库最新提交差异。git diff <commit1> <commit2>:两个提交间的差异。
3. 版本控制与回退
- 日志查看:
git log:显示完整提交日志(作者、时间、哈希值、注释)。git log --pretty=oneline:简洁显示(哈希值 + 注释)。git reflog:显示所有操作记录(含回退前的版本,用于恢复误回退)。
- 版本回退:
git reset --hard HEAD^:回退到上一版本(HEAD^^ 为上上个,HEAD~n 为前 n 个)。git reset --hard <commit哈希值>:回退到指定版本(哈希值可通过 git log 或 reflog 获取)。
- 文件恢复:
git checkout -- <file>:丢弃工作区未暂存的修改(恢复到暂存区或版本库状态)。git restore <file>:替代 checkout 的文件恢复功能(Git 2.23+ 支持)。
4. 删除文件管理
- 本地删除 + 版本库删除:
git rm <file>→git commit -m "删除文件"。 - 误删恢复:
git checkout -- <file>(文件已提交到版本库时可用)。
四、分支管理(核心协作功能)
1. 分支基础操作
| 命令 | 功能 | 示例 |
|---|---|---|
git branch |
查看所有分支(* 标记当前分支) | git branch(显示 master、dev 等分支) |
git branch <name> |
创建分支 | git branch dev(基于当前分支创建 dev 分支) |
git checkout <name> |
切换分支 | git checkout dev |
git checkout -b <name> |
创建并切换分支 | git checkout -b feature(创建 feature 分支并切换) |
git merge <name> |
合并分支到当前分支 | 切换到 master 后,git merge dev(合并 dev 到 master) |
git branch -d <name> |
删除已合并的分支 | git branch -d dev(未合并分支删除失败) |
git branch -D <name> |
强制删除分支 | git branch -D feature(未合并分支也可删除) |
2. 分支冲突解决
- 冲突场景:多分支修改同一文件的同一行内容,合并时触发冲突。
- 解决步骤:
- 合并时 Git 提示冲突文件(如
both modified: A.txt)。 - 打开冲突文件,手动编辑冲突区域(删除
<<<<<<<HEAD、>>>>>> dev等标记,保留需要的内容)。 git add <冲突文件>→git commit -m "解决分支冲突",完成合并。
- 合并时 Git 提示冲突文件(如
3. 分支管理策略
- 主分支:
- master/stable:稳定版本分支,用于发布,禁止直接修改。
- develop:日常开发分支,整合功能分支的修改。
- 辅助分支:
- feature 分支:基于 develop 创建,开发新功能,完成后合并回 develop。
- release 分支:基于 develop 创建,预发布测试,修复 bug 后合并到 develop 和 stable。
- bugfix 分支:基于 stable 创建,修复线上 bug,完成后合并到 stable 和 develop。
五、进阶功能
1. .gitignore 文件(忽略文件配置)
- 作用:指定无需 Git 跟踪的文件 / 目录(如日志、编译产物、临时文件)。
- 格式规范:
- 空行或 # 开头的行忽略。
- glob 模式匹配(
*匹配任意字符、?匹配单个字符、[n-m]匹配范围)。 - 目录后加
/(如logs/忽略 logs 目录)。 !取反(如!classes/a.class不忽略该文件)。
- 常用模板(Java 开发):
- 忽略编译产物:
*.class、target/、build/。 - 忽略 IDE 配置:
.idea/、*.iml、.settings/。 - 忽略系统文件:
.DS_Store、Thumbs.db。
- 忽略编译产物:
- 注意事项:.gitignore 仅对未跟踪文件生效,已跟踪文件需先执行
git rm --cached <file>再配置。
2. Git Stash(临时存储修改)
- 适用场景:开发中途需切换分支(如紧急修复 bug),但当前修改未完成,暂不提交。
- 核心命令:
git stash:将工作区 + 暂存区的未提交修改存入堆栈。git stash list:查看所有 stash 记录(如stash@{0}、stash@{1})。git stash pop:恢复最近的 stash 记录,并删除该记录。git stash apply <stash@{n}>:恢复指定 stash 记录,不删除。git stash drop <stash@{n}>:删除指定 stash 记录。
3. Tag 标签管理(版本标记)
- 作用:标记重要版本(如发布版本 v1.0),便于回溯。
- 标签类型:
- 轻量级标签:
git tag <name>(仅指向提交记录,无额外信息)。 - 附注标签:
git tag -a <name> -m "注释"(含作者、时间、注释,推荐使用)。
- 轻量级标签:
- 核心命令:
- 查看标签:
git tag。 - 推送标签:
git push origin <tag名>(单个标签)、git push origin --tag(所有标签)。 - 拉取标签:
git pull(自动拉取远程标签)。 - 删除标签:本地
git tag -d <tag名>,远程git push origin :refs/tags/<tag名>。 - 基于标签创建分支:
git checkout -b <branch名> <tag名>(用于版本补丁开发)。
- 查看标签:
六、远程协作与平台使用
1. 远程仓库交互命令
- 推送修改:
git push <remote> <branch>(如git push origin master,第一次推送加-u关联分支)。 - 拉取更新:
git pull <remote> <branch>(等价于git fetch + git merge,自动合并远程更新)。 - 查看远程分支:
git branch -a(显示本地 + 远程分支,远程分支前缀为remotes/origin/)。 - 关联远程分支:
git checkout -b <本地分支名> origin/<远程分支名>(拉取远程分支并关联)。 - 删除远程分支:
git push origin --delete <branch名>。
2. 多人协作流程
- 克隆远程仓库:
git clone <url>。 - 创建本地分支:
git checkout -b feature(基于 develop 分支)。 - 本地开发与提交:
git add .→git commit -m "xxx"。 - 拉取远程更新:
git pull origin develop(避免冲突)。 - 推送本地分支:
git push -u origin feature。 - 提交 Pull Request(PR):通过平台(GitHub/Gitee)申请合并到 develop 分支。
- 冲突处理:若推送失败,拉取远程更新后手动解决冲突,再重新推送。
3. 平台使用(GitHub/GitLab)
- GitHub 操作:
- 注册账号 → 创建仓库(公开 / 私有)→ 关联本地库 → 推送 / 拉取代码。
- 配置 SSH 密钥:
ssh-keygen -t rsa -C "邮箱",将公钥(id_rsa.pub)添加到 GitHub,免密码推送。
- GitLab 操作:
- 安装(CentOS 系统):通过 RPM 包安装(
yum localinstall gitlab-ce-xxx.rpm),配置external_url后启动(gitlab-ctl reconfigure)。 - 汉化:克隆中文汉化包,覆盖原文件后重启。
- 核心命令:
gitlab-ctl start/stop/restart(启动 / 停止 / 重启服务)、gitlab-ctl status(查看状态)。
- 安装(CentOS 系统):通过 RPM 包安装(
七、工具集成
1. 图形界面工具
- gitk:内置图形化日志查看工具,仓库目录下执行
gitk,可可视化分支合并历史。 - git gui:内置图形化操作工具,执行
git gui,支持暂存、提交、推送等操作。
2. IDEA 集成 Git
- 配置 Git:Settings → Version Control → Git,指定 Git 安装目录下的
git.exe,测试连接。 - 核心操作:
- 克隆仓库:VCS → Checkout from Version Control → Git,输入远程地址。
- 提交修改:右键项目 → Git → Commit Directory,填写注释提交。
- 分支管理:右下角切换分支,或通过 Git → Branches 操作。
- 推送 / 拉取:VCS → Git → Push/Pull。
- 解决冲突:合并分支时,IDEA 会弹出冲突文件编辑界面,可视化解决。
八、常见问题与注意事项
- 身份验证失败(HTTPS 方式):Gitee/GitHub 不再支持明文密码,需使用个人访问令牌(Personal Access Token)作为密码。
- 推送被拒绝(400 错误):可能是 IP 风控(切换网络)、分支保护(添加白名单)或请求格式异常(重置 Git 配置)。
- 分支合并冲突:优先拉取远程更新,手动编辑冲突文件,确保代码逻辑正确后再提交。
- 本地库与远程库不一致:执行
git pull --rebase同步远程更新,避免产生多余的合并提交。