Skip to content
章节导航

Git 常用命令

  • master:默认开发分支
  • origin:默认远程版本库
  • Head:默认开发分支
  • Head^:Head 的夫提交

仓库初始化与克隆

指令说明
git init在当前目录初始化一个新仓库
git clone <url>克隆远程仓库到本地
shell
# 案例1:新建项目并初始化
cd my-project
git init
# 输出:Initialized empty Git repository in /path/my-project/.git/

# 案例2:克隆远程仓库
git clone https://github.com/user/repo.git
# 输出:Cloning into 'repo'... done

# 案例3:克隆指定分支
git clone -b develop https://github.com/user/repo.git

查看与比较

指令说明
git status查看工作区和暂存区状态
git log查看提交历史
git log --oneline --graph单行+图形化显示历史
git diff查看工作区与暂存区的差异
git diff --staged查看暂存区与上次提交的差异
git show <commit>查看某次提交的详情
shell
# 案例1:查看当前状态
git status
# 输出:
# On branch main
# Changes not staged for commit:
#   modified:   README.md
# Untracked files:
#   index.js

# 案例2:查看简洁提交历史
git log --oneline --graph
# 输出:
# * a1b2c3d (HEAD -> main) fix: 修复登录bug
# * e4f5g6h feat: 添加用户模块

# 案例3:对比文件修改(工作区 vs 暂存区)
echo "new line" >> index.js
git diff index.js
# 输出:diff --git a/index.js b/index.js
# +new line

# 案例4:查看某次提交详情
git show a1b2c3d

基本操作(添加、提交、删除、移动)

指令说明
git add <file>将文件添加到暂存区
git add .添加所有改动
git commit -m "message"提交暂存区内容
git commit -am "message"跳过暂存区直接提交已跟踪文件
git rm <file>删除文件并暂存删除操作
git mv <old> <new>移动/重命名文件
shell
# 案例1:添加单个文件
git add README.md

# 案例2:添加所有改动
git add .
# 或 git add -A

# 案例3:提交并写注释
git commit -m "feat: 添加登录功能"
# 输出:[main a1b2c3d] feat: 添加登录功能
#  2 files changed, 10 insertions(+)

# 案例4:修改后直接提交(跳过 add)
echo "console.log('hello')" >> index.js
git commit -am "chore: 添加打印语句"

# 案例5:删除文件
git rm old.js
git commit -m "remove: 删除废弃文件"

# 案例6:重命名文件
git mv app.js main.js
git commit -m "refactor: 重命名app.js为main.js"

撤销与回退

指令说明
git reset <file>将文件移出暂存区
git reset --soft HEAD~1撤销提交,保留改动在暂存区
git reset --mixed HEAD~1撤销提交,保留改动在工作区(默认)
git reset --hard HEAD~1撤销提交,丢弃所有改动(⚠️危险)
git checkout -- <file>丢弃工作区文件的修改
git restore <file>Git 2.23+ 恢复工作区文件
git restore --staged <file>将文件移出暂存区
git revert <commit>用一次新提交撤销某次历史提交
shell
# 案例1:误 add,想移出暂存区
git add .
git status
# Changes to be committed: new.js
git reset new.js
# 或 git restore --staged new.js

# 案例2:放弃工作区修改(未 add)
echo "错误代码" >> index.js
git checkout -- index.js
# 或 git restore index.js

# 案例3:撤销最后一次提交,保留改动
git commit -m "错误提交"
git reset --soft HEAD~1
# 改动还在暂存区,可以重新提交

# 案例4:彻底回退到前2个版本(⚠️丢失改动)
git reset --hard HEAD~2
# 或回退到指定commit
git reset --hard a1b2c3d

# 案例5:安全撤销已推送的提交(推荐)
git revert a1b2c3d
# 产生一个新提交 "Revert ..."
git push origin main

分支管理

指令说明
git branch列出本地分支
git branch -a列出所有分支(含远程)
git branch <name>创建新分支
git branch -d <name>删除分支
git checkout -b <name>创建并切换到新分支
git switch -c <name>Git 2.23+ 创建并切换
git merge <branch>将指定分支合并到当前分支
git rebase <branch>将当前分支变基到目标分支
shell
# 案例1:创建并切换到新功能分支
git checkout -b feature/login
# 或 git switch -c feature/login

# 案例2:查看所有分支
git branch -a
# 输出:
#   main
# * feature/login
#   remotes/origin/main

# 案例3:合并分支(先切回main)
git checkout main
git merge feature/login
# 输出:Updating a1b2c3d..e4f5g6h
#  Fast-forward

# 案例4:删除已合并的分支
git branch -d feature/login

# 案例5:强制删除未合并的分支
git branch -D broken-branch

# 案例6:解决合并冲突
git merge feature/login
# 输出:Auto-merging index.js
# CONFLICT in index.js
# 手动编辑冲突文件后:
git add .
git commit -m "merge: 解决冲突"

# 案例7:变基操作
git checkout feature/login
git rebase main
# 将feature/login的提交移到main的最新提交之后

远程仓库

指令说明
git remote -v查看远程仓库地址
git remote add <name> <url>添加远程仓库
git fetch下载远程更新(不合并)
git pull拉取远程更新并合并
git push推送本地提交到远程
git push -u origin <branch>推送并建立上游跟踪
shell
# 案例1:添加远程仓库
git remote add origin https://github.com/user/repo.git

# 案例2:查看远程地址
git remote -v
# 输出:
# origin  https://github.com/user/repo.git (fetch)
# origin  https://github.com/user/repo.git (push)

# 案例3:推送本地分支到远程(首次)
git push -u origin main
# -u 建立跟踪,之后可以直接 git push

# 案例4:拉取远程更新
git pull origin main
# 等价于:git fetch origin + git merge origin/main

# 案例5:只下载不合并
git fetch origin
git diff origin/main  # 查看差异
git merge origin/main  # 手动合并

# 案例6:删除远程分支
git push origin --delete feature/login

# 案例7:推送标签到远程
git tag v1.0
git push origin v1.0
# 或推送所有标签
git push origin --tags

标签管理

指令说明
git tag列出所有标签
git tag <name>创建轻量标签
git tag -a <name> -m "msg"创建附注标签
git push origin <tag>推送单个标签
git tag -d <name>删除本地标签
shell
# 案例1:创建轻量标签
git tag v1.0.0

# 案例2:创建附注标签(推荐)
git tag -a v1.0.0 -m "正式发布版本"

# 案例3:查看标签详情
git show v1.0.0

# 案例4:给历史提交打标签
git tag -a v0.9.0 a1b2c3d -m "历史版本"

# 案例5:推送标签
git push origin v1.0.0

# 案例6:删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.0

暂存与清理

指令说明
git stash暂存当前未提交的改动
git stash pop恢复最近一次暂存并删除记录
git stash apply恢复暂存但保留记录
git stash list查看暂存列表
git clean -fd删除未跟踪的文件和目录
shell
# 案例1:临时切换分支,暂存当前改动
git stash save "WIP: 登录功能未完成"
# 输出:Saved working directory state

# 案例2:查看暂存列表
git stash list
# 输出:
# stash@{0}: On main: WIP: 登录功能未完成
# stash@{1}: On main: 测试数据

# 案例3:恢复暂存
git stash pop  # 恢复并删除记录
# 或
git stash apply stash@{1}  # 恢复指定记录

# 案例4:清理未跟踪的文件
git clean -fd
# 删除所有未跟踪的文件和目录

# 案例5:先预览再删除
git clean -fdn  # 预览会删除哪些文件
git clean -fd   # 确认后执行

常用别名配置(提升效率)

shell
# 配置别名
git config --global alias.st "status -sb"
git config --global alias.lg "log --oneline --graph --all"
git config --global alias.co "checkout"
git config --global alias.br "branch"
git config --global alias.ci "commit"
git config --global alias.unstage "reset HEAD --"
git config --global alias.last "log -1 HEAD"
git config --global alias.undo "reset --soft HEAD~1"

# 使用示例
git st          # 简洁状态
git lg          # 图形化日志
git co feature  # 切换分支
git ci -m "msg" # 提交
git last        # 查看最后一次提交

完整工作流案例

shell
# 场景:开发一个新功能
# 1. 拉取最新代码
git checkout main
git pull origin main

# 2. 创建功能分支
git checkout -b feature/payment

# 3. 开发过程中多次提交
git add .
git commit -m "feat: 添加支付接口"
git add .
git commit -m "test: 添加支付单元测试"

# 4. 开发完成,同步主分支
git checkout main
git pull origin main
git checkout feature/payment
git rebase main  # 或 git merge main

# 5. 合并到主分支
git checkout main
git merge feature/payment

# 6. 推送并打标签
git push origin main
git tag -a v2.0.0 -m "支付功能上线"
git push origin v2.0.0

# 7. 删除本地和远程功能分支
git branch -d feature/payment
git push origin --delete feature/payment

风行高山,渡此枫林;聊以寸笔,叙我寸心。