版本控制:git
git 核心概念
git 是分布式版本控制系统,由 Linus Torvalds 于 2005 年为 Linux 内核开发而创建。它是现代软件开发的基石工具。
三个区域
| 区域 | 作用 | 对应命令 |
|---|---|---|
| 工作区(Working Directory) | 实际编辑的文件 | 直接编辑 |
| 暂存区(Staging Area) | 准备提交的更改快照 | git add |
| 本地仓库(Repository) | 完整的版本历史 | git commit |
基础命令
仓库初始化与克隆
# 初始化新仓库
git init
# 克隆远程仓库
git clone https://github.com/user/repo.git
# 克隆到指定目录
git clone https://github.com/user/repo.git my-project
# 克隆指定分支
git clone -b branch-name https://github.com/user/repo.git
日常 workflow
# 查看工作区状态
git status
# 添加文件到暂存区
git add file.txt # 添加单个文件
git add . # 添加所有更改
git add -p # 交互式添加(选择部分更改)
# 提交更改
git commit -m "提交说明"
git commit -m "标题" -m "详细描述"
# 查看提交历史
git log
git log --oneline # 简洁显示
git log --graph --oneline # 图形化显示分支
git log -p # 显示每次提交的差异
git log --stat # 显示统计信息
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与最新提交的差异
git diff --staged
# 或
git diff --cached
分支管理
分支是 git 最强大的特性,允许并行开发而不互相干扰。
# 查看分支
git branch # 本地分支
git branch -a # 所有分支(含远程)
git branch -v # 显示分支最新提交
# 创建分支
git branch feature-x # 创建分支(不切换)
git checkout -b feature-x # 创建并切换分支
# 或
git switch -c feature-x # 新命令(Git 2.23+)
# 切换分支
git checkout main
git switch main # 新命令
# 合并分支
git checkout main
git merge feature-x
# 删除分支
git branch -d feature-x # 已合并的分支
git branch -D feature-x # 强制删除(未合并)
# 重命名分支
git branch -m old-name new-name
分支策略
远程操作
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
# 推送到远程
git push origin main # 推送到 origin 的 main 分支
git push -u origin main # 首次推送,设置上游分支
# 拉取远程更改
git pull origin main # 拉取并合并
git fetch origin # 只拉取,不合并
git merge origin/main # 合并拉取的更改
# 删除远程分支
git push origin --delete feature-x
撤销与回退
# 撤销工作区的修改(未 add)
git checkout -- file.txt # 丢弃工作区修改
# 撤销暂存区的修改(已 add 未 commit)
git reset HEAD file.txt # 从暂存区移除
# 修改最后一次提交
git commit --amend -m "新的提交说明"
# 回退到指定版本(保留修改)
git reset --soft HEAD~1 # 回退 1 次提交,修改保留在暂存区
# 回退到指定版本(保留修改但不暂存)
git reset --mixed HEAD~1 # 默认,修改保留在工作区
# 回退到指定版本(丢弃修改)
git reset --hard HEAD~1 # ⚠️ 危险,修改会丢失
# 查看所有操作历史(用于找回)
git reflog
# 回退到 reflog 中的某个状态
git reset --hard HEAD@{2}
撤销场景对照表
| 场景 | 命令 | 效果 |
|---|---|---|
| 改错了文件,未 add | git checkout -- file | 丢弃工作区修改 |
| add 错了文件,未 commit | git reset HEAD file | 从暂存区移除 |
| commit 说明写错了 | git commit --amend | 修改最后一次提交说明 |
| commit 错了,想保留修改 | git reset --soft HEAD~1 | 回退提交,修改保留在暂存区 |
| commit 错了,想重新开始 | git reset --hard HEAD~1 | ⚠️ 回退提交,修改全部丢弃 |
标签管理
# 创建标签
git tag v1.0.0 # 轻量标签
git tag -a v1.0.0 -m "版本 1.0.0" # 附注标签(推荐)
# 查看标签
git tag
git show v1.0.0
# 推送标签到远程
git push origin v1.0.0
git push origin --tags # 推送所有标签
# 删除本地标签
git tag -d v1.0.0
本篇小结
- git 三区域:工作区(编辑)→ 暂存区(
git add)→ 本地仓库(git commit)→ 远程仓库(git push) git status查看状态,git diff查看差异,git log --oneline查看历史git branch查看分支,git checkout -b创建并切换,git merge合并分支git push推送,git pull拉取并合并,git fetch只拉取不合并git checkout -- file丢弃工作区修改,git reset HEAD file移出暂存区git commit --amend修改最后一次提交,git reset --soft/mixed/hard回退提交git reflog查看所有操作历史,用于找回丢失的提交
动手实践
初始化仓库并提交:
mkdir git-demo && cd git-demo git init echo "Hello Git" > readme.txt git add readme.txt git commit -m "Initial commit" git log --oneline分支操作:
git checkout -b feature echo "New feature" >> readme.txt git add readme.txt git commit -m "Add feature" git checkout main git merge feature git branch -d feature撤销练习:
echo "mistake" > readme.txt git checkout -- readme.txt # 丢弃修改 cat readme.txt # 恢复为 "Hello Git" echo "test" > test.txt git add test.txt git reset HEAD test.txt # 移出暂存区 rm test.txt查看历史:
git log --oneline --graph --all git reflog标签练习:
git tag -a v1.0 -m "Release version 1.0" git tag git show v1.0思考:
git pull和git fetch + git merge有什么区别?在什么情况下git pull会产生冲突?如何解决冲突?