git完整学习指南
·
Git 完整学习指南
目录
- 1. Git 基础概念
- 2. Git 安装与配置
- 3. Git 基本操作
- 4. 分支管理
- 5. 远程仓库
- 6. 版本回退与修改
- 7. 标签管理
- 8. Git 工作流
- 9. 高级功能
- 10. 常见问题解决
- 11. 最佳实践
- 12. 图形化工具
1. Git 基础概念
1.1 什么是 Git?
Git 是一个分布式版本控制系统,用于跟踪文件的变化并协调多人协作开发。
核心特点
- 分布式: 每个开发者都有完整的代码历史
- 快速: 大部分操作都在本地进行
- 数据完整性: 使用 SHA-1 哈希确保数据完整性
- 分支管理: 轻量级的分支创建和合并
1.2 Git 与其他版本控制系统的区别
| 特性 | Git (分布式) | SVN (集中式) |
|---|---|---|
| 存储方式 | 每个节点都有完整历史 | 只有中央服务器有完整历史 |
| 离线工作 | 支持 | 不支持 |
| 分支操作 | 快速、轻量 | 慢、重量级 |
| 合并能力 | 强大 | 相对较弱 |
1.3 Git 的三个区域
工作区 (Working Directory)
↓ git add
暂存区 (Staging Area)
↓ git commit
本地仓库 (Local Repository)
↓ git push
远程仓库 (Remote Repository)
- 工作区: 你正在编辑的文件所在的目录
- 暂存区: 准备提交的文件快照
- 本地仓库: Git 存储项目历史的地方
- 远程仓库: 托管在服务器上的仓库
1.4 文件状态
Git 中的文件有四种状态:
- 未跟踪 (Untracked): 新创建的文件,Git 还不知道
- 已修改 (Modified): 文件已修改但未暂存
- 已暂存 (Staged): 文件已添加到暂存区
- 已提交 (Committed): 文件已保存到本地仓库
2. Git 安装与配置
2.1 安装 Git
Windows
- 访问 Git 官网
- 下载 Windows 版本
- 运行安装程序,建议选择以下选项:
- 选择 “Git from the command line and also from 3rd-party software”
- 选择 “Use the OpenSSL library”
- 选择 “Checkout Windows-style, commit Unix-style line endings”
macOS
# 使用 Homebrew
brew install git
# 或者下载官方安装包
# 访问 https://git-scm.com/download/mac
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install git
Linux (CentOS/RHEL)
sudo yum install git
# 或者
sudo dnf install git
2.2 验证安装
git --version
2.3 初始配置
设置用户信息
# 设置全局用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 查看配置
git config --list
# 查看特定配置
git config user.name
git config user.email
其他有用的配置
# 设置默认编辑器
git config --global core.editor "code --wait" # VS Code
git config --global core.editor "vim" # Vim
# 设置默认分支名
git config --global init.defaultBranch main
# 启用颜色输出
git config --global color.ui auto
# 设置换行符处理 (Windows)
git config --global core.autocrlf true
# 设置换行符处理 (macOS/Linux)
git config --global core.autocrlf input
# 忽略文件权限变化 (仅限 Unix 系统)
git config --global core.filemode false
配置级别
# 系统级配置 (影响所有用户)
git config --system
# 全局配置 (影响当前用户)
git config --global
# 本地配置 (仅影响当前仓库)
git config --local
3. Git 基本操作
3.1 创建仓库
初始化新仓库
# 在当前目录初始化
git init
# 在指定目录初始化
git init my-project
cd my-project
克隆现有仓库
# 克隆远程仓库
git clone https://github.com/user/repo.git
# 克隆到指定目录
git clone https://github.com/user/repo.git my-folder
# 克隆指定分支
git clone -b branch-name https://github.com/user/repo.git
3.2 基本工作流程
1. 查看状态
# 查看工作区状态
git status
# 简洁输出
git status -s
2. 添加文件到暂存区
# 添加单个文件
git add filename.txt
# 添加多个文件
git add file1.txt file2.txt
# 添加所有文件
git add .
# 添加所有 .js 文件
git add *.js
# 交互式添加
git add -i
3. 提交更改
# 提交暂存区的文件
git commit -m "提交信息"
# 提交并添加详细描述
git commit -m "简短描述" -m "详细描述"
# 跳过暂存区直接提交 (仅限已跟踪文件)
git commit -am "提交信息"
# 修改最后一次提交
git commit --amend -m "新的提交信息"
3.3 查看历史
查看提交历史
# 查看提交历史
git log
# 简洁的一行显示
git log --oneline
# 显示图形化分支
git log --graph --oneline
# 显示最近 n 次提交
git log -n 5
# 显示某个文件的历史
git log filename.txt
# 显示提交的详细信息
git log -p
# 显示统计信息
git log --stat
查看具体更改
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与最后一次提交的差异
git diff --staged
# 查看两次提交之间的差异
git diff commit1 commit2
# 查看特定文件的差异
git diff filename.txt
3.4 撤销操作
撤销工作区的修改
# 撤销单个文件的修改
git checkout -- filename.txt
# 撤销所有文件的修改
git checkout -- .
# 新版本 Git 推荐使用
git restore filename.txt
git restore .
撤销暂存区的文件
# 将文件从暂存区移除 (保留工作区修改)
git reset HEAD filename.txt
# 新版本 Git 推荐使用
git restore --staged filename.txt
4. 分支管理
4.1 分支基础概念
分支是 Git 最强大的功能之一,它允许你在不影响主代码的情况下开发新功能。
分支的优势
- 并行开发: 多个功能可以同时开发
- 实验安全: 可以安全地尝试新想法
- 版本隔离: 不同版本的代码可以独立存在
4.2 分支基本操作
查看分支
# 查看本地分支
git branch
# 查看所有分支 (包括远程)
git branch -a
# 查看远程分支
git branch -r
# 查看分支详细信息
git branch -v
创建分支
# 创建新分支
git branch feature-login
# 创建并切换到新分支
git checkout -b feature-login
# 新版本 Git 推荐使用
git switch -c feature-login
# 基于特定提交创建分支
git branch feature-login commit-hash
切换分支
# 切换到指定分支
git checkout feature-login
# 新版本 Git 推荐使用
git switch feature-login
# 切换到上一个分支
git switch -
删除分支
# 删除已合并的分支
git branch -d feature-login
# 强制删除分支 (即使未合并)
git branch -D feature-login
# 删除远程分支
git push origin --delete feature-login
4.3 分支合并
快进合并 (Fast-forward)
# 切换到目标分支
git switch main
# 合并分支
git merge feature-login
三方合并 (Three-way merge)
# 当分支有分叉时,Git 会创建合并提交
git merge feature-login
# 禁用快进合并,强制创建合并提交
git merge --no-ff feature-login
变基合并 (Rebase)
# 将当前分支的提交重新应用到目标分支
git rebase main
# 交互式变基
git rebase -i main
# 变基时解决冲突后继续
git rebase --continue
# 取消变基
git rebase --abort
4.4 解决合并冲突
当两个分支修改了同一文件的同一部分时,会产生冲突:
冲突标记
<<<<<<< HEAD
当前分支的内容
=======
要合并分支的内容
>>>>>>> feature-branch
解决冲突步骤
- 查看冲突文件:
git status - 编辑冲突文件,删除冲突标记,保留需要的内容
- 添加解决后的文件:
git add filename.txt - 完成合并:
git commit
冲突解决工具
# 使用图形化工具解决冲突
git mergetool
# 配置合并工具
git config --global merge.tool vimdiff
5. 远程仓库
5.1 远程仓库基础
查看远程仓库
# 查看远程仓库
git remote
# 查看远程仓库详细信息
git remote -v
# 查看特定远程仓库信息
git remote show origin
添加远程仓库
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
# 添加多个远程仓库
git remote add upstream https://github.com/original/repo.git
修改远程仓库
# 修改远程仓库 URL
git remote set-url origin https://github.com/user/new-repo.git
# 重命名远程仓库
git remote rename origin new-origin
# 删除远程仓库
git remote remove origin
5.2 推送和拉取
推送到远程仓库
# 推送当前分支到远程仓库
git push origin main
# 推送所有分支
git push origin --all
# 推送标签
git push origin --tags
# 设置上游分支 (首次推送)
git push -u origin main
# 强制推送 (危险操作)
git push --force origin main
从远程仓库拉取
# 获取远程仓库的更新 (不合并)
git fetch origin
# 获取并合并远程分支
git pull origin main
# 拉取时使用变基
git pull --rebase origin main
# 拉取所有远程分支
git fetch --all
5.3 跟踪分支
设置跟踪分支
# 创建跟踪远程分支的本地分支
git checkout -b feature origin/feature
# 设置当前分支跟踪远程分支
git branch --set-upstream-to=origin/main main
# 查看跟踪关系
git branch -vv
5.4 常见远程操作场景
协作开发流程
# 1. 克隆仓库
git clone https://github.com/team/project.git
# 2. 创建功能分支
git checkout -b feature-new-function
# 3. 开发并提交
git add .
git commit -m "Add new function"
# 4. 推送分支
git push origin feature-new-function
# 5. 在 GitHub/GitLab 创建 Pull Request/Merge Request
# 6. 合并后删除本地分支
git checkout main
git pull origin main
git branch -d feature-new-function
同步 Fork 仓库
# 添加上游仓库
git remote add upstream https://github.com/original/repo.git
# 获取上游更新
git fetch upstream
# 合并上游主分支
git checkout main
git merge upstream/main
# 推送到自己的仓库
git push origin main
6. 版本回退与修改
6.1 查看历史版本
查看提交历史
# 查看提交历史
git log --oneline
# 查看文件的修改历史
git log -p filename.txt
# 查看某个提交的详细信息
git show commit-hash
# 查看引用日志 (包括被删除的提交)
git reflog
6.2 版本回退
软回退 (保留工作区和暂存区)
# 回退到上一个版本
git reset --soft HEAD~1
# 回退到指定版本
git reset --soft commit-hash
混合回退 (保留工作区,清空暂存区)
# 默认的回退方式
git reset HEAD~1
git reset --mixed HEAD~1
# 回退到指定版本
git reset commit-hash
硬回退 (清空工作区和暂存区)
# 危险操作:完全回退到指定版本
git reset --hard HEAD~1
git reset --hard commit-hash
# 回退到远程分支状态
git reset --hard origin/main
6.3 撤销特定提交
使用 revert (推荐)
# 撤销最后一次提交
git revert HEAD
# 撤销指定提交
git revert commit-hash
# 撤销多个提交
git revert commit1..commit3
# 撤销但不自动提交
git revert --no-commit commit-hash
6.4 修改历史
修改最后一次提交
# 修改提交信息
git commit --amend -m "新的提交信息"
# 添加文件到最后一次提交
git add forgotten-file.txt
git commit --amend --no-edit
交互式变基
# 修改最近 3 次提交
git rebase -i HEAD~3
# 在编辑器中可以进行以下操作:
# pick: 保留提交
# reword: 修改提交信息
# edit: 修改提交内容
# squash: 合并到上一个提交
# drop: 删除提交
7. 标签管理
7.1 标签基础
标签用于标记重要的版本节点,如发布版本。
查看标签
# 查看所有标签
git tag
# 查看标签详细信息
git show tag-name
# 搜索标签
git tag -l "v1.*"
7.2 创建标签
轻量标签
# 在当前提交创建标签
git tag v1.0
# 在指定提交创建标签
git tag v1.0 commit-hash
附注标签 (推荐)
# 创建带信息的标签
git tag -a v1.0 -m "Version 1.0 release"
# 在指定提交创建标签
git tag -a v1.0 commit-hash -m "Version 1.0 release"
7.3 标签操作
推送标签
# 推送单个标签
git push origin v1.0
# 推送所有标签
git push origin --tags
删除标签
# 删除本地标签
git tag -d v1.0
# 删除远程标签
git push origin --delete v1.0
检出标签
# 检出标签 (分离头指针状态)
git checkout v1.0
# 基于标签创建分支
git checkout -b hotfix-v1.0 v1.0
8. Git 工作流
8.1 集中式工作流
适合小团队,所有人都在 main 分支上工作。
# 开发者 A
git clone https://github.com/team/project.git
# 修改文件
git add .
git commit -m "Feature A"
git push origin main
# 开发者 B
git pull origin main # 先拉取最新代码
# 修改文件
git add .
git commit -m "Feature B"
git push origin main
8.2 功能分支工作流
每个功能在独立分支上开发。
# 创建功能分支
git checkout -b feature-user-auth
# 开发功能
git add .
git commit -m "Add user authentication"
# 推送分支
git push origin feature-user-auth
# 创建 Pull Request
# 代码审查后合并到 main
8.3 Gitflow 工作流
适合有定期发布周期的项目。
分支类型
- main: 生产环境代码
- develop: 开发环境代码
- feature/*: 功能分支
- release/*: 发布分支
- hotfix/*: 热修复分支
操作示例
# 初始化 Gitflow
git flow init
# 开始新功能
git flow feature start user-login
# 完成功能
git flow feature finish user-login
# 开始发布
git flow release start v1.0
# 完成发布
git flow release finish v1.0
# 开始热修复
git flow hotfix start critical-bug
# 完成热修复
git flow hotfix finish critical-bug
8.4 GitHub Flow
简化的工作流,适合持续部署。
# 1. 从 main 创建分支
git checkout -b feature-branch
# 2. 添加提交
git add .
git commit -m "Add feature"
# 3. 推送分支
git push origin feature-branch
# 4. 创建 Pull Request
# 5. 讨论和代码审查
# 6. 合并到 main
# 7. 部署
9. 高级功能
9.1 Git Stash (储藏)
当需要快速切换分支但当前工作未完成时使用。
基本储藏操作
# 储藏当前工作
git stash
# 储藏时添加描述
git stash save "Work in progress on feature X"
# 查看储藏列表
git stash list
# 应用最新的储藏
git stash apply
# 应用指定的储藏
git stash apply stash@{2}
# 应用储藏并删除
git stash pop
# 删除储藏
git stash drop stash@{0}
# 清空所有储藏
git stash clear
高级储藏操作
# 储藏包括未跟踪的文件
git stash -u
# 储藏包括忽略的文件
git stash -a
# 交互式储藏
git stash -p
# 从储藏创建分支
git stash branch new-branch stash@{0}
9.2 Git Submodule (子模块)
用于在一个 Git 仓库中包含另一个 Git 仓库。
添加子模块
# 添加子模块
git submodule add https://github.com/user/library.git lib
# 初始化子模块
git submodule init
# 更新子模块
git submodule update
# 一次性初始化并更新
git submodule update --init --recursive
子模块操作
# 克隆包含子模块的仓库
git clone --recursive https://github.com/user/project.git
# 更新所有子模块到最新版本
git submodule update --remote
# 删除子模块
git submodule deinit lib
git rm lib
9.3 Git Hooks (钩子)
在特定 Git 事件发生时自动执行脚本。
常用钩子
- pre-commit: 提交前执行
- post-commit: 提交后执行
- pre-push: 推送前执行
- post-receive: 接收推送后执行
示例:pre-commit 钩子
#!/bin/sh
# .git/hooks/pre-commit
# 运行代码检查
npm run lint
if [ $? -ne 0 ]; then
echo "Lint failed. Commit aborted."
exit 1
fi
# 运行测试
npm test
if [ $? -ne 0 ]; then
echo "Tests failed. Commit aborted."
exit 1
fi
9.4 Git Worktree (工作树)
允许同时检出多个分支到不同目录。
# 创建新的工作树
git worktree add ../project-feature feature-branch
# 列出所有工作树
git worktree list
# 删除工作树
git worktree remove ../project-feature
# 清理工作树
git worktree prune
10. 常见问题解决
10.1 提交相关问题
撤销最后一次提交
# 保留文件修改
git reset --soft HEAD~1
# 完全撤销
git reset --hard HEAD~1
修改提交信息
# 修改最后一次提交信息
git commit --amend -m "新的提交信息"
# 修改历史提交信息
git rebase -i HEAD~3
合并多个提交
# 交互式变基合并提交
git rebase -i HEAD~3
# 在编辑器中将要合并的提交标记为 squash
10.2 分支相关问题
删除远程已删除的本地分支
# 清理远程跟踪分支
git remote prune origin
# 删除已合并的本地分支
git branch --merged | grep -v "\*\|main\|develop" | xargs -n 1 git branch -d
恢复删除的分支
# 查找删除的分支
git reflog
# 恢复分支
git checkout -b recovered-branch commit-hash
10.3 合并冲突解决
查看冲突文件
# 查看冲突状态
git status
# 查看冲突内容
git diff
使用工具解决冲突
# 配置合并工具
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
# 启动合并工具
git mergetool
10.4 远程仓库问题
推送被拒绝
# 先拉取远程更新
git pull origin main
# 如果有冲突,解决后再推送
git push origin main
更改远程仓库 URL
# 从 HTTPS 改为 SSH
git remote set-url origin git@github.com:user/repo.git
# 验证更改
git remote -v
10.5 文件相关问题
忽略已跟踪的文件
# 停止跟踪文件但保留在工作区
git rm --cached filename.txt
# 更新 .gitignore 文件
echo "filename.txt" >> .gitignore
git add .gitignore
git commit -m "Add filename.txt to .gitignore"
恢复删除的文件
# 恢复工作区删除的文件
git checkout HEAD -- filename.txt
# 恢复历史版本的文件
git checkout commit-hash -- filename.txt
11. 最佳实践
11.1 提交规范
提交信息格式
<type>(<scope>): <subject>
<body>
<footer>
提交类型
- feat: 新功能
- fix: 修复 bug
- docs: 文档更新
- style: 代码格式化
- refactor: 代码重构
- test: 添加测试
- chore: 构建过程或辅助工具的变动
示例
git commit -m "feat(auth): add user login functionality
- Add login form component
- Implement JWT authentication
- Add password validation
Closes #123"
11.2 分支命名规范
# 功能分支
feature/user-authentication
feature/payment-integration
# 修复分支
fix/login-bug
hotfix/critical-security-issue
# 发布分支
release/v1.2.0
# 实验分支
experiment/new-ui-framework
11.3 .gitignore 最佳实践
常见忽略模式
# 依赖目录
node_modules/
vendor/
# 构建输出
dist/
build/
*.min.js
# 日志文件
*.log
logs/
# 环境配置
.env
.env.local
# IDE 文件
.vscode/
.idea/
*.swp
# 操作系统文件
.DS_Store
Thumbs.db
# 临时文件
*.tmp
*.temp
11.4 安全最佳实践
保护敏感信息
# 使用环境变量
echo "API_KEY=your-secret-key" > .env
echo ".env" >> .gitignore
# 检查是否意外提交敏感信息
git log --all --full-history -- .env
使用 SSH 密钥
# 生成 SSH 密钥
ssh-keygen -t ed25519 -C "your.email@example.com"
# 添加到 SSH 代理
ssh-add ~/.ssh/id_ed25519
# 测试连接
ssh -T git@github.com
12. 图形化工具
12.1 命令行图形化工具
Git 内置工具
# 图形化查看历史
gitk
# 图形化添加文件
git gui
# 交互式添加
git add -i
第三方命令行工具
# tig - 文本界面的 Git 仓库浏览器
sudo apt install tig # Ubuntu
brew install tig # macOS
# lazygit - 简单的终端 UI
brew install lazygit
# gitui - Rust 编写的快速终端 UI
cargo install gitui
12.2 桌面应用程序
免费工具
- GitHub Desktop: 简单易用,适合初学者
- Sourcetree: 功能丰富,支持 Git Flow
- GitKraken: 美观的界面,强大的可视化
- Fork: macOS 和 Windows 上的优秀工具
IDE 集成
- VS Code: 内置 Git 支持 + GitLens 扩展
- IntelliJ IDEA: 强大的 Git 集成
- Sublime Merge: Sublime Text 团队开发
12.3 Web 界面
托管平台
- GitHub: 最流行的代码托管平台
- GitLab: 开源的 DevOps 平台
- Bitbucket: Atlassian 的代码托管服务
- Gitee: 国内的代码托管平台
自托管解决方案
- GitLab CE: 社区版 GitLab
- Gitea: 轻量级的 Git 服务
- Gogs: 简单的自托管 Git 服务
13. 学习路径建议
13.1 初学者路径 (1-2 周)
-
基础概念 (1-2 天)
- 理解版本控制的概念
- 学习 Git 的基本原理
- 安装和配置 Git
-
基本操作 (3-4 天)
- 初始化仓库
- 添加、提交文件
- 查看历史和状态
- 基本的撤销操作
-
分支基础 (2-3 天)
- 创建和切换分支
- 合并分支
- 解决简单冲突
-
远程仓库 (2-3 天)
- 克隆仓库
- 推送和拉取
- 基本的协作流程
13.2 进阶路径 (2-3 周)
-
高级分支操作
- 变基 (rebase)
- 交互式变基
- 复杂冲突解决
-
版本管理
- 标签管理
- 版本回退策略
- 历史修改
-
工作流程
- Git Flow
- GitHub Flow
- 团队协作最佳实践
-
高级功能
- Git Hooks
- Submodules
- Worktree
13.3 专家路径 (持续学习)
-
性能优化
- 大文件处理 (Git LFS)
- 仓库维护
- 性能调优
-
自动化
- CI/CD 集成
- 自动化测试
- 部署流程
-
高级配置
- 自定义 Git 命令
- 复杂的 Hook 脚本
- 服务器端配置
14. 常用命令速查表
14.1 基础命令
git init # 初始化仓库
git clone <url> # 克隆仓库
git status # 查看状态
git add <file> # 添加文件
git commit -m "message" # 提交更改
git log # 查看历史
git diff # 查看差异
14.2 分支命令
git branch # 查看分支
git branch <name> # 创建分支
git checkout <branch> # 切换分支
git checkout -b <branch> # 创建并切换分支
git merge <branch> # 合并分支
git branch -d <branch> # 删除分支
14.3 远程命令
git remote -v # 查看远程仓库
git fetch # 获取远程更新
git pull # 拉取并合并
git push # 推送更改
git push -u origin main # 设置上游分支
14.4 撤销命令
git checkout -- <file> # 撤销工作区修改
git reset HEAD <file> # 撤销暂存区修改
git reset --soft HEAD~1 # 软回退
git reset --hard HEAD~1 # 硬回退
git revert <commit> # 撤销提交
15. 总结
Git 是现代软件开发中不可或缺的工具。通过本指南,您应该能够:
掌握的技能
- 基础操作: 初始化、添加、提交、查看历史
- 分支管理: 创建、切换、合并、删除分支
- 远程协作: 克隆、推送、拉取、解决冲突
- 版本控制: 回退、标签、历史修改
- 工作流程: 选择适合的 Git 工作流
- 问题解决: 处理常见的 Git 问题
持续学习建议
- 实践为主: 在实际项目中使用 Git
- 阅读文档: 深入学习 Git 官方文档
- 参与开源: 通过开源项目学习协作
- 关注更新: 跟上 Git 的新功能和最佳实践
有用的资源
- 官方文档: https://git-scm.com/doc
- Pro Git 书籍: https://git-scm.com/book
- Git 教程: https://learngitbranching.js.org/
- GitHub 指南: https://guides.github.com/
记住,Git 的学习是一个渐进的过程。从基础开始,逐步掌握高级功能,在实践中不断提高。祝您学习愉快!🚀
更多推荐
所有评论(0)