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
枫渡札记