Git 常用命令 Git 基本操作 快速上手
Git 是目前最流行的分布式版本控制系统。无论你是初学者还是有经验的开发者,掌握 Git 常用命令都是必不可少的技能。本文将系统性地介绍 Git 的核心命令和操作技巧。
创建目录
在开始使用 Git 之前,我们需要先创建项目目录:
mkdir "目录名称"
cd "目录名称"常用目录操作命令:
# 创建多级目录
mkdir -p project/src/components
# 查看当前目录
pwd
# 列出目录内容
ls -la
# 切换目录
cd ../Git 常用命令
以下是 Git 最基础且最常用的命令,每个开发者都应该熟练掌握:
| 命令 | 说明 | 使用场景 |
|---|---|---|
git init | 初始化 Git 本地仓库 | 在新项目中首次启用版本控制 |
git status | 查看当前状态 | 随时检查工作区和暂存区的变化 |
git add [文件名] | 添加文件到缓存区 | 准备提交特定文件 |
git add . | 添加当前目录下的所有文件到缓存区中 | 准备提交所有变更 |
git commit -m "描述信息" | 提交至版本库(本地仓库) | 保存变更快照 |
git clone [线上仓库地址] | 克隆线上仓库到本地 | 获取远程项目的完整副本 |
git push | 推送到线上仓库 | 将本地提交同步到远程 |
git pull | 从线上仓库拉取到本地 | 获取远程的最新变更 |
git reset | 在缓存区的文件取消暂存 | 撤销 add 操作 |
git rm [文件名] | 删除文件 | 从工作区和版本库中移除文件 |
命令详细解析
1. git init - 初始化仓库
# 在当前目录初始化 Git 仓库
git init
# 初始化并指定分支名称(推荐)
git init -b main
# 初始化裸仓库(用于服务器端)
git init --bare注意事项:
- 执行后会生成
.git隐藏目录,包含所有版本控制信息 - 只需执行一次,重复执行不会覆盖已有数据
- 建议在项目根目录执行
2. git status - 查看状态
# 查看简要状态
git status -s
# 查看详细状态
git status
# 查看忽略的文件
git status --ignored输出解读:
- Changes not staged for commit: 已修改但未添加到暂存区
- Changes to be committed: 已添加到暂存区,准备提交
- Untracked files: 未被 Git 追踪的新文件
3. git add - 添加文件到暂存区
# 添加单个文件
git add README.md
# 添加多个文件
git add file1.txt file2.txt
# 添加整个目录
git add src/
# 添加所有变更(包括新增、修改、删除)
git add .
# 交互式添加(选择性添加)
git add -i
# 添加所有 .js 文件
git add *.js
# 添加已修改和删除的文件(不包括新文件)
git add -u
# 只添加新文件(不包括已修改的文件)
git add -N最佳实践:
- 避免使用
git add .提交所有文件,应该审视每个变更 - 相关变更应该分批提交,保持提交的原子性
- 使用
.gitignore排除不需要版本控制的文件
4. git commit - 提交变更
# 基本提交
git commit -m "feat: 添加用户登录功能"
# 详细描述(多行消息)
git commit -m "feat: 添加用户登录功能" -m "- 实现 JWT 认证\n- 添加登录页面\n- 集成后端 API"
# 修改最后一次提交
git commit --amend
# 跳过暂存区直接提交(不推荐)
git commit -a -m "quick fix"
# 空提交(用于触发 CI/CD)
git commit --allow-empty -m "trigger build"提交信息规范(Conventional Commits):
<type>(<scope>): <subject>
<body>
<footer>常用 type:
feat: 新功能fix: 修复 bugdocs: 文档变更style: 代码格式(不影响功能)refactor: 重构test: 测试相关chore: 构建过程或辅助工具的变动
示例:
git commit -m "feat(auth): 添加 OAuth2 登录支持"
git commit -m "fix(api): 修复用户数据查询错误"
git commit -m "docs(readme): 更新安装说明"5. git clone - 克隆仓库
# 基本克隆
git clone https://github.com/username/repo.git
# 克隆到指定目录
git clone https://github.com/username/repo.git my-project
# 克隆特定分支
git clone -b develop https://github.com/username/repo.git
# 浅克隆(只获取最近一次提交,速度快)
git clone --depth 1 https://github.com/username/repo.git
# 克隆子模块
git clone --recursive https://github.com/username/repo.git使用场景:
- 新成员加入项目时获取代码
- 在不同机器上同步工作
- 开源项目贡献代码
6. git push - 推送至远程
# 推送到默认远程和分支
git push
# 首次推送并设置上游分支
git push -u origin main
# 推送到特定分支
git push origin feature/login
# 强制推送(谨慎使用!)
git push --force
git push --force-with-lease # 更安全的强制推送
# 推送标签
git push origin --tags
# 推送所有分支
git push --all origin⚠️ 警告:
--force会覆盖远程历史,可能丢失他人的提交- 优先使用
--force-with-lease,它会在推送前检查远程是否有新提交 - 避免在共享分支上使用强制推送
7. git pull - 拉取远程变更
# 基本拉取(等于 fetch + merge)
git pull
# 拉取特定分支
git pull origin main
# 使用 rebase 代替 merge(保持线性历史)
git pull --rebase
# 仅获取不合并
git fetch
# 查看所有远程分支
git fetch --allpull vs fetch + merge:
# 这两种方式等效
git pull origin main
# 等价于
git fetch origin main
git merge origin/main推荐使用 rebase:
# 配置全局使用 rebase
git config --global pull.rebase true
# 或在拉取时指定
git pull --rebase origin main8. git reset - 重置状态
# 软重置:保留工作区和暂存区,只移动 HEAD
git reset --soft HEAD~1
# 混合重置(默认):保留工作区,清空暂存区
git reset HEAD~1
git reset --mixed HEAD~1
# 硬重置:清空工作区和暂存区(危险!)
git reset --hard HEAD~1
# 重置到特定提交
git reset --hard abc1234
# 重置特定文件
git reset HEAD filename.txt使用场景:
--soft: 重新组织多次提交为一次--mixed: 撤销 add,保留修改--hard: 完全放弃最近的提交和修改
9. git rm - 删除文件
# 删除文件并从版本库中移除
git rm filename.txt
# 仅从版本库移除,保留工作区文件
git rm --cached filename.txt
# 递归删除目录
git rm -r folder/
# 强制删除(即使有修改)
git rm -f filename.txt与普通删除的区别:
# 普通删除(Git 会检测到文件缺失)
rm filename.txt
git status # 显示 deleted: filename.txt
# Git 删除(同时从工作区和版本库移除)
git rm filename.txt
git status # 显示 Changes to be committed: deleted: filename.txt添加远程仓库
远程仓库是代码的集中存储地,方便团队协作和备份。
基本操作
# 添加远程仓库
git remote add origin https://github.com/username/repository.git
# 提交到远程仓库(首次推送需设置上游分支)
git push -u origin master
# 或使用现代默认分支名
git push -u origin main查看已配置的远程仓库
# 查看远程仓库名称
git remote
# 输出:origin
# 查看远程仓库详细信息
git remote show origin
# 查看远程仓库 URL
git remote -v
# 输出:
# origin https://github.com/username/repo.git (fetch)
# origin https://github.com/username/repo.git (push)管理远程仓库
# 移除远程仓库(只移除本地记录,不影响远程)
git remote remove origin
# 或
git remote rm origin
# 重命名远程仓库
git remote rename origin upstream
# 修改远程仓库 URL
git remote set-url origin https://new-url.com/repo.git
# 添加多个远程仓库
git remote add upstream https://github.com/original/repo.git多远程仓库工作流
# 常见于开源项目贡献
# origin: 你的 fork
# upstream: 原始项目
# 添加两个远程
git remote add origin https://github.com/yourname/repo.git
git remote add upstream https://github.com/original/repo.git
# 从 upstream 同步最新代码
git fetch upstream
git merge upstream/main
# 推送到你的 fork
git push origin mainGit 分支操作
分支是 Git 最强大的特性之一,允许并行开发不同功能而不互相干扰。
分支基本操作
| 命令 | 说明 | 备注 |
|---|---|---|
git branch | 查看本地分支 | 当前分支前有 * 号 |
git branch -r | 查看远程分支 | |
git branch -a | 查看本地和远程全部分支 | |
git branch 分支名 | 创建分支 | 不切换到新分支 |
git checkout 分支名 | 切换分支 | |
git push origin 分支名 | 推送分支到远程仓库 | |
git branch -d 分支名 | 删除分支 | 只能删除已合并的分支 |
git branch -D 分支名 | 强制删除分支 | 即使未合并也删除 |
git push origin -d 分支名称 | 删除远程分支 | |
git merge 被合并的分支名 | 合并分支 | 将指定分支合并到当前分支 |
git checkout -b 分支名 | 创建并切换到该分支 | 相当于 git branch + git checkout |
分支操作详解
查看分支
# 查看本地分支
git branch
# 输出:
# * main
# feature/login
# bugfix/header
# 查看远程分支
git branch -r
# 输出:
# origin/main
# origin/develop
# 查看所有分支
git branch -a
# 查看分支的最后提交信息
git branch -v
# 查看已合并到当前分支的分支
git branch --merged
# 查看未合并的分支
git branch --no-merged创建和切换分支
# 方法1:分两步
git branch feature/user-profile
git checkout feature/user-profile
# 方法2:一步完成(推荐)
git checkout -b feature/user-profile
# 方法3:使用 switch 命令(Git 2.23+)
git switch -c feature/user-profile
# 基于特定提交创建分支
git branch hotfix abc1234
# 基于远程分支创建本地分支
git checkout -b feature/login origin/feature/login分支命名规范:
feature/xxx: 新功能bugfix/xxx: Bug 修复hotfix/xxx: 紧急修复release/x.x: 发布分支docs/xxx: 文档更新
合并分支
# 切换到目标分支
git checkout main
# 合并 feature 分支
git merge feature/login
# 使用 squash 合并(将多次提交压缩为一次)
git merge --squash feature/login
git commit -m "feat: 添加登录功能"
# 中止合并(如果有冲突)
git merge --abort
# 继续合并(解决冲突后)
git merge --continue合并策略:
Fast-forward(快进合并)
- 当目标分支没有新提交时
- 只是简单地移动指针
Three-way merge(三方合并)
- 当两个分支都有新提交时
- 创建一个新的合并提交
Rebase(变基)
bash# 将当前分支的提交「移动」到目标分支顶部 git checkout feature/login git rebase main # 优点:保持线性历史 # 缺点:改写历史,不适用于共享分支
处理合并冲突
# 当合并出现冲突时
git status
# 显示:both modified: filename.txt
# 1. 打开文件,手动解决冲突
# 冲突标记:
# <<<<<<< HEAD
# 当前分支的内容
# =======
# 要合并分支的内容
# >>>>>>> feature/login
# 2. 编辑文件,保留需要的内容
# 3. 标记冲突已解决
git add filename.txt
# 4. 完成合并
git commit删除分支
# 删除本地分支(只能删除已合并的)
git branch -d feature/login
# 强制删除本地分支(即使未合并)
git branch -D feature/experiment
# 删除远程分支
git push origin --delete feature/login
# 或
git push origin -d feature/login
# 清理已删除的远程分支引用
git remote prune origin
# 删除所有已合并的本地分支(谨慎使用!)
git branch --merged main | grep -v "\* main" | xargs git branch -d分支工作流示例
Git Flow 工作流
# 1. 从 main 创建新功能分支
git checkout main
git pull origin main
git checkout -b feature/payment
# 2. 开发过程中定期提交
git add .
git commit -m "feat: 添加支付接口"
# 3. 同步 main 的最新变更
git fetch origin
git rebase origin/main
# 4. 推送到远程
git push -u origin feature/payment
# 5. 创建 Pull Request / Merge Request
# 6. 合并后删除分支
git checkout main
git pull origin main
git branch -d feature/payment
git push origin --delete feature/paymentGitHub Flow(更简单)
# 1. 从 main 创建分支
git checkout -b update-readme
# 2. 提交变更
git add .
git commit -m "docs: 更新 README"
# 3. 推送到远程
git push -u origin update-readme
# 4. 在 GitHub 上创建 PR
# 5. Code Review 通过后合并
# 6. 更新本地 main
git checkout main
git pull origin main忽略文件
.gitignore 文件用于指定哪些文件或目录不应被 Git 追踪。
创建 .gitignore 文件
# 创建 .gitignore 文件
touch .gitignore.gitignore 语法规则
# 这是注释
# 过滤整个文件夹
/mtk/
node_modules/
dist/
build/
# 过滤所有 .zip 文件
*.zip
*.tar.gz
*.exe
# 过滤某个具体文件
/mtk/do.c
config/local.json
# 不过滤某个文件(例外规则)
!important.log
!keep.txt
# 匹配任意层级目录
**/temp
**/*.log
# 匹配文件扩展名
*.pyc
*.class
*.o
# 忽略所有以 . 开头的文件(除了 .gitignore 本身)
.*
!.gitignore常见的 .gitignore 模板
Node.js 项目
# Dependencies
node_modules/
.pnp
.pnp.js
# Testing
coverage/
.nyc_output/
# Production
build/
dist/
.next/
out/
# Misc
.DS_Store
.env
.env.local
.env.*.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# IDE
.vscode/
.idea/
*.swp
*.swoPython 项目
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# Virtual environments
venv/
env/
.venv/
# Distribution / packaging
dist/
build/
*.egg-info/
# IDE
.vscode/
.idea/
.pytest_cache/
# Environment variables
.env
.env.local.gitignore 不生效的解决方法
# 问题:添加了规则但文件仍被追踪
# 原因:文件之前已被 Git 追踪
# 解决方案:
# 1. 从 Git 缓存中移除
git rm -r --cached .
# 2. 重新添加所有文件
git add .
# 3. 提交变更
git commit -m "chore: update .gitignore"Git 标签
标签用于标记重要的历史节点,通常用于发布版本。
标签类型
- 轻量标签(Lightweight):类似于不变的分支
- 附注标签(Annotated):包含完整信息的标签对象
标签操作
| 命令 | 说明 | 示例 |
|---|---|---|
git tag 标签名 | 创建轻量标签 | git tag v1.0 |
git tag -a 标签名 -m "描述" | 创建附注标签 | git tag -a v1.0 -m "Release version 1.0" |
git tag | 查看所有标签 | |
git tag -l "v1.*" | 查找匹配的标签 | |
git show 标签名 | 查看标签详情 | git show v1.0 |
git push origin 标签名 | 将标签推送到远程 | git push origin v1.0 |
git push origin --tags | 推送所有标签 | |
git tag -d 标签名 | 删除本地标签 | git tag -d v1.0 |
git push origin :refs/tags/标签名 | 删除远程标签 | |
git push origin --delete tag 标签名 | 删除远程标签(简化版) |
标签操作详解
创建标签
# 创建轻量标签(当前提交)
git tag v1.0
# 创建附注标签(推荐,包含更多信息)
git tag -a v1.0 -m "Release version 1.0"
# 在特定提交上创建标签
git tag -a v1.0 abc1234 -m "Version 1.0"
# 创建签名标签(需要 GPG 密钥)
git tag -s v1.0 -m "Signed release"查看标签
# 查看所有标签
git tag
# 输出:
# v0.1
# v0.2
# v1.0
# 按模式搜索标签
git tag -l "v1.*"
git tag -l "*beta*"
# 查看标签详情
git show v1.0推送标签
# 推送单个标签
git push origin v1.0
# 推送所有标签
git push origin --tags
# ⚠️ 注意:git push 不会自动推送标签,必须显式指定删除标签
# 删除本地标签
git tag -d v1.0
# 删除远程标签(方法1)
git push origin :refs/tags/v1.0
# 删除远程标签(方法2,更直观)
git push origin --delete tag v1.0标签最佳实践
使用语义化版本号
bashgit tag -a v1.0.0 -m "Major release" git tag -a v1.1.0 -m "Minor release with new features" git tag -a v1.1.1 -m "Patch release with bug fixes"始终使用附注标签
bash# ✅ 推荐 git tag -a v1.0 -m "Release notes here" # ❌ 不推荐 git tag v1.0
实用技巧和快捷命令
Git 别名配置
# 配置常用别名
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.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 使用别名
git st # 等同于 git status
git co main # 等同于 git checkout main
git lg # 漂亮的日志输出查看历史
# 查看提交历史
git log
# 简洁的日志
git log --oneline
# 图形化显示
git log --graph --oneline --all
# 查看特定文件的历史
git log --follow filename.txt
# 查看某作者的提交
git log --author="John Doe"
# 查看最近 n 次提交
git log -n 5比较差异
# 查看工作区和暂存区的差异
git diff
# 查看暂存区和最新提交的差异
git diff --staged
# 比较两个分支
git diff main..develop
# 比较两个提交
git diff abc1234 def5678
# 查看统计信息
git diff --stat暂存工作进度
# 暂存当前工作
git stash
# 暂存并包含未追踪的文件
git stash -u
# 查看暂存列表
git stash list
# 恢复最新的暂存
git stash pop
# 恢复特定的暂存
git stash apply stash@{1}
# 删除暂存
git stash drop stash@{0}
# 清空所有暂存
git stash clear常见问题排查
问题 1:提交错了分支
# 解决方案:使用 cherry-pick
git checkout correct-branch
git cherry-pick abc1234 # 错误提交的 hash
# 从原分支删除错误提交
git checkout wrong-branch
git reset --hard HEAD~1问题 2:想修改最后一次提交信息
git commit --amend -m "新的提交信息"问题 3:不小心删除了重要分支
# 查看 reflog 找到分支之前的提交
git reflog
# 基于该提交重新创建分支
git branch recovered-branch abc1234问题 4:合并后发现错误
# 如果还没推送,可以回退
git reset --hard HEAD~1
# 如果已经推送,需要 revert
git revert -m 1 MERGE_COMMIT_HASH总结
掌握 Git 常用命令是每个开发者的必修课。本文涵盖了:
- 基础操作:init、add、commit、status
- 远程仓库:clone、push、pull、remote
- 分支管理:branch、checkout、merge
- 标签使用:tag 的创建和管理
- 文件忽略:.gitignore 配置
- 实用技巧:别名、日志、差异比较
下一步学习建议:
记住:Git 是一个强大的工具,熟能生巧。多在实际项目中练习,你会越来越熟练!🎯