本教程适用于 Git 初学者到进阶用户,涵盖日常开发中 90% 的使用场景。
什么是 Git#
Git 是一个分布式版本控制系统,用于跟踪文件的修改历史。与集中式版本控制系统(如 SVN)不同,Git 的每个工作副本都是完整的仓库,包含项目的完整历史记录。
Git 的核心概念#
- 仓库(Repository): 项目的版本控制中心,包含所有文件的历史记录。
- 工作目录(Working Directory): 你在本地进行修改的文件所在目录。
- 暂存区(Staging Area): 一个中间区域,用于暂存你要提交的文件变更。
- 本地仓库(Local Repository): 你在本地计算机上的仓库,包含完整的历史记录。
- 远程仓库(Remote Repository): 托管在服务器上的仓库,用于与团队成员共享代码。
Git 工作流程#
graph TB
subgraph "Git 工作区域"
A[工作目录<br/>Working Directory]
B[暂存区<br/>Staging Area]
C[本地仓库<br/>Local Repository]
D[远程仓库<br/>Remote Repository]
end
A -->|git add| B
B -->|git commit| C
C -->|git push| D
D -->|git pull| C
C -->|git checkout| A
style A fill:#e3f2fd
style B fill:#f3e5f5
style C fill:#e8f5e9
style D fill:#fff3e0Git 安装与配置#
安装 Git#
Windows: 下载并安装 Git for Windows
macOS:
# 使用 Homebrew
brew install git
# 或者下载安装包
# https://git-scm.com/download/macLinux (Ubuntu/Debian):
sudo apt update
sudo apt install gitLinux (CentOS/RHEL):
sudo yum install git基础配置#
# 配置用户信息(必须)
git config --global user.name "你的名字"
git config --global user.email "your.email@example.com"
# 配置默认分支名(推荐)
git config --global init.defaultBranch main
# 配置文本编辑器(可选)
git config --global core.editor vim
# 查看配置
git config --listGit 基础操作#
初始化仓库#
# 在当前目录初始化 Git 仓库
git init
# 克隆远程仓库
git clone https://github.com/username/repository.git
# 克隆并指定目录名
git clone https://github.com/username/repository.git my-project文件状态管理#
# 查看文件状态
git status
# 添加文件到暂存区
git add filename.txt
git add . # 添加所有文件
git add -A # 添加所有变更(包括删除)
# 从暂存区移除文件
git reset filename.txt
# 提交变更
git commit -m "提交信息"
git commit -m "标题" -m "详细描述"
# 跳过暂存区直接提交
git commit -am "提交信息"查看历史#
# 查看提交历史
git log
# 简洁查看
git log --oneline
# 查看最近5次提交
git log -5
# 查看文件修改历史
git log --follow filename.txt
# 查看每次提交的差异
git log -p
# 查看统计信息
git log --stat撤销操作#
# 撤销工作区的修改
git checkout -- filename.txt
# 撤销暂存区的文件
git reset HEAD filename.txt
# 修改最后一次提交
git commit --amend -m "新的提交信息"
# 回退到指定版本
git reset --hard commit-hash
# 软回退(保留修改)
git reset --soft commit-hash分支管理#
分支概念#
graph LR
A[main分支] --> B[创建feature分支]
B --> C[开发新功能]
C --> D[合并回main]
A --> E[创建hotfix分支]
E --> F[修复bug]
F --> D
style A fill:#4caf50
style B fill:#2196f3
style C fill:#2196f3
style D fill:#4caf50
style E fill:#ff9800
style F fill:#ff9800分支操作#
# 查看分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支
# 创建分支
git branch feature-login
git checkout -b feature-login # 创建并切换
# 切换分支
git checkout main
git switch main # Git 2.23+ 新命令
# 合并分支
git merge feature-login
# 删除分支
git branch -d feature-login # 安全删除
git branch -D feature-login # 强制删除
# 重命名分支
git branch -m old-name new-name解决冲突#
当合并分支时出现冲突:
# 1. 查看冲突文件
git status
# 2. 手动编辑冲突文件
# 删除冲突标记,保留需要的代码
# 3. 标记冲突已解决
git add filename.txt
# 4. 完成合并
git commit远程仓库操作#
连接远程仓库#
# 添加远程仓库
git remote add origin https://github.com/username/repository.git
# 查看远程仓库
git remote -v
# 重命名远程仓库
git remote rename origin github
# 删除远程仓库
git remote remove origin推送与拉取#
# 推送到远程仓库
git push origin main
# 首次推送(设置上游分支)
git push -u origin main
# 强制推送(谨慎使用)
git push -f origin main
# 拉取更新
git pull origin main
# 获取更新但不合并
git fetch origin标签管理#
# 创建标签
git tag v1.0.0
git tag -a v1.0.0 -m "版本说明"
# 查看标签
git tag
# 推送标签
git push origin v1.0.0
git push origin --tags
# 删除标签
git tag -d v1.0.0
git push origin --delete v1.0.0高级功能#
Stash(暂存)#
# 保存当前工作进度
git stash
# 查看保存的进度
git stash list
# 恢复最近保存的进度
git stash pop
# 恢复指定的进度
git stash apply stash@{1}
# 删除保存的进度
git stash drop stash@{0}Cherry-pick#
# 选择性地合并某个提交
git cherry-pick commit-hash
# 合并多个提交
git cherry-pick commit1 commit2
# 继续合并(解决冲突后)
git cherry-pick --continueRebase#
# 交互式 rebase
git rebase -i HEAD~3
# 继续 rebase
git rebase --continue
# 中止 rebase
git rebase --abort
# 跳过当前提交
git rebase --skip子模块#
# 添加子模块
git submodule add https://github.com/user/repo.git path/to/submodule
# 初始化子模块
git submodule init
# 更新子模块
git submodule update
# 递归更新
git submodule update --recursive --remoteGit 工作流程#
Git Flow 工作流#
graph TB
A[main] --> B[develop]
B --> C[feature/feature-1]
B --> D[feature/feature-2]
C --> B
D --> B
B --> E[release/v1.0]
E --> A
E --> F[hotfix/fix-1]
F --> A
F --> B
style A fill:#4caf50
style B fill:#2196f3
style C fill:#9c27b0
style D fill:#9c27b0
style E fill:#ff9800
style F fill:#f44336GitHub Flow#
- 创建分支:从 main 分支创建功能分支
- 提交修改:在功能分支上进行开发
- 创建 Pull Request:提交代码审查
- 代码审查:团队成员进行代码审查
- 合并分支:审查通过后合并到 main 分支
- 部署:自动或手动部署到生产环境
GitLab Flow#
结合 Git Flow 和 GitHub Flow 的优点,支持多环境部署。
实用技巧#
配置别名#
# 配置常用别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual '!gitk'忽略文件#
创建 .gitignore 文件:
# 忽略所有 .log 文件
*.log
# 忽略 node_modules 目录
node_modules/
# 忽略 IDE 配置文件
.vscode/
.idea/
# 忽略操作系统文件
.DS_Store
Thumbs.db
# 忽略编译输出
dist/
build/
*.exe
*.dll查看文件差异#
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与仓库的差异
git diff --staged
# 查看两个提交的差异
git diff commit1 commit2
# 查看文件的历史修改
git log -p filename.txt统计信息#
# 查看提交统计
git shortlog -sn
# 查看代码行数统计
git log --stat
# 查看贡献者
git log --pretty=format:"%an" | sort | uniq -c | sort -nr常见问题解决#
误提交大文件#
# 从仓库中删除大文件
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch path/to/large-file' \
--prune-empty --tag-name-filter cat -- --all
# 清理和垃圾回收
git reflog expire --expire=now --all
git gc --prune=now --aggressive修改历史提交信息#
# 修改最近一次提交
git commit --amend
# 修改历史提交(交互式)
git rebase -i HEAD~3找回丢失的提交#
# 查看引用日志
git reflog
# 恢复到某个状态
git reset --hard HEAD@{1}子模块问题#
# 更新子模块
git submodule update --init --recursive
# 克隆包含子模块的仓库
git clone --recursive https://github.com/user/repo.git最佳实践#
提交信息规范#
类型(范围): 简短描述
详细描述(可选)
Fixes #123类型说明:
feat: 新功能fix: 修复bugdocs: 文档更新style: 代码格式调整refactor: 代码重构test: 测试相关chore: 构建过程或辅助工具的变动
分支命名规范#
feature/功能名称:新功能开发bugfix/bug描述:bug修复hotfix/紧急修复:紧急修复release/版本号:发布准备test/测试名称:测试相关
工作流程建议#
- 频繁提交:小而频繁的提交比大而少的提交更好
- 明确提交信息:写清楚提交的目的和内容
- 及时拉取:开始工作前拉取最新代码
- 使用分支:不要在主分支上直接开发
- 代码审查:提交前进行自我审查
- 保持同步:定期与远程仓库同步
学习资源#
官方资源#
交互式学习#
可视化工具#
总结#
Git 是现代软件开发中不可或缺的工具。掌握 Git 不仅能够提高开发效率,还能更好地与团队协作。本教程涵盖了 Git 的核心概念和常用操作,建议通过实践来加深理解。
记住 Git 的学习曲线可能有些陡峭,但一旦掌握,它将成为你开发工具箱中最强大的工具之一。持续练习,遇到问题不要害怕,Git 的强大功能值得你投入时间学习。
💡 提示:Git 命令很多,不需要全部记住。常用的命令熟练掌握即可,其他的可以按需查询。建议收藏本教程作为参考手册。