Git 常用的基础命令(速查表)
- 常用的基础命令
-
- [1. 配置信息:git config](#1. 配置信息:git config)
- [2. 把 Git 绑定到 Github/Gitee:ssh、ssh-keygen、ssh-add、mkdir](#2. 把 Git 绑定到 Github/Gitee:ssh、ssh-keygen、ssh-add、mkdir)
- [3. 把项目上传到 Github/Gitee 备份:pwd、cd、ls、dir、git init、git add、git commit、git remote、git push](#3. 把项目上传到 Github/Gitee 备份:pwd、cd、ls、dir、git init、git add、git commit、git remote、git push)
- [4. 添加忽略文件: .gitignore 文件 ,touch 、git rm](#4. 添加忽略文件: .gitignore 文件 ,touch 、git rm)
- [5. Git 基础操作:git help、git add、git commit、git diff、git mv、git log](#5. Git 基础操作:git help、git add、git commit、git diff、git mv、git log)
- [6. 版本回退、回退后的恢复:git reset、git reflog、git fsck、git show](#6. 版本回退、回退后的恢复:git reset、git reflog、git fsck、git show)
- [7. 撤销"已推送的提交"(保留提交历史): git revert](#7. 撤销“已推送的提交”(保留提交历史): git revert)
- [8. 取消暂存(丢弃暂存区的修改)⇒ 重置暂存区、保留工作区修改 :git reset 、git restore](#8. 取消暂存(丢弃暂存区的修改)⇒ 重置暂存区、保留工作区修改 :git reset 、git restore)
- [9. 恢复文件(丢弃工作区更改):重置工作区 为指定版本 → 从某个分支/ 提交/ 暂存区 恢复文件 到工作区(cat、git show、git diff、git stash、git checkout、git restore)](#9. 恢复文件(丢弃工作区更改):重置工作区 为指定版本 → 从某个分支/ 提交/ 暂存区 恢复文件 到工作区(cat、git show、git diff、git stash、git checkout、git restore))
- [10. 删除文件:手动删除 = rm <文件路径>、从 暂存区删除 git rm --cached <文件路径>](#10. 删除文件:手动删除 = rm <文件路径>、从 暂存区删除 git rm --cached <文件路径>)
- [11. 标签 tag:标记重要提交、常用于标记 "发布的版本号" → git tag](#11. 标签 tag:标记重要提交、常用于标记 “发布的版本号” → git tag)
- [12. 查找时 指定"搜索范围":grep (可用正则表达式 指定格式)](#12. 查找时 指定“搜索范围”:grep (可用正则表达式 指定格式))
- [13. 远程仓库:git remote](#13. 远程仓库:git remote)
- [14. 同步远程仓库的更新、并推送本地 Git 仓库: git fetch、git diff、git merge、git pull、git push](#14. 同步远程仓库的更新、并推送本地 Git 仓库: git fetch、git diff、git merge、git pull、git push)
- [15. Git 查看对象:git cat-file、git ls-files 、git count-objects、git rev-list 、git shortlog](#15. Git 查看对象:git cat-file、git ls-files 、git count-objects、git rev-list 、git shortlog)
- [16. Git 分支:git branch、git checkout、git switch、git merge](#16. Git 分支:git branch、git checkout、git switch、git merge)
- [17. 保存 分支"未提交的更改":git stash](#17. 保存 分支“未提交的更改”:git stash)
- [18. 应用 指定提交里的 "新更改": git cherry-pick](#18. 应用 指定提交里的 “新更改”: git cherry-pick)
- [19. 推送本地新分支到 远程仓库、克隆远程仓库、基于远程分支 创建对应的本地分支:git branch、git push、git clone、git checkout、git switch](#19. 推送本地新分支到 远程仓库、克隆远程仓库、基于远程分支 创建对应的本地分支:git branch、git push、git clone、git checkout、git switch)
- [20. 变基:以"指定目标分支的最新提交"为基点(祖先),重写分支的"提交历史" :git rebase(只对"未推送的本地提交"使用变基)](#20. 变基:以“指定目标分支的最新提交”为基点(祖先),重写分支的“提交历史” :git rebase(只对“未推送的本地提交”使用变基))
- [♣ 结束语 和 友情链接](#♣ 结束语 和 友情链接)
- 快速搜索 :涉及知识点比较多,看过之后忘了很正常,想查询时,请按
Ctrl+F快速搜索关键字哦 (* ̄︶ ̄)。- 搜索后,多次按下 enter 键 或 点击搜索框后的 上下箭头,就能在关键词之间快速跳转。
常用的基础命令
1. 配置信息:git config
| 用途 | 命令 |
|---|---|
| 查看 所有配置信息(=配置信息列表) | git config --list |
| 查看 配置信息列表(显示 所在的配置文件) | git config --list --show-origin |
| 查看 指定项的配置信息 | git config 配置项名字 |
| 设置 指定项的配置信息 | git config <选项> <配置项名字> "配置项的值" 选项 : ❶ --system 系统级:所有用户、所有仓库 生效。 ❷ --global 全局配置:对当前用户的所有仓库生效。 ❸ --local 仓库级:对当前仓库 生效。 例 : 配置 当前用户 的 用户名、邮箱: git config --global user.name "自己的用户名" git config --global user.email "自己的邮箱" |
| 查看 Git Bash 的本地语言设置 | locale |
| 关闭 路径名的中文转义 (无法正常显示中文时) | git config --global core.quotepath false |
把默认编辑器 配置为 Git Bash 自带的 vim 编辑器 注 :先配置为自己的常用编辑器,如果无法正常打开文件时, 可配置为自带的 vim 编辑器,常用于 编辑提交说明信息。 |
git config --global core.editor "vim" |
| 配置 命令的别名(简写) (熟悉各类命令后,可配置简写、使用简写) | git config --global alias.简化名 原命令; git config --global alias.简化名 '带空格的原命令'; 注 :原命令是 组合命令,带空格时,用单引号 或 双引号括起来。 例 : git config --global alias.st status。 例 : git config --global alias.unstage 'reset HEAD' 例 : git config --global alias.lgog "log --oneline --graph" |
2. 把 Git 绑定到 Github/Gitee:ssh、ssh-keygen、ssh-add、mkdir
| 用途 | 命令 |
|---|---|
检查本地是否安装了 SSH (一般系统会自带) |
ssh、ssh -V(大写V,显示版本信息) ![]() |
生成 密钥 SSH key |
❶ 不带注释: ssh-keygen -t rsa ssh-keygen:SSH 密钥生成工具 。 -t rsa:指定密钥类型为 RSA 算法。 ❷ 指定邮箱为"注释": ssh-keygen -t rsa -C "自己的邮箱"。 -C: 注释。用于 识别密钥的"用途或所有者" ,不影响密钥本身的安全性。 |
创建 .ssh 文件夹,确保 SSH 配置目录存在 |
mkdir -p "/c/Users/张三/.ssh" mkdir (make directory):"创建目录"。 -p: parents ,父目录。 自动创建不存在的父目录,如果目录已存在,也不会报错,能正常执行。 |
| 生成密钥 + 手动指定 密钥文件保存路径 (路径里有中文被转义时使用) | ssh-keygen -t rsa -f "/c/Users/张三/.ssh/id_rsa" -C "your_email@example.com" -f (filename):指定输出密钥文件的 路径和名称 。 如果不使用 -f 参数,ssh-keygen 会使用默认位置和名称。 |
| 验证 是否和 Github 关联成功了 | ssh -T git@github.com -T= Terminal(终端) 可确保不会分配终端 ,只要最简单的命令执行 通道。 Git 服务只需要验证密钥 ,不需要给我们一个 shell 终端。 成功时会显示欢迎信息,但不会获得 shell 访问权限。 |
验证 是否和 Github 关联成功了 + 直接强制指定 known_hosts 文件的存放路径 (路径里有中文被转义时使用) |
ssh -T git@github.com -o "UserKnownHostsFile=/c/Users/自己的用户名/.ssh/known_hosts" |
查看 ssh-agent 中是否有私钥 (列出当前 SSH 代理中已加载的私钥) |
ssh-add -l |
启动 ssh-agent 并设置环境变量 |
eval "$(ssh-agent -s)" |
把私钥添加到 ssh-agent |
ssh-add "/c/Users/计算机用户名/.ssh/id_rsa" |
| 显示当前所在的目录(文件夹)的完整路径 | pwd pwd = 打印工作目录( Print Working Directory)。 |
3. 把项目上传到 Github/Gitee 备份:pwd、cd、ls、dir、git init、git add、git commit、git remote、git push
| 用途 | 命令 |
|---|---|
| 查看 当前目录 | pwd,确定当前的位置。 |
| 切换 当前工作目录 cd = Change Directory。 (更改目录/切换目录) | 进入 指定文件夹: cd 文件夹路径,如 cd /f/Git-test; 返回 上一级目录 :cd .. ; ![]() |
| 初始化一个 Git 仓库 (在项目"根目录"执行 ) | git init |
| 添加文件到暂存区 | git add |
| 暂存文件 常用的两种方式 | ❶ 暂存所有文件: git add . ❷ 暂存指定文件:git add <文件路径>。 |
| 查看 仓库当前状态 | git status |
| 把暂存区内容 提交到"本地 Git 仓库" | git commit -m "提交说明" |
| 添加(关联) "远程仓库" | git remote add <远程仓库别名/可自定义> <github上的 Git 仓库地址> |
| 查看 远程仓库的信息 | git remote -v |
| 推送本地分支 到远程仓库 | ❶ 切换到要推送的本地分支上(默认推送到到远程同名分支) :git push <远程仓库别名> <本地分支名>。 ❷ 推送到远程,并建立跟踪关系(-u 参数) :git push -u <远程仓库别名> <本地分支名>。 -u 或 --set-upstream:建立本地分支与远程仓库分支 的跟踪关系 。 如果第一次推送加 -u,之后可以在分支上直接 git push ,不用指定远程仓库。 例 : git push -u origin main、git push origin main ❸ 在其他分支上,指定推送的本地分支和远程分支 :git push <远程仓库别名> <本地分支>:<远程分支>。 |
| 查看 "提交的历史记录" | git log 简洁的提交历史记录 :git log --oneline 带上一行--oneline 选项。 |
| 查看 当前目录里的文件列表 | ls、dir |
4. 添加忽略文件: .gitignore 文件 ,touch 、git rm
| 用途 | 命令 |
|---|---|
| 创建 一个空文件(文件不存在时) 如果文件已存在:更新文件的访问和修改时间。 | touch <文件名(可带扩展名)> |
如果当前根目录下没有.gitignore 文件, 则在当前目录下 创建一个名为 .gitignore 的空文件。 创建后,手动修改文件内容,添加需要被忽略的文件。 |
touch .ignore |
| 查看 仓库当前状态 | git status |
| 查看仓库状态 和 忽略文件 | git status --ignored |
| 从 Git 暂存区中移除 。 ⇒ 停止跟踪文件,但保留在本地工作区。 | git rm -r --cached <文件路径> 例 : 将.idea从 Git 的暂存区/索引中 删除,但保留本地工作区文件。: git rm -r --cached .idea 。 ⚠️ 高危 :命令中缺少--cached参数会导致本地文件也被删除 ,一定要加上。 -r :递归 标志,表示如果 .idea 是一个目录,会递归删除"目录下的所有内容"。 |
5. Git 基础操作:git help、git add、git commit、git diff、git mv、git log
| 用途 | 命令 |
|---|---|
| 需要 某个命令的一个快速参考表(常用) | git 命令 -h ,如 git add -h, -h :就是 help的缩写。 |
| 查看 当前仓库状态 | git status |
| 暂存文件 常用的两种方式 | ❶ 暂存所有文件: git add . ❷ 暂存指定文件:git add <文件路径>。 |
| 查看 暂存区的文件列表 | git ls-files --stage ; ls-files:列出文件(list files),显示当前暂存区中所有文件的信息。 |
| 查看 A、B 的差异 | git diff A B 比较的是 从 A 到 B 的变化 ,即 "在 A 的基础上,需要做什么更改才能得到 B "。 输出信息 : 绿色字 :B 中新更改的内容 。 红色字 :B 中没有的内容 。 ❶ 查看 暂存区内容、工作区内容的差异 : git diff (默认:对比暂存区和工作区)。 ❷ 查看 指定文件的内容 在工作区、暂存区的区别 : git diff <文件路径> (丢弃工作区更改前,查看工作区的更改) ❸ 查看暂存区内容 与最新提交的区别 : git diff --staged = git diff --staged HEAD = git diff --cached HEAD。 --staged 、--cached 同一个意思。 ❹ 查看 指定两个提交的差异 :git diff <提交哈希值1> <提交哈希值2> ❺ 查看 当前提交与上一个提交的差异 : git diff HEAD~1 HEAD |
| 提交 暂存区所有文件 | git commit -m "提交说明" |
| 绕过暂存区、提交指定文件 | git commit <文件路径> -m "提交说明" |
| 用新提交 修订(替换) 旧提交 注 :只能修改本地提交,已推送的公共提交 不要这样随意修改, 会丢失公共提交历史,影响他人。 | git commit --amend -m "提交说明"。 |
| 已跟踪文件 重命名 | git mv <旧名文件的路径> <新名文件的路径>; 例 : git mv oldfile.txt newfile.txt 只需要一个命令,就等效于三个命令 的组合: 重命名 mv oldfile.txt newfile.txt + 删原名索引 git rm oldfile.txt + 添加新名文件到暂存区 git add newfile.txt。 |
| 已跟踪文件 移动到新位置 (把文件移动到新文件夹) | git mv <文件的路径> <新文件夹的路径/>; 注 :文件夹名后面的 / 千万不能漏掉 !否则就不是移动到文件夹,而是重命名了。 |
| 查看 提交历史 | ❶ 完整提交历史 : git log(详情版:有提交的id、说明、作者、邮箱、时间); ❷ 一行的 简洁版提交历史 :git log --oneline (简洁版:提交 id 、提交说明); 带指定数目 git log --oneline -n(n 是数目),最近 n 条提交历史 。 ❸ 显示 每次提交 的更改内容 (按 补丁 的格式输出): git log -p -n = git log --patch -n (n是数目),最近 n 条提交历史 。 ❹ 查看 每次提交的简略统计信息 :git log --stat。 ❺ 图形化显示提交历史 :git log --graph、git log --graph --oneline。 ❻ 查看 合并提交的历史 : git log --oneline --merges ❼ 查看 远程仓库 指定分支的最新提交历史(获取fetch新数据后) : git log <远程仓库名>/<远程分支名> --oneline ; 例 : git log github/main --oneline ; ❽ 查看 指定文件的提交历史 : git log --oneline <文件路径> 例 : git log --oneline README.md |
6. 版本回退、回退后的恢复:git reset、git reflog、git fsck、git show
| 用途 | 命令 |
|---|---|
| 查看 仓库的当前状态 | git status |
| 查看 提交的历史记录、HEAD 指向 | git log --oneline(简洁版:提交 id 、提交说明); git log(详情版:有提交的id、说明、作者、邮箱、时间)。 |
| 把文件添加到"暂存区" | 添加指定文件:git add <文件路径> ; 添加全部文件:git add . |
| 提交文件 | 把暂存区文件全部提交: git commit -m "提交说明"; 绕过暂存区,直接 指定提交文件 (不提交暂存区其他文件): git commit <文件路径> - m "提交说明"。 |
| 移动 HEAD 指针,保留暂存区、工作区 。 撤销提交,但暂存区不变、工作区不变。 最后一次提交内容 : 暂存区 待提交。 使用场景:撤销提交,所有修改放入暂存区,重新提交。 | 例 : git reset --soft HEAD^ 例 : 提交 id 替代 HEAD,回退到"指定提交" : git reset --soft commit_id 。 |
| 移动 HEAD 指针,重置暂存区,保留工作区更改 。 重置 :文件内容 = 和指定提交中的文件内容一模一样。 重置暂存区:暂存区被重置到指定提交的状态 , ⇒ 暂存区文件内容 = 和 指定提交中 一样 。 相当于 间接丢弃了暂存区的新修改内容,但不影响工作区的修改。 使用场景:默认模式,暂存区改变为指定状态,工作区内容不变。 | 例 : git reset --mixed HEAD^ = git reset HEAD~1 (--mixed 可省略,git reset默认模式) 取消暂存的特定文件 : 例 : git reset HEAD file.txt = git reset file.txt (默认是 --mixed HEAD)。 |
移动 HEAD 指针,重置"暂存区、工作区的修改" 。 重置 :文件内容 = 和指定提交中的文件内容一模一样。 暂存区、工作区的文件内容 都要和指定提交里保存的一模一样。 不一样的呢?直接删除。 ⚠️ 已跟踪文件的 暂存区的修改、工作区里的修改 都会被清除。 使用场景 :彻底回退 ,直接从本地删除所有修改 (包括:未提交的暂存内容 )。 --hard 会永久删除"未提交的更改",无法恢复 (除非有 stash储藏过); ⚠️ 对已推送到远程仓库的提交 使用 reset 后, 会改变"公共提交历史" , 需要强制推送 (git push -f) 覆盖远程仓库, 这会影响其他协作者,应该避免。 个人项目则无所谓,随自己心意。 |
git reset --hard HEAD^ |
查看 所有操作的历史记录 (HEAD 指针的移动记录) |
git reflog 恢复到 reset 之前的状态:git reset --hard HEAD@{n} HEAD@{n}:重置操作之前的那个提交,找到想恢复的提交。 |
| 查找"孤立对象"并保存 | git fsck --lost-found。 fsck = 文件系统检查,File System Check。 --lost-found :将被孤立(dangling美/ˈdæŋɡlɪŋ/,悬挂,悬空的)的对象(提交、blob、tree)保存到 .git/lost-found 目录。 |
| 查看 孤立提交的详细信息 | git show <提交哈希值> |
| 查看 blob 对象里是什么文件内容 | git show <blob 哈希值> |
| 查看 blob 文件内容时 手动保存到指定文件中 (新文件,会新建一个文件 ) | git show blob哈希值 > 文件名(带扩展名) > :保存到指定文件。 |
7. 撤销"已推送的提交"(保留提交历史): git revert
| 用途 | 命令 |
|---|---|
| 撤销 指定提交的更改 (同时保留历史记录,生成一个新的"反向提交") | git revert <提交哈希值> |
| 撤销 最近一次提交的更改 | git revert HEAD HEAD: 当前分支指向的提交。 |
| 撤销 多个提交的更改(按范围) | ❶ git revert <commit1>..<commit2> 左开右闭,左边的开始提交 不包含在内 ,如果要包含左边的在内,使用 ^..(开始位置)。 例 : 撤销从提交 A 到提交 D 之间的所有提交(不包括 A,包括 D): git revert A-hash..D-hash |
| 撤销 多个指定提交 | git revert <提交哈希值1> <提交哈希值2> <提交哈希值3>。 |
| 撤销 指定提交 但不自动提交(可修改信息) | git revert -n <提交哈希值> -n = --no-commit,不自动提交。 |
| 查看 合并提交历史 | git log --oneline --merges |
| 撤销 合并提交 | git revert -m <父分支数字> <合并提交哈希值> 指定保留的父分支 :-m= --mainline。 ❶ -m 1 :保留主分支的更改 (第一个父分支)= 被合并到的分支 ,如 main ,撤销另一个分支的更改; ❷ -m 2 :保留第二个父分支 = 被合并的分支 ,如 dev。 |
继续之前中断的 revert (有冲突时,解决冲突后) |
git revert --continue |
取消 revert 操作,回到开始前的状态 |
git revert --abort |
| 跳过当前提交(不撤销它) 并继续 | git revert --skip |
8. 取消暂存(丢弃暂存区的修改)⇒ 重置暂存区、保留工作区修改 :git reset 、git restore
| 用途 | 命令 |
|---|---|
| 重置暂存区,保留工作区的内容 重置暂存区 = 取消暂存 = 暂存区里不一样的更改 被丢弃 注 : ❶ 重置暂存区 :暂存区内容 = 指定提交的内容。 ❷ 保留工作区:工作区的内容不变。 | ✔️ git reset <文件路径> = git reset HEAD <文件路径> = git reset --mixed HEAD <文件路径> git reset 默认是 --mixed HEAD,可省略。 |
| 重置暂存区的更改(到当前提交),保留工作区更改 | ✔️ git restore -S <文件路径> = git restore --staged <文件路径> 注 :git restore --staged <file> = 替代 git reset HEAD <file> --staged:操作暂存区。 --worktree:操作工作区。 --source:指定恢复的源(默认为 HEAD,指向 最新提交) 重置暂存区、工作区 两个区域的更改 都被丢弃: git restore --staged --worktree <file> = git reset --hard <文件路径> 恢复文件到某个提交的版本 : git restore --source=<提交哈希值> <文件路径> 例 : git restore --source=ac1b23e README.md |
9. 恢复文件(丢弃工作区更改):重置工作区 为指定版本 → 从某个分支/ 提交/ 暂存区 恢复文件 到工作区(cat、git show、git diff、git stash、git checkout、git restore)
| 用途 | 命令 |
|---|---|
| 查看文件内容 | cat <文件路径> ![]() |
| 查看 提交历史记录 | git log --oneline (一行版;提交哈希值、提交说明) ![]() |
| 查看 指定提交的 指定文件内容 | git show <提交哈希值>:<文件路径> ![]() |
查看 某次提交的详细信息(差异) 查看 单个对象详情 ,显示完整信息和差异 : git show = git log 的详细提交信息 + git diff 的变更内容。 |
git show <提交哈希值> ![]() |
| 查看 当前的最新提交内容(含 差异) | git show HEAD ![]() |
| 查看 指定两个提交的差异 | git diff <旧哈希> <新哈希> |
| 查看 指定文件的内容 在工作区、暂存区的区别 (丢弃工作区更改前,查看工作区的更改) | git diff <文件路径> |
| 保存未提交的更改 (丢弃工作区更改前,备份工作区的更改) | git stash |
| 重置工作区:丢弃工作区的更改,从某个分支 "恢复文件" ; 注:这个操作有危险性,未提交的更改 会被永久丢弃且无法恢复。 首先,要确定某个文件的当前更改 全部不要了,其次才能用。 | 工作区文件内容 = 指定分支的最新提交版本 : git checkout 分支名 -- <文件路径> |
| 重置工作区:丢弃工作区的更改, 从某个提交 "恢复文件" ; 作用: 恢复到"任意历史版本。 注:从提交历史恢复的文件 会被默认添加到"暂存区"" 。 注:这个操作有危险性,未提交的更改 会被永久丢弃且无法恢复。 | 工作区文件内容 = 指定提交里的内容 : git checkout 提交哈希值 -- <文件路径>(优先级:暂存区>最新提交) |
重置工作区:丢弃工作区的更改,从最新提交、暂存区 恢复指定文件的内容 : 将指定文件 恢复到最近一次 提交( git commit) 或 暂存 (git add) 时的状态。 作用:丢弃当前工作区的更改(未暂存的更改) 。 注:这个操作有危险性,未提交的更改 会被永久丢弃且无法恢复。 |
工作区文件内容 = 暂存区内容 或 最新提交里的内容 : git checkout -- <文件路径> |
| 重置工作区:丢弃工作区的更改, 从"最新暂存 或 最新提交" 恢复指定文件的内容 。 注:这个操作有危险性,未提交的更改 会被永久丢弃且无法恢复。 | 工作区文件内容 = 暂存区内容 或 最新提交里的内容 : git restore <文件路径> = git checkout -- <文件路径> (优先级:暂存区>最新提交) 工作区的新更改不要了,工作区恢复到哪个版本? 暂存区有内容,就恢复到暂存区一样。 暂存区没有内容,就恢复到和最新提交一样。 注 : git restore <文件路径> = git restore -W <文件路径>(简写的显式指定) = git restore --worktree <文件路径> (完整的显式指定) git restore 的默认选项 : W/--worktree , 重置工作区 :重置为暂存区版本 或 最新提交版本,暂存区优先。 |
| 重置工作区:丢弃工作区的更改,从指定提交 恢复指定文件的内容 。 注:这个操作有危险性,未提交的更改 会被永久丢弃且无法恢复。 | 工作区文件内容 = 指定提交里的内容 : git restore -s 提交哈希值 <文件路径> = git restore --source=提交哈希值 <文件路径> = git checkout 提交哈希值 -- <文件路径> |
10. 删除文件:手动删除 = rm <文件路径>、从 暂存区删除 git rm --cached <文件路径>
| 用途 | 命令 |
|---|---|
| 从工作区 删除文件(暂存区仍存在) | 手动删除、rm <文件路径> (不是git rm) |
| 从工作区、暂存区 同时删除文件 | git rm <文件路径> |
| 从"暂存区"删除文件、但工作区不删除(仍然保留在工作区) | git rm --cached <文件路径> (多了个 --cached) 注 :不带 --cached选项时,会从工作目录中删除文件(物理删除), 带 --cached选项时,保留本地文件。 |
| 递归删除:删除目录以及目录下的所有文件 | git rm -r directory/; -r:递归删除 文件夹内部所有内容。 |
| 强制删除(即使 文件有"未提交的更改") | git rm -f <文件路径> -f = --force,强制删除。 |
11. 标签 tag:标记重要提交、常用于标记 "发布的版本号" → git tag
| 用途 | 命令 |
|---|---|
| 创建 无说明的"轻量标签"(Lightweight) = 对某个特定提交的引用。 注 :只会显示出"被打标签的提交 "的信息, 无 标签的其他详细信息,不会指明打标签的人是谁。 | 默认打在"当前最新提交"上 :git tag <标签名> 例 : git tag v1.0.1。 注 :未指定 提交哈希值 时,默认在当前分支的最新提交 上 打标签。 ❷ 给指定提交 打轻量标签 :git tag <标签名> <提交哈希值> |
| 创建 带说明的"附注标签" (Annotated ) 一般用于发布 。 (含打标签的用户名、邮箱、日期、标签说明) | 默认打在"当前最新提交"上 :git tag -a <标签名> -m "标签说明"; -a:annotated美/ˈænəteɪtɪd/,注释。 注 :未指定 提交哈希值 时,默认在当前分支的最新提交 上 打标签。 例 : git tag -a v1.0.0 -m "Release version 1.0.0"。 ❷ 给指定提交 打附注标签 :git tag -a <标签名> -m "标签说明" <提交哈希值> 。 |
| 查看 所有标签 | git tag = git tag --list = git tag -l |
| 查看 某个标签详情 | git show <标签名> 例 : git show v1.0.0 |
| 按指定格式 查找标签 | git tag -l "正则格式" = git tag --list "正则格式" ; 注 :指定查找格式时,必须使用选项-l 或--list 才能指定格式。 例 : 指定匹配标签名的通配模式*: git tag -l "v2.*" , ⇒ 可能匹配输出:v2.0.0 、 v2.1.0 、v2.1.1。 |
推送指定标签 到远程仓库 注 :默认情况下,git push 命令不会传送标签到远程仓库。 在创建完标签后,必须显式地推送标签到远程仓库。 |
git push <远程仓库别名> <标签名> 例 : git push github v1.0.0。 |
| 推送 所有(不在远程仓库上的)标签 | git push <远程仓库别名> --tags 例 : git push github --tags。 |
| 删除 本地指定标签 | git tag -d <标签名> 例 : git tag -d v1.0.0 |
| 删除 远程仓库的指定标签 二个步骤:❶ 删本地标签 + ❷ 删远程标签。 注 :推送本地仓库时 是不会推送标签的, 标签要"专门推送、专门删除"。 | ❶ 方法一 :git push <远程仓库别名> :refs/tags/<标签名> 含义:将冒号前面的空值 推送到远程标签名,相当于删除它。 例 : git push github :refs/tags/v0.9。 方法二 :git push <远程仓库别名> --delete <标签名> 例 : git push github --delete v0.9 |
12. 查找时 指定"搜索范围":grep (可用正则表达式 指定格式)
grep (Global Regular Expression Print) :全局正则表达式打印,用于查找字符串,可以在文本中 指定搜索模式。
grep可以单用,也可以使用|来搭配其他命令 一起使用。
| 用途 | 说明 |
|---|---|
| 在指定文件中 搜索关键词 | grep "关键词" <文件路径> ![]() |
| 筛选 含有"指定字符串"的结果 | ` |
| 筛选 含有"有指定格式的字符串"的结果 | ` |
13. 远程仓库:git remote
远程仓库常用的基础命令
| 用途 | 命令 |
|---|---|
| 克隆/下载 远程仓库(如 Github 上"已有的仓库") | git clone <远程仓库的 git 地址> |
| 查看 远程仓库信息 | git remote -v |
| 查看 某个远程仓库的详细信息(配置和状态) 如 所有远程分支名 , 在特定的分支上执行命令时,会自动关联到哪一个远程分支。 | git remote show <远程仓库别名> |
| 添加远程仓库:手动把本地项目和"远程仓库"关联 | git remote add <远程仓库别名> <远程仓库的 Git 地址> |
| 删除 已关联的远程仓库 | git remote rm <远程仓库别名> |
给远程仓库重命名 会更改所有远程跟踪的分支名字 。 例 : git remote rename origin github 过去引用 origin/main 的现在会引用 github/main。 |
git remote rename <旧别名> <新别名> |
14. 同步远程仓库的更新、并推送本地 Git 仓库: git fetch、git diff、git merge、git pull、git push
相关基础命令
| 用途 | 命令 |
|---|---|
获取 "默认关联的远程仓库"的最新数据(未指定远程仓库时) : 注 :git fetch 只下载远程数据,不合并。 |
git fetch |
| 获取 指定远程仓库的最新数据(不自动合并) | git fetch <远程仓库的别名> |
| 只获取 指定远程仓库的指定分支(不自动合并) | ❶ 下载 指定的远程分支 到本地 :git fetch <远程仓库的别名> <远程分支名>; ❷ 下载 指定的远程分支 到指定的本地分支 :git fetch <远程仓库名> <远程分支名>:<本地分支名>; |
| 获取 所有远程仓库的数据 | git fetch --all |
| 查看 远程仓库信息 | git remote -v(能看见自己远程仓库的别名;克隆下来的仓库,默认是 origin,也可以自己重命名) ![]() |
| 查看 远程仓库分支的提交历史 | git log <远程仓库的别名>/<远程分支名> --oneline |
| 查看 本地的提交历史(每个提交一行) | git log --oneline |
| 查看 本地的提交历史(图形化、每个提交一行) | git log --graph --oneline (若是远程仓库、本地仓库都有新提交,能查看"提交历史分叉"的情况) |
查看 远程仓库的指定分支的 最新提交历史(获取fetch新数据后) |
git log <远程仓库名>/<远程分支名> --oneline ; 例 : git log github/main --oneline ; |
| 查看 本地分支、远程分支的差异 | git diff A B A、B :远程分支、本地分支名。 比较的是 从 A 到 B 的变化 ,即 "在 A 的基础上,需要做什么更改才能得到 B "。 输出信息 : 绿色字 :B 中新更改的内容 。 红色字 :B 中没有的内容 。 例 : git diff <远程仓库的别名>/<远程仓库分支名> <本地分支名> = git diff github/main main。 或者 例 : git diff <本地分支名> <远程仓库的别名>/<远程仓库分支名> = git diff main github/main。 |
| 查看 仓库状态 | git status |
| 合并分支内容 | 合并到当前分支(带合并消息) :git merge -m "合并消息" <远程仓库别名>/<远程分支名> ; 合并到当前分支(不带合并消息) :git merge <远程仓库别名>/<远程分支名> , 如 git merge github/main。 |
| 不快进 合并分支内容 即使能快进,也创建 "合并提交" , 保留分支合并历史。 | git merge --no-ff origin/main --no-ff:不快进合并。 |
| 取消合并(回到合并前) | git merge --abort |
| 冲突时 使用对方版本 | git merge -X theirs 分支名; X:指定合并策略选项; |
| 冲突时 使用我方版本 | git merge -X ours 分支名; |
从远程仓库 拉取数据(下载+合并 分支提交) ( git pull= git fetch + git merge) |
❶ 下载+合并 到"当前所在分支" :git pull <远程仓库名> <远程分支名> ; 例 : 远程分支 main → 当前所在分支(未指定=默认当前分支):git pull github main ❷ 下载+合并 到"本地指定分支" :git pull <远程仓库名> <远程分支名>:<本地分支名> 例 : 远程分支 main → 本地分支 main:git pull github main:main。 ❸ 本地分支 已经设置了"上游跟踪" :git pull。 |
| 把本地 Git 仓库 推送到远程仓库 | ❶ 默认把本地分支 推送到"远程同名分支" :git push <远程仓库别名> <本地分支名> ❷ 把本地分支推送到 指定的远程分支 :git push <远程仓库名> <本地分支名>:<远程分支名> |
| 建立跟踪关系 : 设置已有的本地分支 跟踪 一个刚刚拉取下来的远程分支 或 修改正在跟踪的上游分支 | git branch -u <远程仓库别名>/<远程分支> -u = --set-upstream-to ,设置上游分支。 例 : 设置当前分支 跟踪远程 main 分支 git branch -u github/main 例 : 简写,自动拉取并合并到当前分支 :git pull |
15. Git 查看对象:git cat-file、git ls-files 、git count-objects、git rev-list 、git shortlog
| 用途 | 命令 |
|---|---|
| 查看 提交历史(每个提交一行) | git log --oneline |
| 查看 对象的内容 | git cat-file -p <哈希值> cat:显示文件内容; cat-file:显示 Git 对象文件的内容。 -p 参数:表示 "pretty-print"(美化输出),会自动根据对象类型 格式化显示。 |
| 查看 对象的类型 | git cat-file -t <哈希值> |
| 查看 某个文件的提交历史 | git log --oneline <文件路径> 例 : git log --oneline README.md |
| 在提交前,查看暂存区有什么文件 | git ls-files --stage ls-files:列出文件 (list files),显示当前暂存区中 所有文件的信息。 |
| 查看 暂存区内容 与最新提交的差异 | git diff --staged HEAD = git diff --cached HEAD --staged 、--cached 同一个意思。 |
| 查看 两个指定提交的差异 | git diff 提交哈希值1 提交哈希值2 |
| 查看 当前提交与上一个提交的差异 | git diff HEAD~1 HEAD |
| 查看 对象数量(详细信息) | git count-objects -v count-objects:统计 Git 对象。 -v = --verbose:显示详细输出 。 1. count:.git/objects下 有 214 个对象。 2. size:214个对象,大小2699KB = 2.6MB。 3. in-pack: 包文件中的对象数量为 0 。 4. packs:包文件数量 为 0 (打包成一个文件可节省空间)。 5. size-pack:包文件大小为 0KB。 6. prune-packable:可以打包但尚未打包的对象数量 为0。 7. garbage:垃圾对象的数量、大小 为 0。 |
| 查看 指定提交到"起点"之间的 提交的数量 | git rev-list --count HEAD rev-list :(到指定提交对象的) 所有提交的哈希值列表 (revision:修订版本 = 各个提交) --count:只显示 提交的数量 ,不显示具体的提交哈希值。 HEAD:默认指向 当前分支的最新提交。 注:截止到最新提交,共有 39 个提交。 |
| 查看 每个人的提交数量 | git shortlog -sn git shortlog:显示 按作者分组的 "提交说明"列表 。 -s:简略模式,只显示提交次数和作者名 (不显示具体提交信息) -n:按提交次数降序排序(从多到少)。 |
16. Git 分支:git branch、git checkout、git switch、git merge
| 用途 | 命令 |
|---|---|
| 查看 文件内容 | cat <文件路径> |
| 查看 提交历史记录 | git log --oneline(简洁版) git log --oneline -n (-n 指定数量) |
| 查看 仓库状态 | git status |
| 查看 对象的内容 | git cat-file -p <哈希值> |
| 创建分支 | ❶ git branch <分支名> 注 :默认基于当前分支的提交历史 创建新分支。 创建时,注意当前分支是哪个。 ❷ 基于指定分支 创建新分支 : git branch <新分支名> <基于的分支名> 。 例 : 基于远程 dev 创建新分支。 git branch new-branch origin/dev 。 |
| 切换分支 | git checkout <分支名> = git switch <分支名>(新语法,推荐) |
| 合并指定分支 到当前分支 | ❶ 不带提交说明 :git merge <分支名>。 ❷ 禁用"快进合并" 的合并 : git merge --no-ff -m "合并提交的说明" <分支名>。 加了两个选项: --no-ff:禁用快进合并。 -m "合并提交的说明",非快进合并时,会创建一个新的合并提交 ,这是提交的说明。 ❸ 带提交说明的 合并 :git merge -m "合并提交的说明" <分支名> 。 注 :用于非快进合并 ,会创建合并提交 ,带提交说明。 注 :无 --no-ff,仅 -m 时,若符合"快进合并",会自动忽略 -m,不创建 合并提交,直接 移动指针。 ![]() |
| 创建新分支 并切换到新分支 | git checkout -b <新分支名> = git switch -c <新分支名>(新语法,推荐) = ❶ 创建 git branch <新分支名> (基于当前分支创建)+ ❷ 切换 git checkout <新分支名>。 注 :默认基于当前分支的提交历史 创建新分支。 基于指定分支 创建新分支并切换 git checkout -b <新分支名> <基于的分支名>。 |
删除本地分支 注 :新分支上有提交时, 必须已经合并到其他分支了,才能-d删除,避免丢失数据。 |
git branch -d <分支名> |
| 强行删除 本地未合并分支 危险操作:非常确认新分支上的内容不要了,才能强行删除。 | git branch -D <分支名>。 |
| 删除远程分支(已推送的分支) | git push <远程仓库别名> --delete <远程分支> ![]() |
| 查看 每一个分支的最后一次提交 | git branch -v ![]() |
| 查看 所有的已跟踪分支 | git branch -vv ahead 2:本地还有 2 个提交没推送。 对比数据:从服务器上最后一次抓取的数据。 |
| 查看 已经合并 或尚未合并到"当前分支"的分支 | ❶ 已经合并的分支 :git branch --merged。 ❷ 未合并的分支 :git branch --no-merged。 |
| 查看 尚未合并到"指定分支"的分支。 | git branch --no-merged <合并到的分支名> 例 : 尚未合并到 main 分支的有哪些: git branch --no-merged main。 注 :在新分支里 也可以查看,不用切换到main分支再查看。 |
| 建立跟踪关系 : 设置已有的本地分支 跟踪 一个刚刚拉取下来的远程分支 或 修改正在跟踪的上游分支 | git branch -u <远程仓库别名>/<远程分支> -u = --set-upstream-to ,设置上游分支。 例 : 设置当前分支 跟踪远程 main 分支 git branch -u github/main 例 : 简写,自动拉取并合并到当前分支 :git pull |
17. 保存 分支"未提交的更改":git stash
| 用途 | 命令 |
|---|---|
| 保存 当前分支"未提交的更改(= 暂存区更改+工作区更改)" , 工作目录: 恢复 到当前分支"最后一次提交",工作目录变干净。 | ❶ 不带说明信息 : git stash ; ❷ 带说明信息 :git stash push -m "stash 说明" push :表示"推送"到 stash 栈。 注 :.git/refs/stash 只存储最新的 stash , 旧的 stash 存储在 reflog 中,可用 git reflog stash 查看。 ❸ 只 stash 特定文件 : git stash push -- <文件路径>; ❹ 只 stash 暂存区的更改 :git stash push --staged -m "stash 说明,如 已暂存的修改"; ❺ stash 包含"未跟踪文件" : git stash push -u -m "说明,如 包含新文件"; -u:包含 未跟踪文件 untracked 。 ❻ stash 所有(包括未跟踪和忽略的文件) : git stash push -a -m "说明,如 完整备份" 。 |
查看 所有 stash的列表 |
git stash list |
恢复 最近的一次 stash,并保留 这个 stash |
❶ 同时恢复 暂存区更改、工作区更改(推荐) :git stash apply --index ❷ 只恢复工作区更改 : git stash apply ![]() |
恢复 最近的一次 stash, 并删除这个 stash |
同时恢复 暂存区更改、工作区更改(推荐) :git stash pop --index ❷ 只恢复工作区更改 :git stash pop ![]() |
恢复 指定的 stash (stash@{0} 是最新的) |
❶同时恢复 暂存区更改、工作区更改 :git stash apply --index stash@{1} ❷ 只恢复 工作区更改 :git stash apply stash@{1} ![]() |
删除 指定 stash |
git stash drop stash@{6} ![]() |
清空所有 stash |
git stash clear ![]() |
18. 应用 指定提交里的 "新更改": git cherry-pick
| 用途 | 命令 |
|---|---|
| 将单个提交的新更改 应用到当前分支 | git cherry-pick <提交哈希值> |
| 将多个连续提交的新更改 应用到当前分支 | ❶ 从开始提交 到结束提交的新更改(不含开始提交) : git cherry-pick <开始提交哈希值>..<结束提交哈希值> 例 : 应用从 commitA 到 commitB 的所有提交(不包括开始提交 commitA ): git cherry-pick commitA..commitB; ❷ 从开始提交 到结束提交的新更改(含开始提交) : git cherry-pick <开始提交哈希值>^..<结束提交哈希值>; ^:开始位置。 例 : 应用从 commitA 到 commitB 的所有提交(包括开提交 commitA ): git cherry-pick commitA^..commitB。 |
| 应用 指定提交的新更改 (但不自动提交,只应用更改 到工作区) | git cherry-pick -n <提交的哈希值>; -n = --no-commit,不自动提交。 |
| 应用 指定提交的新更改 (编辑提交信息) | git cherry-pick -e <提交的哈希值>; -e = --edit,编辑提交信息。 |
继续 cherry-pick 注 :如果 cherry-pick 时出现冲突,编辑冲突文件, git add 后继续执行 cherry pick。 |
git cherry-pick --continue |
取消 cherry-pick (有冲突时,可取消) |
git cherry-pick --abort |
| 不想解决冲突,跳过这个提交 (有冲突时,可跳过) | git cherry-pick --skip |
19. 推送本地新分支到 远程仓库、克隆远程仓库、基于远程分支 创建对应的本地分支:git branch、git push、git clone、git checkout、git switch
| 用途 | 命令 |
|---|---|
| 查看远程仓库 | git remote -v ![]() |
| 查看 所有本地分支 | git branch ![]() |
| 查看 所有分支名(含远程跟踪的) | git branch -a ![]() |
| 推送本地分支 到远程仓库 | ❶ 切换到要推送的本地分支上(默认推送到到远程同名分支) :git push <远程仓库别名> <本地分支名>。 ❷ 推送到远程,并建立跟踪关系(-u 参数) :git push -u <远程仓库别名> <本地分支名>。 -u 或 --set-upstream:建立本地分支与远程仓库分支 的跟踪关系 。 如果第一次推送加 -u,之后可以在分支上直接 git push ,不用指定远程仓库。 ❸ 在其他分支上,指定推送的本地分支和远程分支 :git push <远程仓库别名> <本地分支>:<远程分支>。 |
| 删除远程分支(已推送分支) | git push <远程仓库别名> --delete <远程分支> |
| 克隆远程仓库 | git clone <远程仓库的 Git 地址> |
| 基于远程分支,创建对应的本地分支 | ❶ git checkout -b <本地分支> <远程仓库别名>/<远程分支> = ❷ git switch -c <本地分支> <远程仓库别名>/<远程分支> 注 :克隆仓库时,只检出(checkout)默认分支 到工作目录,一般是main, 即 只会自动创建一个本地分支main。 其他分支 :不会自动创建本地分支,需要手动创建。基于远程分支,创建对应的本地分支。 |
20. 变基:以"指定目标分支的最新提交"为基点(祖先),重写分支的"提交历史" :git rebase(只对"未推送的本地提交"使用变基)
| 用途 | 命令 |
|---|---|
| 把当前分支的提交历史 变基 基础 = 新的共同祖先 = 指定的基础分支的最新提交历史 | git rebase <基础分支> 不指定目标分支,默认目标分支 = 当前分支 , = 改变当前分支的提交历史, <基础分支> 历史保持不变。 例 :用 main分支的最新提交为基础(= 最新的共同祖先),改变当前分支的提交历史: git rebase main 。 |
| 改变"指定目标分支"的提交历史(变基), <基础分支> 的历史保持不变 | git rebase <基础分支> <目标分支> 例 : 改变 dev 分支的提交历史(变基),新祖先 = main的最新提交历史 git rebase main dev |
| 查找 所有操作记录 | git reflog -n 使用 -n 指定最近的条数 |
| 版本回退:退回到未变基前 | git reset --hard HEAD@{n} 在查找记录 reflog里,精准找到变基前的最新提交。 HEAD@{n} :可替换成变基前的最新提交哈希值(若能找到) |
♣ 结束语 和 友情链接
-
快速搜索 :涉及知识点比较多,看过之后忘了很正常,想查询时,请按
Ctrl+F快速搜索关键字哦 (* ̄︶ ̄)。- 搜索后,多次按下 enter 键 或 点击搜索框后的 上下箭头,就能在关键词之间快速跳转。
-
完整图文的详解 参见: 【Git 教程:分布式版本控制(超全图文详解;含 把项目同步到 github 、Gitee)】。
- 感谢:❤ 如果这篇文章 对您有帮助的话,可以点赞、评论、关注,鼓励下作者哦,谢谢小可爱们 ~╮( ̄▽ ̄)╭ ~
- 欢迎指正: 如果发现 有需要更正的细节问题,欢迎指正。
- 喜欢请收藏:喜欢本文 可收藏哦,方便快捷,会持续进行 ❶ 知识点更新 及 ❷ 修正错误。
- 转载 请评论告知作者 并注明出处 ,Thanks♪(・ω・)ノ
- 作者:Hey_Coder
- 来源:CSDN
- 版权声明:本文为博主原创文章,转载请附上博文链接!










1.
注:截止到最新提交,共有 39 个提交。



注 :
❸ 只 stash 特定文件 :
❷ 只恢复工作区更改 : 
❷ 只恢复工作区更改 :
❷ 只恢复 工作区更改 :




