Git入门教程 - 从零开始学习Git版本控制
Git入门教程 - 从零开始学习Git版本控制
目录
1. Git简介
Git是一个分布式版本控制系统,由Linus Torvalds在2005年开发,用于管理Linux内核开发。Git可以跟踪文件的变化,记录历史版本,支持多人协作开发。
版本控制解决的问题:
- ✅ 历史记录:保存文件的历史版本,可以随时回退
- ✅ 协作开发:多人可以同时工作,自动合并代码
- ✅ 分支管理:可以创建分支进行功能开发,不影响主分支
- ✅ 冲突解决:自动检测冲突,帮助解决合并问题
- ✅ 代码备份:代码存储在仓库中,不会丢失
| 特性 | Git | SVN | CVS |
|---|---|---|---|
| 架构 | 分布式 | 集中式 | 集中式 |
| 速度 | 快 | 中等 | 慢 |
| 分支 | 强大 | 一般 | 弱 |
| 离线工作 | 支持 | 不支持 | 不支持 |
| 学习曲线 | 中等 | 简单 | 简单 |
- 分布式:每个开发者都有完整的代码仓库
- 速度快:大部分操作在本地完成
- 分支强大:创建和合并分支非常快速
- 数据完整性:使用SHA-1哈希确保数据完整性
- 免费开源:完全免费,开源软件
2. Git安装与配置
Windows系统
方式1:官方安装包(推荐)
- 访问Git官网:https://git-scm.com/download/win
- 下载最新版本的Git for Windows
- 运行安装程序,按照提示完成安装
- 安装完成后,在命令行输入
git --version验证
方式2:使用包管理器
# 使用Chocolatey
choco install git
# 使用Scoop
scoop install gitmacOS系统
方式1:使用Homebrew(推荐)
brew install git方式2:使用Xcode Command Line Tools
xcode-select --install方式3:官方安装包
访问 https://git-scm.com/download/mac 下载安装
Linux系统
Ubuntu/Debian:
sudo apt update
sudo apt install gitCentOS/RHEL:
sudo yum install git
# 或
sudo dnf install gitArch Linux:
sudo pacman -S git安装完成后,验证Git是否安装成功:
git --version
# 应该显示:git version 2.x.x配置用户信息
首次使用Git前,需要配置用户名和邮箱:
# 配置全局用户名
git config --global user.name "Your Name"
# 配置全局邮箱
git config --global user.email "your.email@example.com"
# 查看配置
git config --global --list配置编辑器
# 设置默认编辑器为VS Code
git config --global core.editor "code --wait"
# 设置默认编辑器为Vim
git config --global core.editor "vim"
# 设置默认编辑器为nano
git config --global core.editor "nano"其他常用配置
# 配置默认分支名(Git 2.28+)
git config --global init.defaultBranch main
# 配置自动换行符处理(Windows)
git config --global core.autocrlf true
# 配置自动换行符处理(Linux/macOS)
git config --global core.autocrlf input
# 配置颜色输出
git config --global color.ui auto
# 配置别名(简化命令)
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 --list
# 查看全局配置
git config --global --list
# 查看本地配置
git config --local --list
# 编辑配置文件
git config --global --edit生成SSH密钥
# 生成SSH密钥对
ssh-keygen -t ed25519 -C "your.email@example.com"
# 如果系统不支持ed25519,使用RSA
ssh-keygen -t rsa -b 4096 -C "your.email@example.com"按提示操作:
- 选择保存位置(默认:
~/.ssh/id_ed25519) - 设置密码(可选,建议设置)
添加SSH密钥到ssh-agent
# 启动ssh-agent
eval "$(ssh-agent -s)"
# 添加SSH密钥
ssh-add ~/.ssh/id_ed25519复制公钥
# macOS/Linux
cat ~/.ssh/id_ed25519.pub
# Windows (Git Bash)
cat ~/.ssh/id_ed25519.pub添加到GitHub/GitLab
- GitHub: Settings → SSH and GPG keys → New SSH key
- GitLab: Preferences → SSH Keys → Add SSH Key
粘贴公钥内容,保存。
测试SSH连接
# 测试GitHub连接
ssh -T git@github.com
# 测试GitLab连接
ssh -T git@gitlab.com3. Git基本概念
工作区(Working Directory)
当前正在编辑的文件所在的目录。
暂存区(Staging Area / Index)
准备提交的文件临时存放的区域。
仓库(Repository)
Git存储项目历史记录的地方,包含所有版本信息。
关系图:
工作区 → git add → 暂存区 → git commit → 仓库3.2 Git文件状态
Git中的文件有四种状态:
- 未跟踪(Untracked):新文件,Git尚未跟踪
- 已修改(Modified):文件已修改但未暂存
- 已暂存(Staged):文件已修改并添加到暂存区
- 已提交(Committed):文件已保存到仓库
状态转换:
未跟踪 → git add → 已暂存 → git commit → 已提交
↑ ↓
└────────────── git rm ──────────────┘提交是Git中保存项目快照的操作,每次提交都会:
- 保存当前暂存区的所有文件
- 记录提交者信息
- 生成唯一的提交ID(SHA-1哈希)
- 记录提交消息
分支是Git的核心概念,允许:
- 创建代码的独立开发线
- 在不影响主分支的情况下开发新功能
- 轻松切换和合并代码
HEAD是一个指向当前分支最新提交的指针,可以理解为"当前所在的位置"。
4. Git基础操作
创建新仓库
# 在现有目录中初始化Git仓库
cd my-project
git init
# 初始化并指定默认分支名
git init -b main克隆现有仓库
# 使用HTTPS克隆
git clone https://github.com/username/repository.git
# 使用SSH克隆
git clone git@github.com:username/repository.git
# 克隆到指定目录
git clone https://github.com/username/repository.git my-folder
# 克隆指定分支
git clone -b branch-name https://github.com/username/repository.git4.2 查看状态
git status
# 查看工作区状态
git status
# 简短格式
git status -s
git status --short输出示例:
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: file1.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
file2.txt
Changes staged for commit:
(use "git reset HEAD <file>..." to unstage)
modified: file3.txtgit add
# 添加单个文件
git add file.txt
# 添加多个文件
git add file1.txt file2.txt
# 添加所有修改的文件
git add .
# 添加所有文件(包括删除的)
git add -A
git add --all
# 交互式添加
git add -i
git add --interactive
# 添加补丁(部分添加)
git add -p
git add --patchgit commit
# 提交暂存区的更改
git commit -m "提交消息"
# 提交并添加所有修改的文件
git commit -am "提交消息"
# 修改最后一次提交
git commit --amend
# 修改最后一次提交的消息
git commit --amend -m "新的提交消息"
# 修改最后一次提交并添加文件
git add forgotten-file.txt
git commit --amend --no-edit提交消息规范
好的提交消息格式:
<类型>: <简短描述>
<详细说明(可选)>
<相关Issue(可选)>类型说明:
feat: 新功能fix: 修复bugdocs: 文档更新style: 代码格式调整refactor: 代码重构test: 测试相关chore: 构建过程或辅助工具变动
示例:
git commit -m "feat: 添加用户登录功能
- 实现用户名密码登录
- 添加记住密码功能
- 添加登录验证
Closes #123"git log
# 查看提交历史
git log
# 单行显示
git log --oneline
# 图形化显示
git log --graph --oneline --all
# 显示最近N条记录
git log -5
# 显示文件修改统计
git log --stat
# 显示文件具体改动
git log -p
# 搜索提交消息
git log --grep="关键词"
# 按作者搜索
git log --author="作者名"
# 按日期范围
git log --since="2024-01-01" --until="2024-12-31"
# 查看某个文件的提交历史
git log -- file.txtgit show
# 查看最新提交的详细信息
git show
# 查看指定提交
git show commit-hash
# 查看指定提交的某个文件
git show commit-hash:file.txt撤销工作区的修改
# 撤销单个文件的修改
git checkout -- file.txt
# Git 2.23+ 推荐使用
git restore file.txt
# 撤销所有修改
git checkout -- .
git restore .撤销暂存区的文件
# 从暂存区移除文件(保留工作区修改)
git reset HEAD file.txt
# Git 2.23+ 推荐使用
git restore --staged file.txt
# 移除所有暂存的文件
git reset HEAD .
git restore --staged .撤销提交
# 撤销最后一次提交(保留修改)
git reset --soft HEAD~1
# 撤销最后一次提交(保留工作区修改)
git reset --mixed HEAD~1
git reset HEAD~1
# 撤销最后一次提交(完全删除)
git reset --hard HEAD~1
# 撤销到指定提交
git reset --hard commit-hash⚠️ 警告: git reset --hard 会永久删除提交,谨慎使用!
git revert(推荐)
# 创建一个新提交来撤销指定提交
git revert HEAD
git revert commit-hash
# 撤销多个提交
git revert HEAD~3..HEADgit diff
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与仓库的差异
git diff --staged
git diff --cached
# 查看两个提交之间的差异
git diff commit1 commit2
# 查看某个文件的差异
git diff file.txt
# 查看两个分支的差异
git diff branch1 branch2
# 统计差异
git diff --stat# 删除文件并添加到暂存区
git rm file.txt
# 删除文件但保留在工作区
git rm --cached file.txt
# 删除目录
git rm -r directory/
# 强制删除
git rm -f file.txt4.9 移动/重命名文件
# 移动或重命名文件
git mv old-file.txt new-file.txt
# 等价于:
mv old-file.txt new-file.txt
git rm old-file.txt
git add new-file.txt5. Git分支管理
分支是Git的核心功能,允许:
- 创建独立的开发线
- 在不影响主分支的情况下开发
- 轻松合并代码
# 查看本地分支
git branch
# 查看所有分支(包括远程)
git branch -a
# 查看远程分支
git branch -r
# 查看分支详细信息
git branch -v
# 查看已合并的分支
git branch --merged
# 查看未合并的分支
git branch --no-merged# 创建新分支
git branch branch-name
# 创建并切换到新分支
git checkout -b branch-name
# Git 2.23+ 推荐使用
git switch -c branch-name
# 基于指定提交创建分支
git branch branch-name commit-hash
# 基于远程分支创建本地分支
git checkout -b local-branch origin/remote-branch# 切换到指定分支
git checkout branch-name
# Git 2.23+ 推荐使用
git switch branch-name
# 切换到上一个分支
git checkout -
git switch -基本合并
# 切换到目标分支(通常是main)
git checkout main
# 合并指定分支
git merge branch-name
# 合并时创建合并提交
git merge --no-ff branch-name
# 合并时只允许快进合并
git merge --ff-only branch-name解决合并冲突
冲突示例:
<<<<<<< HEAD
这是主分支的内容
=======
这是feature分支的内容
>>>>>>> feature-branch解决步骤:
- 打开冲突文件
- 手动解决冲突(保留需要的代码)
- 删除冲突标记(
<<<<<<<,=======,>>>>>>>) - 添加解决后的文件:
git add file.txt - 完成合并:
git commit
# 查看冲突文件
git status
# 使用工具解决冲突
git mergetool
# 手动解决后提交
git add .
git commit取消合并
# 合并前取消
git merge --abort
# 合并后撤销(如果还没推送)
git reset --hard HEAD~1# 删除已合并的分支
git branch -d branch-name
# 强制删除分支
git branch -D branch-name
# 删除远程分支
git push origin --delete branch-name
git push origin :branch-nameGit Flow(经典策略)
main (master) 生产环境
│
├── develop 开发环境
│ │
│ ├── feature/xxx 功能分支
│ ├── release/xxx 发布分支
│ └── hotfix/xxx 热修复分支GitHub Flow(简化策略)
main 主分支(生产环境)
│
├── feature/xxx 功能分支GitLab Flow(带环境分支)
production 生产环境
│
├── pre-production 预生产环境
│ │
│ └── main 主分支
│ │
│ └── feature/xxx 功能分支6. 远程仓库操作
# 添加远程仓库
git remote add origin https://github.com/username/repo.git
# 添加多个远程仓库
git remote add upstream https://github.com/original/repo.git
# 查看远程仓库
git remote
# 查看远程仓库详细信息
git remote -v
# 查看远程仓库URL
git remote get-url origin
# 修改远程仓库URL
git remote set-url origin https://github.com/new-username/repo.git
# 删除远程仓库
git remote remove origingit fetch
# 获取所有远程分支的更新
git fetch
# 获取指定远程仓库的更新
git fetch origin
# 获取指定分支的更新
git fetch origin main
# 获取所有远程仓库的更新
git fetch --allgit pull
# 拉取并合并远程分支
git pull
# 拉取指定远程分支
git pull origin main
# 拉取时使用rebase
git pull --rebase origin main
# 拉取所有远程分支
git pull --allgit fetch vs git pull:
git fetch: 只下载更新,不合并git pull: 下载并合并(相当于git fetch + git merge)
git push
# 推送到远程仓库
git push
# 推送到指定远程分支
git push origin main
# 推送所有分支
git push --all
# 推送标签
git push --tags
# 推送所有标签
git push origin --tags
# 强制推送(谨慎使用!)
git push --force
git push -f
# 安全强制推送(推荐)
git push --force-with-lease# 设置上游分支
git push -u origin branch-name
# 查看跟踪关系
git branch -vv
# 设置现有分支跟踪远程分支
git branch --set-upstream-to=origin/branch-name branch-name7. Git协作开发
适用于开源项目协作:
- Fork项目到自己的账户
- 克隆Fork的仓库
- 创建功能分支
- 提交更改
- 推送到Fork的仓库
- 创建Pull Request
# 1. Fork后克隆
git clone https://github.com/your-username/repo.git
# 2. 添加上游仓库
git remote add upstream https://github.com/original-owner/repo.git
# 3. 创建功能分支
git checkout -b feature-branch
# 4. 提交更改
git add .
git commit -m "feat: 添加新功能"
# 5. 推送到Fork的仓库
git push origin feature-branch
# 6. 在GitHub上创建Pull Request适用于团队协作:
# 1. 克隆共享仓库
git clone https://github.com/team/repo.git
# 2. 创建功能分支
git checkout -b feature-branch
# 3. 开发并提交
git add .
git commit -m "feat: 新功能"
# 4. 推送分支
git push origin feature-branch
# 5. 创建Pull Request进行代码审查- 创建分支并开发
git checkout -b feature/new-feature
# 开发代码
git add .
git commit -m "feat: 添加新功能"
git push origin feature/new-feature在GitHub/GitLab创建PR
- 访问仓库页面
- 点击"New Pull Request"或"Create Merge Request"
- 选择源分支和目标分支
- 填写PR描述
代码审查和修改
# 根据审查意见修改
git add .
git commit -m "fix: 根据审查意见修改"
git push origin feature/new-feature合并PR
- 审查通过后,合并PR
- 删除功能分支
更新本地仓库
git checkout main
git pull origin main
git branch -d feature/new-feature当多人修改同一文件时:
# 1. 拉取最新代码
git pull origin main
# 2. 如果有冲突,解决冲突
# 编辑冲突文件,删除冲突标记
# 3. 添加解决后的文件
git add .
# 4. 完成合并
git commit
# 5. 推送
git push origin feature-branch8. Git高级技巧
创建标签
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐)
git tag -a v1.0.0 -m "版本1.0.0发布"
# 在指定提交创建标签
git tag -a v1.0.0 commit-hash -m "版本1.0.0"
# 查看所有标签
git tag
# 查看标签信息
git show v1.0.0
# 删除标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.0
git push origin :refs/tags/v1.0.0
# 推送所有标签
git push origin --tags# 暂存当前更改
git stash
# 暂存并添加消息
git stash save "临时保存"
# 查看暂存列表
git stash list
# 应用最近的暂存
git stash apply
# 应用指定暂存
git stash apply stash@{0}
# 应用并删除暂存
git stash pop
# 删除暂存
git stash drop stash@{0}
# 清空所有暂存
git stash clear
# 暂存包括未跟踪的文件
git stash -u
git stash --include-untracked# 交互式rebase最近3个提交
git rebase -i HEAD~3
# 交互式rebase到指定提交
git rebase -i commit-hash
# 常用操作:
# pick: 使用提交
# reword: 修改提交消息
# edit: 修改提交
# squash: 合并到上一个提交
# fixup: 类似squash,但丢弃提交消息
# drop: 删除提交# 选择指定提交应用到当前分支
git cherry-pick commit-hash
# 选择多个提交
git cherry-pick commit1 commit2
# 选择提交范围
git cherry-pick commit1..commit2
# 只应用更改,不自动提交
git cherry-pick -n commit-hash
git cherry-pick --no-commit commit-hash# 添加子模块
git submodule add https://github.com/user/repo.git path/to/submodule
# 克隆包含子模块的仓库
git clone --recursive https://github.com/user/repo.git
# 或克隆后初始化子模块
git submodule init
git submodule update
# 更新子模块
git submodule update --remote
# 删除子模块
git submodule deinit -f path/to/submodule
git rm -f path/to/submodule# 搜索代码
git grep "关键词"
# 搜索指定文件类型
git grep "关键词" -- "*.java"
# 查看文件历史
git log --all --full-history -- file.txt
# 查找引入bug的提交
git bisect start
git bisect bad
git bisect good commit-hash
# Git会自动切换到中间提交,测试后标记good或bad
git bisect reset9. Git实际应用场景
# 1. 开始新的一天
git checkout main
git pull origin main
# 2. 创建功能分支
git checkout -b feature/new-feature
# 3. 开发代码
# ... 编写代码 ...
# 4. 提交更改
git add .
git commit -m "feat: 实现新功能"
# 5. 继续开发
git add .
git commit -m "fix: 修复bug"
# 6. 推送分支
git push origin feature/new-feature
# 7. 创建Pull Request
# 在GitHub/GitLab上操作
# 8. PR合并后,清理本地分支
git checkout main
git pull origin main
git branch -d feature/new-feature# 1. 从main创建hotfix分支
git checkout main
git pull origin main
git checkout -b hotfix/critical-bug
# 2. 修复bug
# ... 修复代码 ...
# 3. 提交并推送
git add .
git commit -m "fix: 紧急修复关键bug"
git push origin hotfix/critical-bug
# 4. 创建PR并快速合并
# 5. 合并到main和develop
git checkout main
git merge hotfix/critical-bug
git push origin main
git checkout develop
git merge hotfix/critical-bug
git push origin develop
# 6. 删除hotfix分支
git branch -d hotfix/critical-bug
git push origin --delete hotfix/critical-bug# 1. 根据审查意见修改
git checkout feature-branch
# 2. 修改代码
# ... 修改代码 ...
# 3. 提交修改
git add .
git commit -m "fix: 根据审查意见修改"
# 4. 如果需要修改之前的提交
git add .
git commit --amend
# 或
git rebase -i HEAD~3 # 修改最近3个提交
# 5. 强制推送(如果修改了历史)
git push --force-with-lease origin feature-branch# 1. 查看提交历史
git log --oneline
# 2. 回退到指定提交(保留工作区)
git reset --soft commit-hash
# 3. 回退到指定提交(保留工作区修改)
git reset --mixed commit-hash
# 4. 完全回退(危险!)
git reset --hard commit-hash
# 5. 如果已推送,需要强制推送
git push --force-with-lease origin branch-name10. 常见问题解决
# 方法1:修改最后一次提交
git add correct-file.txt
git commit --amend
# 方法2:从提交中移除文件
git reset HEAD~1
git add correct-file.txt
git commit -m "正确的提交"# 修改最后一次提交消息
git commit --amend -m "正确的提交消息"
# 如果已推送,需要强制推送
git push --force-with-lease# 添加到最后一次提交
git add forgotten-file.txt
git commit --amend --no-edit# 方法1:使用revert(推荐,安全)
git revert commit-hash
git push
# 方法2:使用reset(危险,需要团队协调)
git reset --hard commit-hash
git push --force-with-lease# 1. 查看冲突文件
git status
# 2. 打开冲突文件,手动解决
# 删除冲突标记,保留需要的代码
# 3. 标记冲突已解决
git add resolved-file.txt
# 4. 完成合并
git commit
# 5. 如果使用mergetool
git mergetool# 从Git恢复文件
git checkout HEAD -- file.txt
# Git 2.23+
git restore file.txt
# 恢复所有文件
git checkout HEAD -- .# 查看将被删除的文件
git clean -n
# 删除未跟踪的文件
git clean -f
# 删除未跟踪的文件和目录
git clean -fd
# 交互式删除
git clean -i11. Git最佳实践
好的提交消息:
- ✅ 使用现在时态:"添加功能"而不是"添加了功能"
- ✅ 第一行简短描述(50字符以内)
- ✅ 详细说明放在第二段
- ✅ 使用类型前缀:feat, fix, docs等
示例:
feat: 添加用户登录功能
实现了用户名密码登录,包括:
- 登录表单验证
- 记住密码功能
- 登录状态管理
Closes #123推荐命名:
feature/功能名称- 功能分支bugfix/问题描述- Bug修复分支hotfix/紧急修复- 紧急修复分支release/版本号- 发布分支refactor/重构内容- 重构分支
- 频繁提交:小步快跑,频繁提交
- 提交前测试:确保代码可以运行
- 及时推送:定期推送到远程仓库
- 保持同步:定期拉取远程更新
- 代码审查:重要更改必须经过审查
常见忽略文件:
# 编译输出
*.class
*.jar
*.war
*.ear
target/
build/
dist/
out/
# IDE文件
.idea/
.vscode/
*.iml
*.swp
*.swo
*~
# 操作系统文件
.DS_Store
Thumbs.db
desktop.ini
# 日志文件
*.log
logs/
# 依赖
node_modules/
venv/
env/
.venv
# 配置文件(包含敏感信息)
config.properties
.env
*.key
*.pem不要提交敏感信息
- 密码、密钥、Token
- 个人隐私信息
- API密钥
使用.gitignore
- 忽略敏感文件
- 忽略临时文件
审查提交内容
- 提交前检查
git diff - 使用
git log -p查看历史
- 提交前检查
保护主分支
- 使用分支保护规则
- 要求Pull Request审查
12. 总结与进阶
- ✅ 工作区、暂存区、仓库:理解Git的三层结构
- ✅ 提交、分支、合并:掌握基本操作流程
- ✅ 远程仓库、推送、拉取:学会协作开发
- ✅ 冲突解决:能够处理合并冲突
# 初始化
git init
git clone <url>
# 基本操作
git add <file>
git commit -m "message"
git status
git log
# 分支操作
git branch
git checkout <branch>
git merge <branch>
# 远程操作
git remote add <name> <url>
git push
git pull
git fetch
# 撤销操作
git reset
git revert
git restore
# 高级操作
git stash
git rebase
git cherry-pick
git tagGit内部原理
- 对象模型(blob, tree, commit)
- 引用和HEAD
- 索引(Index)机制
高级工作流
- Git Flow
- GitHub Flow
- GitLab Flow
工具和集成
- Git GUI工具(SourceTree, GitKraken)
- IDE集成(IntelliJ IDEA, VS Code)
- CI/CD集成
性能优化
- 大文件处理(Git LFS)
- 仓库优化
- 浅克隆
- 官方文档:https://git-scm.com/doc
- Pro Git书籍:https://git-scm.com/book
- GitHub Guides:https://guides.github.com
- 交互式教程:https://learngitbranching.js.org
- 多练习:在实际项目中多使用Git
- 理解原理:理解Git的工作原理,不只是记住命令
- 阅读文档:遇到问题先查官方文档
- 参与开源:通过开源项目练习Git协作
结语
Git是每个开发者必备的工具,掌握Git不仅能提高开发效率,还能更好地参与团队协作。通过本教程的学习,相信你已经掌握了Git的核心功能和使用方法。
记住:
- 多实践:理论结合实践,多写代码多提交
- 理解原理:理解Git的工作原理,不只是记住命令
- 遵循规范:遵循团队和社区的Git使用规范
- 持续学习:Git功能强大,持续学习新特性
祝你学习愉快,Git使用顺利! 🚀
本教程由Java突击队学习社区编写,如有问题欢迎反馈。