常用 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 |