常用 Git 命令
开始一个工作区(参见:git help tutorial)
clone:克隆仓库到一个新目录
默认
1
git clone <remote-url>
重命名本地仓库文件夹名
1
git clone <remote-url> <new-local-folder-name>
克隆指定分支
1
git clone -b <branch-name> <remote-url>
init:创建一个空的 Git 仓库或重新初始化一个已存在的仓库
该命令不需要 Git Config 中的 user.name 、 user.email 。
在当前变更上工作(参见:git help everyday)
add:添加文件内容至索引
mv:移动或重命名一个文件、目录或符号链接
Git 对文件名大小写不敏感。
如需修改文件名(包含文件类型后缀),需要这样做:
1
git mv <old-file-path> <new-file-path>
将目录 A 下所有文件夹/文件移动到目录 B 下:
1
2
3
4git mv <folder-a>/* <folder-b>/
# for example:
git mv src/img/* src/images
restore:恢复工作区文件
rm:从工作区和索引中删除文件
--cached:仅从索引中删除文件
- 仅仅在索引中删除文件,而不会从(本地)工作区中删除文件。
- 需
commit并push本次操作,才会在远程仓库中删除文件。
1 | git rm --cached <file-name> |
--f / --force:强制删除文件
会在本地工作区和索引中删除文件,并且不会提示用户。
需
commit并push本次操作,才会在远程仓库中删除文件。1
2git rm --f <file-name>
git rm --force <file-name>
--ignore-unmatch:忽略不匹配的文件
sparse-checkout:初始化及修改稀疏检出
检查历史和状态(参见:git help revisions)
bisect:通过二分查找定位引入 bug 的提交
diff:显示提交之间、提交和工作区之间等的差异
grep:输出和模式匹配的行
log:显示提交日志
show:显示各种类型的对象
status:显示工作区状态
扩展、标记和调校您的历史记录
branch:列出、创建或删除分支
-d / -D
删除远程分支:
1
git push -d origin remote-branch-name
删除在远程已被删除的本地/远程分支记录
删除“无用”的本地分支
1
git branch -D branch-name
批量删除“无用”的本地分支
- 一次性删除所有包含特殊字段的已合并分支
1
2git branch | grep 'change-*' | xargs git branch -d
// 切记不要用 -D,否则会删除未合并的分支删除“无用”的远程分支
这里所谓“‘无用’的远程分支”,是指在远程已经删除了的分支,在本地哪怕是 git pull 后,本地依旧还是显示存在该远程分支的记录。
一次性删除本地所有无用的远程分支记录
1
git remote prune origin
在这之前其实建议先查看远程和本地的分支对应情况
- 有对应关系的,则为
tracked - 无对应远程关系的,则为
stale
1
git remote show origin

在执行了
git branch -D branch-name,会得到以下执行结果
- 有对应关系的,则为
-m:修改分支名
1 | git branch -m <old-branch-name> <new-branch-name> |
commit:记录变更到仓库
--amend
修改 commit message,或者并且要追加改动内容
1
git commit --amend
--no-edit
仅仅追加改动内容
1
git commit --amend --no-edit
merge:合并两个或更多开发历史
--abort:终止合并
当你想终止当前的合并进程时,可此时的 Ctrl + C / control + C 是毫无作用的)。
但你可以使用 git merge 的 --abort 参数。
1 | git merge --abort |
cherry-pick:应用一些现有的提交所引入的修改(分支之间)
默认。若无冲突,直接合并。提交时间为引用提交的提交时间,但 commit id 与引用提交的 commit id 不一致。
1
git cherry-pick <commit-id>
<commit-id>:仅需要前 7 位即可更多参考
rebase:在另一个分支上重新应用提交
谨慎使用
reset:重置当前 HEAD 到指定状态
回滚到某个提交,1 ~ n。这会将提交记录,和代码改动一起回滚
1
git reset HEAD~n
—-soft
仅仅撤销提交记录,代码改动不撤销(常用)
1
git reset --soft HEAD~n
switch:切换分支
checkout “分支管理“功能的替代者,在 Git v2.23 中引入
切换已有分支
1
git switch branch-name
-c
创建并切换到新分支
- 基于当前所在的本地分支创建新的本地分支
1
git switch -c branch-name
- 基于远程分支创建新的本地分支
1
2git switch -c <new-branch-name> origin/branch-name
git switch -c <new-branch-name> upstream/branch-name
--orphan
创建并切换到一个不包含任何内容的分支,无文件,无提交:
1
git switch --orphan <new-branch-name>
但当前所在分支必须要提交完所有已改动文件,不然无法创建。
假如想创建一个文件存在但不包含提交信息的新分支,则使用 checkout 的 --orphan 参数:git checkout --orphan <new-branch-name> 。
tag:创建、列出、删除或校验一个 GPG 签名的标签对象
创建
Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。
轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。
而附注标签是存储在 Git 数据库中的一个完整对象,它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间,此外还有一个标签信息,并且可以使用 GNU Privacy Guard(GPG)签名并验证。通常会建议创建附注标签,这样你可以拥有以上所有信息。但是如果你只是想用一个临时的标签,或者因为某些原因不想要保存这些信息,那么也可以用轻量标签。
—《Git Pro》
附注标签(annotated)
创建附注标签:
1 | git tag -a <tag-name> -m "tag message" |
-a:指定创建附注标签-m:指定标签信息
轻量标签(lightweight)
轻量标签本质上是将提交校验存储到一个文件中——没有保存任何其他信息。创建轻量标签,不需要使用
-a、-s(笔者注:-s, –sign:annotated and GPG-signed tag) 或-m选项,只需要提供标签名字。—《Git Pro》
1 | git tag <tag-name> |
列出
所有
1
2# 列出 - 所有的
git tag检索
1
2# 列出 - 检索
git tag -l "tag-name-keywords"
删除
仅删除本地 tag
1
2# 删除
git tag -d <tag-name>删除本地和远程 tag
1
2git tag -d <tag-name>
git push origin :refs/tags/<tag-name>仅删除远程 tag
1
git push origin --delete <tag-name>
推送
新建的 tag 记录并不会跟随 git push / git push origin branch-name 一起推送,需要在 git push 时显式地指定 tag name 以推送 tag 记录:
1 | git push origin <tag-name> |
协同(参见:git help workflows)
fetch:从另外一个仓库下载对象和引用
pull:获取并整合另外的仓库或一个本地分支
git pull,是“先执行 git fetch 然后在执行 git merge FETCH_HEAD ”的操作简写。
push:更新远程引用和相关的对象
--force/ -f:强制
使用本地分支的提交覆盖远程仓库分支的提交。有安全隐患,会覆盖掉其他人在该分支的新提交。
1 | git push --force |
--force-with-lease
使用该参数,如果远程仓库有其他人推送了新的提交,那么你本次的覆盖推送将被拒绝。
1 | git push --force-with-lease |
--mirror :禁止使用
该命令,会把本地仓库的所有本地分支作为新的源/版本,推送到远程仓库,覆盖仓库原有内容。
假如本地分支中没有远程仓库中的某些分支,那么远程仓库上的这些分支将被删除……
1 | git push --mirror |


![[Guide] Clash for Windows](https://raw.githubusercontent.com/Dreamacro/clash/master/docs/logo.png)

