跳转到内容

Git 常用命令 Git 基本操作 快速上手

Git Commands Reference

Git 是目前最流行的分布式版本控制系统。无论你是初学者还是有经验的开发者,掌握 Git 常用命令都是必不可少的技能。本文将系统性地介绍 Git 的核心命令和操作技巧。

创建目录

在开始使用 Git 之前,我们需要先创建项目目录:

sh
mkdir "目录名称"
cd "目录名称"

常用目录操作命令:

bash
# 创建多级目录
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 - 初始化仓库

bash
# 在当前目录初始化 Git 仓库
git init

# 初始化并指定分支名称(推荐)
git init -b main

# 初始化裸仓库(用于服务器端)
git init --bare

注意事项:

  • 执行后会生成 .git 隐藏目录,包含所有版本控制信息
  • 只需执行一次,重复执行不会覆盖已有数据
  • 建议在项目根目录执行

2. git status - 查看状态

bash
# 查看简要状态
git status -s

# 查看详细状态
git status

# 查看忽略的文件
git status --ignored

输出解读:

  • Changes not staged for commit: 已修改但未添加到暂存区
  • Changes to be committed: 已添加到暂存区,准备提交
  • Untracked files: 未被 Git 追踪的新文件

3. git add - 添加文件到暂存区

bash
# 添加单个文件
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 - 提交变更

bash
# 基本提交
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: 修复 bug
  • docs: 文档变更
  • style: 代码格式(不影响功能)
  • refactor: 重构
  • test: 测试相关
  • chore: 构建过程或辅助工具的变动

示例:

bash
git commit -m "feat(auth): 添加 OAuth2 登录支持"
git commit -m "fix(api): 修复用户数据查询错误"
git commit -m "docs(readme): 更新安装说明"

5. git clone - 克隆仓库

bash
# 基本克隆
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 - 推送至远程

bash
# 推送到默认远程和分支
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 - 拉取远程变更

bash
# 基本拉取(等于 fetch + merge)
git pull

# 拉取特定分支
git pull origin main

# 使用 rebase 代替 merge(保持线性历史)
git pull --rebase

# 仅获取不合并
git fetch

# 查看所有远程分支
git fetch --all

pull vs fetch + merge:

bash
# 这两种方式等效
git pull origin main

# 等价于
git fetch origin main
git merge origin/main

推荐使用 rebase:

bash
# 配置全局使用 rebase
git config --global pull.rebase true

# 或在拉取时指定
git pull --rebase origin main

8. git reset - 重置状态

bash
# 软重置:保留工作区和暂存区,只移动 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 - 删除文件

bash
# 删除文件并从版本库中移除
git rm filename.txt

# 仅从版本库移除,保留工作区文件
git rm --cached filename.txt

# 递归删除目录
git rm -r folder/

# 强制删除(即使有修改)
git rm -f filename.txt

与普通删除的区别:

bash
# 普通删除(Git 会检测到文件缺失)
rm filename.txt
git status  # 显示 deleted: filename.txt

# Git 删除(同时从工作区和版本库移除)
git rm filename.txt
git status  # 显示 Changes to be committed: deleted: filename.txt

添加远程仓库

远程仓库是代码的集中存储地,方便团队协作和备份。

基本操作

bash
# 添加远程仓库
git remote add origin https://github.com/username/repository.git

# 提交到远程仓库(首次推送需设置上游分支)
git push -u origin master

# 或使用现代默认分支名
git push -u origin main

查看已配置的远程仓库

bash
# 查看远程仓库名称
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)

管理远程仓库

bash
# 移除远程仓库(只移除本地记录,不影响远程)
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

多远程仓库工作流

bash
# 常见于开源项目贡献
# 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 main

Git 分支操作

分支是 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

分支操作详解

查看分支

bash
# 查看本地分支
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

创建和切换分支

bash
# 方法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: 文档更新

合并分支

bash
# 切换到目标分支
git checkout main

# 合并 feature 分支
git merge feature/login

# 使用 squash 合并(将多次提交压缩为一次)
git merge --squash feature/login
git commit -m "feat: 添加登录功能"

# 中止合并(如果有冲突)
git merge --abort

# 继续合并(解决冲突后)
git merge --continue

合并策略:

  1. Fast-forward(快进合并)

    • 当目标分支没有新提交时
    • 只是简单地移动指针
  2. Three-way merge(三方合并)

    • 当两个分支都有新提交时
    • 创建一个新的合并提交
  3. Rebase(变基)

    bash
    # 将当前分支的提交「移动」到目标分支顶部
    git checkout feature/login
    git rebase main
    
    # 优点:保持线性历史
    # 缺点:改写历史,不适用于共享分支

处理合并冲突

bash
# 当合并出现冲突时
git status
# 显示:both modified: filename.txt

# 1. 打开文件,手动解决冲突
# 冲突标记:
# <<<<<<< HEAD
# 当前分支的内容
# =======
# 要合并分支的内容
# >>>>>>> feature/login

# 2. 编辑文件,保留需要的内容

# 3. 标记冲突已解决
git add filename.txt

# 4. 完成合并
git commit

删除分支

bash
# 删除本地分支(只能删除已合并的)
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 工作流

bash
# 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/payment

GitHub Flow(更简单)

bash
# 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 文件

bash
# 创建 .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
*.swo

Python 项目

# 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 不生效的解决方法

bash
# 问题:添加了规则但文件仍被追踪

# 原因:文件之前已被 Git 追踪

# 解决方案:
# 1. 从 Git 缓存中移除
git rm -r --cached .

# 2. 重新添加所有文件
git add .

# 3. 提交变更
git commit -m "chore: update .gitignore"

Git 标签

标签用于标记重要的历史节点,通常用于发布版本。

标签类型

  1. 轻量标签(Lightweight):类似于不变的分支
  2. 附注标签(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 标签名删除远程标签(简化版)

标签操作详解

创建标签

bash
# 创建轻量标签(当前提交)
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"

查看标签

bash
# 查看所有标签
git tag
# 输出:
# v0.1
# v0.2
# v1.0

# 按模式搜索标签
git tag -l "v1.*"
git tag -l "*beta*"

# 查看标签详情
git show v1.0

推送标签

bash
# 推送单个标签
git push origin v1.0

# 推送所有标签
git push origin --tags

# ⚠️ 注意:git push 不会自动推送标签,必须显式指定

删除标签

bash
# 删除本地标签
git tag -d v1.0

# 删除远程标签(方法1)
git push origin :refs/tags/v1.0

# 删除远程标签(方法2,更直观)
git push origin --delete tag v1.0

标签最佳实践

  1. 使用语义化版本号

    bash
    git 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"
  2. 始终使用附注标签

    bash
    # ✅ 推荐
    git tag -a v1.0 -m "Release notes here"
    
    # ❌ 不推荐
    git tag v1.0

实用技巧和快捷命令

Git 别名配置

bash
# 配置常用别名
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      # 漂亮的日志输出

查看历史

bash
# 查看提交历史
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

比较差异

bash
# 查看工作区和暂存区的差异
git diff

# 查看暂存区和最新提交的差异
git diff --staged

# 比较两个分支
git diff main..develop

# 比较两个提交
git diff abc1234 def5678

# 查看统计信息
git diff --stat

暂存工作进度

bash
# 暂存当前工作
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:提交错了分支

bash
# 解决方案:使用 cherry-pick
git checkout correct-branch
git cherry-pick abc1234  # 错误提交的 hash

# 从原分支删除错误提交
git checkout wrong-branch
git reset --hard HEAD~1

问题 2:想修改最后一次提交信息

bash
git commit --amend -m "新的提交信息"

问题 3:不小心删除了重要分支

bash
# 查看 reflog 找到分支之前的提交
git reflog

# 基于该提交重新创建分支
git branch recovered-branch abc1234

问题 4:合并后发现错误

bash
# 如果还没推送,可以回退
git reset --hard HEAD~1

# 如果已经推送,需要 revert
git revert -m 1 MERGE_COMMIT_HASH

总结

掌握 Git 常用命令是每个开发者的必修课。本文涵盖了:

  1. 基础操作:init、add、commit、status
  2. 远程仓库:clone、push、pull、remote
  3. 分支管理:branch、checkout、merge
  4. 标签使用:tag 的创建和管理
  5. 文件忽略:.gitignore 配置
  6. 实用技巧:别名、日志、差异比较

下一步学习建议:

记住:Git 是一个强大的工具,熟能生巧。多在实际项目中练习,你会越来越熟练!🎯