虽然平时Git用的很多,但得益于Git图形化工具(SourceTree、Github Desktop等)的完善且好用,我对Git命令并不熟练,所以整理一份笔记记录一下且方便以后查看。
1. Git命令总览表
类别 | 命令 | 功能描述 |
---|---|---|
仓库操作 | git init |
初始化新仓库 |
git clone |
克隆远程仓库 | |
文件操作 | git add |
添加文件到暂存区 |
git rm |
删除文件 | |
git mv |
移动/重命名文件 | |
提交操作 | git commit |
提交更改 |
git commit --amend |
修改最后一次提交 | |
分支操作 | git branch |
分支管理 |
git checkout |
切换分支/恢复文件 | |
git merge |
合并分支 | |
git rebase |
变基操作 | |
远程操作 | git remote |
远程仓库管理 |
git fetch |
获取远程更新 | |
git pull |
拉取并合并远程更新 | |
git push |
推送本地提交 | |
查看信息 | git status |
查看工作区状态 |
git log |
查看提交历史 | |
git diff |
查看差异 | |
撤销操作 | git reset |
重置提交 |
git revert |
撤销提交 | |
git restore |
恢复文件 | |
储藏操作 | git stash |
临时储藏修改 |
标签操作 | git tag |
标签管理 |
2. 详细命令解析
2.1 仓库操作命令
2.1.1 初始化新仓库 git init
功能:在当前目录初始化一个新的Git仓库
语法:
git init [仓库名] # 可选,指定目录名称
示例:
git init # 在当前目录初始化
git init my-repo # 创建my-repo目录并初始化
流程:
- 创建.git子目录
- 初始化仓库数据结构
- 设置默认主分支(master/main)
2.1.2 克隆远程仓库 git clone
功能:克隆远程仓库到本地
语法:
git clone <仓库URL> [目录名] # 目录名可选
选项:
--depth 1
:浅克隆(只获取最新版本)--branch <分支名>
:克隆指定分支--recursive
:递归克隆子模块
示例:
git clone https://github.com/user/repo.git
git clone -b dev https://github.com/user/repo.git myproject
2.2 文件操作命令
2.2.1 添加文件到暂存区 git add
功能:将文件添加到暂存区
语法:
git add <文件或目录>
常用形式:
git add . # 添加所有修改和新文件
git add -A # 添加所有修改(包括删除)
git add -u # 添加所有修改(不包括新文件)
git add *.js # 添加所有js文件
git add --patch <文件> # 交互式添加文件部分修改
2.2.2 删除文件 git rm
功能:从Git中删除文件
语法:
git rm <文件>
选项:
--cached
:仅从Git中删除,保留本地文件-f
:强制删除已修改的文件
示例:
git rm oldfile.txt # 删除文件
git rm --cached file.txt # 停止跟踪但保留文件
2.2.3 移动/重命名文件 git mv
功能:移动或重命名文件
语法:
git mv <源文件> <目标文件>
等效操作:
mv oldname newname
git rm oldname
git add newname
2.3 提交操作命令
2.3.1 提交更改 git commit
功能:提交暂存区的更改
语法:
git commit [-m "提交信息"]
常用选项:
-m
:直接指定提交信息-a
:自动暂存已跟踪文件的修改(跳过git add)--amend
:修改最后一次提交--no-verify
:跳过pre-commit钩子
示例:
git commit -m "修复登录bug"
git commit -am "更新文档" # 自动暂存已跟踪文件
2.3.2 修改最后一次提交 git commit --amend
功能:修改最后一次提交
用途:
- 修改提交信息
- 添加遗漏的文件
- 合并到上一次提交
示例:
git commit --amend -m "新的提交信息"
git add forgotten_file.js
git commit --amend --no-edit # 不修改提交信息
2.4 分支操作命令
2.4.1 分支管理 git branch
功能:分支管理
语法:
git branch [选项] [分支名]
常用选项:
-d
:删除分支(已合并)-D
:强制删除分支(未合并)-m
:重命名分支-a
:显示所有分支(包括远程)-v
:显示分支最后提交--merged
:显示已合并到当前分支的分支
示例:
git branch # 列出本地分支
git branch -a # 列出所有分支
git branch new-feature # 创建新分支
git branch -d old-feature # 删除分支
2.4.2 切换分支/恢复文件 git checkout
功能:切换分支或恢复文件
语法:
git checkout <分支名> # 切换分支
git checkout -b <新分支名> # 创建并切换分支
git checkout <文件> # 恢复文件
新版本替代:
git switch <分支名> # 切换分支
git switch -c <新分支名> # 创建并切换分支
git restore <文件> # 恢复文件
示例:
git checkout main # 切换到main分支
git checkout -b hotfix # 创建并切换到hotfix分支
git checkout HEAD~2 file.js # 恢复文件到前两次提交的版本
2.4.3 合并分支 git merge
功能:合并分支
语法:
git merge <分支名>
合并策略:
--ff
:快进合并(默认)--no-ff
:总是创建合并提交--squash
:压缩合并为一个提交
示例:
git checkout main
git merge dev # 合并dev分支到main
git merge --no-ff feature # 非快进合并
2.4.4 变基操作 git rebase
功能:变基,重写提交历史
语法:
git rebase <目标分支>
交互式变基:
git rebase -i <commit>
操作命令:
- pick:保留提交
- reword:修改提交信息
- edit:修改提交内容
- squash:合并到前一个提交
- fixup:类似squash但丢弃提交信息
- drop:删除提交
示例:
git checkout feature
git rebase main # 将feature变基到main
git rebase -i HEAD~3 # 交互式修改最近3个提交
2.5 远程操作命令
2.5.1 远程仓库管理 git remote
功能:管理远程仓库
语法:
git remote [-v] # 查看远程仓库
git remote add <名称> <URL> # 添加远程仓库
git remote rename <旧名> <新名> # 重命名
git remote remove <名称> # 删除
git remote show <名称> # 查看详情
示例:
git remote -v
git remote add upstream https://github.com/original/repo.git
git remote rename origin upstream
2.5.2 拉取远程 git fetch
功能:从远程获取最新内容但不合并
语法:
git fetch [远程名] [分支名]
示例:
git fetch origin # 获取origin的所有更新
git fetch origin main # 只获取origin的main分支
2.5.3 拉取并合并远程 git pull
功能:获取并合并远程更改
语法:
git pull [远程名] [分支名]
等效于:
git fetch
git merge FETCH_HEAD
选项:
--rebase
:使用变基而非合并
示例:
git pull origin main
git pull --rebase origin dev
2.5.4 推送本地 git push
功能:推送本地提交到远程
语法:
git push [远程名] [本地分支]:[远程分支]
常用选项:
-u
:设置上游分支--force
:强制推送(谨慎使用)--tags
:推送所有标签--delete
:删除远程分支
示例:
git push origin main # 推送main分支
git push -u origin feature # 推送并设置上游
git push origin --delete old-branch # 删除远程分支
2.6 查看信息命令
2.6.1 查看状态 git status
功能:查看工作区和暂存区状态
选项:
-s
:简洁输出-b
:显示分支信息
示例:
git status # 详细状态
git status -sb # 简洁格式带分支信息
2.6.2 查看历史 git log
功能:查看提交历史
常用选项:
--oneline
:单行显示--graph
:图形化显示--all
:显示所有分支-p
:显示差异-n
:显示最近n条记录--since/--until
:时间筛选--author
:按作者筛选--grep
:按提交信息搜索
示例:
git log -n 3 # 最近3条提交
git log --oneline --graph --all # 图形化显示
git log --since="2023-01-01" --until="2023-12-31"
2.6.3 查看差异 git diff
功能:查看差异
常用形式:
git diff # 工作区与暂存区差异
git diff --staged # 暂存区与最后一次提交差异
git diff HEAD # 工作区与最后一次提交差异
git diff branch1..branch2 # 两个分支差异
git diff commit1..commit2 # 两次提交差异
2.7 撤销操作命令
2.7.1 重置提交 git reset
功能:重置当前HEAD到指定状态
三种模式:
--soft
:只重置提交历史,保留工作区和暂存区--mixed
(默认):重置提交历史和暂存区,保留工作区--hard
:完全重置,丢弃所有修改
示例:
git reset HEAD~1 # 回退一个提交(保留修改)
git reset --hard HEAD~3 # 彻底回退三个提交
git reset <commit> -- <file> # 重置单个文件
2.7.2 撤销提交 git revert
功能:创建新的提交来撤销指定提交
与reset区别:不会重写历史,适合已推送的提交
示例:
git revert HEAD # 撤销最后一次提交
git revert <commit-hash> # 撤销特定提交
git revert -m 1 <merge-commit> # 撤销合并提交
2.7.3 恢复文件 git restore
功能:恢复工作区或暂存区文件
语法:
git restore [--source=<commit>] [--staged] [--worktree] <file>
示例:
git restore file.txt # 从暂存区恢复工作区文件
git restore --staged file.txt # 从HEAD恢复暂存区文件
git restore --source=HEAD~2 file.txt # 从特定提交恢复
2.8 储藏操作命令
2.8.1 临时储藏修改 git stash
功能:临时储藏工作区修改
常用命令:
git stash # 储藏当前修改
git stash push -m "消息" # 带消息储藏
git stash list # 查看储藏列表
git stash apply [stash@{n}] # 恢复储藏
git stash pop # 恢复并删除储藏
git stash drop [stash@{n}] # 删除储藏
git stash clear # 清除所有储藏
示例:
git stash push -m "WIP: login feature"
git stash apply stash@{1}
2.9 标签操作命令
2.9.1 标签管理 git tag
功能:管理标签(标记重要版本)
语法:
git tag # 列出标签
git tag <标签名> # 创建轻量标签
git tag -a <标签名> -m "消息" # 创建附注标签
git tag -d <标签名> # 删除标签
git show <标签名> # 查看标签详情
推送标签:
git push origin <标签名> # 推送单个标签
git push origin --tags # 推送所有标签
示例:
git tag v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0z
3. 高级操作介绍
3.1 变基操作
变基(Rebase)是 Git 中一个强大的历史重写工具,它可以将一系列提交移动到新的基础提交上。与合并(merge)不同,变基会重新应用提交,从而创建更线性的项目历史。
3.1.1 概念介绍
-
工作原理:
- 找到当前分支和目标分支的共同祖先
- 提取当前分支的差异(补丁)
- 将这些差异应用到目标分支的最新提交上
- 在目标分支上创建新的提交
-
与合并的区别:
特性 变基(Rebase) 合并(Merge) 历史记录 线性、整洁 保留实际开发过程 提交ID 会改变 保留原始提交 适用场景 本地分支整理 公共分支整合
3.1.2 典型用法
-
更新本地分支:
git checkout feature git rebase main
这将把 feature 分支的更改"移动"到 main 分支的最新提交之后
-
交互式变基:
git rebase -i HEAD~3
可以:
- 重新排序提交
- 合并提交(squash)
- 修改提交信息(reword)
- 编辑提交内容(edit)
- 删除提交(drop)
-
解决变基冲突:
当变基过程中出现冲突时:# 解决冲突后 git add <冲突文件> git rebase --continue # 或放弃变基 git rebase --abort
提示
- 黄金法则:不要对已经推送到远程仓库的提交进行变基
- 适用场景:
- 整理本地提交历史
- 在合并到主分支前更新特性分支
- 将多个小提交合并为更有意义的提交
- 风险提示:
- 变基会重写提交历史
- 可能导致协作问题(如果其他人基于你的旧提交工作)
3.2 Git钩子
Git钩子(Hooks)是在 Git 操作特定时间点自动运行的脚本,用于自定义和自动化 Git 工作流程。
3.2.1 核心概念
-
工作原理:
- 存储在
.git/hooks/
目录下的可执行文件 - 在特定 Git 事件发生时触发
- 可以阻止操作(通过非零退出码)
- 存储在
-
钩子类型:
钩子类型 触发时机 常见用途 pre-commit 提交前 代码风格检查、测试运行 commit-msg 提交信息编辑后 验证提交信息格式 post-commit 提交完成后 通知、日志记录 pre-push 推送到远程前 运行完整测试套件 pre-rebase 变基前 防止重要分支被变基 post-checkout 检出分支后 自动安装依赖 post-merge 合并完成后 重建项目文件
示例
-
pre-commit 示例:
#!/bin/sh # 检查是否有调试代码 if git diff --cached | grep "console.log"; then echo "错误:提交包含调试代码!" exit 1 fi
-
commit-msg 示例:
#!/bin/sh # 确保提交信息符合规范 if ! grep -qE "^[A-Z]+-[0-9]+: .{5,}" "$1"; then echo "提交信息格式错误!示例:JIRA-123: 描述性信息" exit 1 fi
-
安装钩子:
-
将脚本放入
.git/hooks/
目录 -
确保文件可执行:
chmod +x .git/hooks/pre-commit
-
3.2.2 高级技巧
-
共享钩子:
- 将钩子存储在项目目录中(如
scripts/hooks/
) - 使用符号链接或安装脚本复制到
.git/hooks/
- 将钩子存储在项目目录中(如
-
使用钩子框架:
- Husky:现代化的 Git 钩子管理
- pre-commit:多语言预提交框架
-
跨平台考虑:
- 使用 shell 脚本或 Node.js/Python 等跨平台语言
- 避免使用平台特定的命令
3.3 冲突处理
冲突处理是 Git 协作开发中的关键技能,当 Git 无法自动合并更改时,需要手动解决冲突。
常见冲突场景:
- 两个分支修改了同一文件的同一区域
- 一个分支删除文件而另一个分支修改了该文件
- 二进制文件冲突(如图片、文档)
3.3.1 冲突解决流程
-
识别冲突:
git merge feature-branch # 或 git rebase feature-branch
出现
CONFLICT
提示 -
查看冲突状态:
git status
显示未合并的路径
-
手动解决冲突:
- 使用编辑器打开冲突文件
- 决定保留哪些更改(或组合两者)
- 删除冲突标记(<<<<<<<, =======, >>>>>>>)
-
标记冲突已解决:
git add <冲突文件>
-
完成操作:
git commit # 合并冲突 # 或 git rebase --continue # 变基冲突
3.3.2 复杂冲突场景处理
-
大量文件冲突:
# 查看所有冲突文件 git diff --name-only --diff-filter=U
-
二进制文件冲突:
- 通常需要手动决定保留哪个版本
- 使用
git checkout --ours/theirs
选择版本
-
已提交的冲突解决:
git commit -m "Merge conflict resolution" git push
-
中止冲突解决:
git merge --abort git rebase --abort