Git命令
本文最后更新于:3 年前
引言
本文将系统地介绍 Git
在实际开发中常用的命令及其用法,包括仓库初始化、配置管理、远程操作、分支和标签管理、子模块使用等。对于刚入门的读者,本文能帮助快速了解基础操作;对于已经熟悉 Git
的开发者,也可将其当作一份全面的参考手册或速查表。
创建及配置
git init
作用
git init
用于在当前目录下创建一个新的 Git
仓库。执行后,该目录会被 Git
识别为仓库,并创建 .git
目录来存储版本控制信息。
基本用法
1 |
|
参数说明
--bare
:创建一个裸仓库(不含工作区的Git
仓库,通常用于远程仓库)。--template=<directory>
:指定初始化时使用的模板目录。--separate-git-dir=<git-dir>
:指定.git
目录的存放位置,而非默认的当前目录。--shared[=<permissions>]
:用于多人协作时设置共享权限(适用于团队开发的Git
服务器)。
示例
1 |
|
git config
作用
git config
用于设置 Git
的用户信息、编辑器、合并策略等全局或局部配置。
基本用法
1 |
|
参数说明
--local
:只对当前Git
仓库生效(默认),配置存储在.git/config
。--global
:对当前用户所有Git
仓库生效,配置存储在~/.gitconfig
。--system
:对系统所有用户生效,配置存储在/etc/gitconfig
。--unset
:删除指定的配置项。--edit
:直接编辑Git
配置文件。
常见配置项
user.name
:设置Git
用户名。user.email
:设置Git
用户邮箱。core.editor
:设置默认编辑器。core.ignorecase
:设置是否忽略大小写(Windows
常用)。core.autocrlf
:处理换行符(true
:Windows
,input
:Linux/macOS
)。alias.<shortcut>
:创建Git
命令别名。diff.tool
:设置默认的diff
工具。merge.tool
:设置默认的合并工具。push.default
:设置git push
默认行为(如simple
或matching
)。credential.helper
设置Git
认证方式,如cache
或store
。
示例
1 |
|
远程
git remote
作用
git remote
用于管理本地 Git
仓库和远程仓库的连接信息,例如添加、删除、查看远程仓库。
基本用法
1 |
|
参数说明
-v
:显示远程仓库的详细 URL。add <name> <url>
:添加远程仓库。remove <name>
:删除远程仓库。rename <old> <new>
:重命名远程仓库。set-url <name> <url>
:修改远程仓库 URL。
示例
1 |
|
git clone
作用
git clone
用于克隆远程 Git
仓库到本地。
基本用法
1 |
|
参数说明
<repository_url>
:远程仓库URL
(HTTP/HTTPS/SSH
)。<directory>
:指定克隆后的目录名称。--bare
:克隆为裸仓库(无工作区)。--mirror
:完全镜像克隆,包括远程分支、标签等。--branch <branch>
:指定克隆的分支。--depth <depth>
:仅克隆指定深度的提交(加速克隆)。--single-branch
:仅克隆单个分支(默认main
/master
)。
示例
1 |
|
git fetch
作用
git fetch
从远程仓库拉取最新的变更,但不会合并到本地分支。
基本用法
1 |
|
参数说明
<remote>
:远程仓库名称(如origin
)。<branch>
:指定拉取的远程分支。--all
:拉取所有远程仓库的更新。--prune
:删除本地已不存在的远程分支。--depth <depth>
:仅拉取指定深度的提交。
示例
1 |
|
git pull
作用
git pull
等价于 git fetch
+ git merge
,即拉取远程分支的最新代码并合并到当前分支。
基本用法
1 |
|
参数说明
<remote>
:远程仓库名称。<branch>
:远程分支名称。--rebase
:使用rebase
而非merge
合并更新。--depth <depth>
:限制拉取的提交历史深度。--no-commit
:拉取更新但不自动提交。
示例
1 |
|
git push
作用
git push
用于将本地分支的提交推送到远程仓库。
基本用法
1 |
|
参数说明
<remote>
:远程仓库名称。<branch>
:要推送的本地分支。--force
(-f
):强制推送,可能导致远程提交丢失。--delete
:删除远程分支。--set-upstream
(-u
):关联本地分支与远程分支。--all
:推送所有分支。--tags
:推送所有标签。
示例
1 |
|
状态
git status
作用
git status
用于查看当前 Git
仓库的状态,主要包括:
- 工作目录中有哪些文件被修改或未跟踪。
- 哪些文件已添加到暂存区但未提交。
- 当前所在分支及是否有未提交的更改。
基本用法
1 |
|
状态说明
执行 git status
后,可能看到以下几种状态:
Untracked files
:未跟踪的文件,即Git
还未管理的文件(新文件)。Changes not staged for commit
:已被修改但未添加到暂存区的文件。Changes to be committed
:已添加到暂存区但未提交的文件。Your branch is ahead of 'origin/main' by X commits
:当前分支比远程分支多X
个提交,需要git push
。nothing to commit, working tree clean
:没有任何变更,工作目录是干净的。
参数说明
-s
或--short
:显示简短格式的状态信息。-b
或--branch
:显示当前分支信息。--ignored
:也显示被.gitignore
忽略的文件。
示例
1 |
|
git diff
作用
git diff
用于比较不同版本的文件,常用于:
- 比较工作区和暂存区的文件差异。
- 比较暂存区和最新提交之间的差异。
- 比较两个分支之间的差异。
- 比较某次提交与当前分支的差异。
基本用法
1 |
|
参数说明
--staged
或--cached
:比较暂存区和上次提交的差异。--name-only
:只显示有差异的文件名。--name-status
:显示文件的变更类型(新增、删除、修改)。--color
:强制启用颜色高亮。--word-diff
:逐词显示变更内容,而非逐行。--stat
:显示统计信息,如修改行数。-p
:显示补丁格式的详细修改内容。
示例
1 |
|
日志
git log
作用
git log
:用于查看 Git
提交历史,包括提交信息、提交人、时间、哈希值等。
基本用法
1 |
|
参数说明
-p
:显示每次提交的详细代码变更(patch
)。--oneline
:每条提交仅显示一行(简洁格式)。--graph
:以 ASCII 图形方式展示分支结构。--decorate
:显示分支、标签等附加信息。--author=<name>
:仅显示特定作者的提交。--since=<date> / --until=<date>
:显示特定时间范围内的提交。--grep=<pattern>
:按提交信息搜索。--stat
:显示每次提交修改的文件及变更统计。--abbrev-commit
:仅显示短哈希值。
示例
1 |
|
git reflog
作用
git reflog
记录所有对分支 HEAD
进行的操作(切换分支、提交、合并、reset
等)。
基本用法
1 |
|
参数说明
expire=<time>
:设定日志保留时间(如90 days
)。--all
:显示所有引用的变更(包括分支、标签等)。--grep=<pattern>
:按提交信息搜索。
示例
1 |
|
git blame
作用
git blame
用于追踪文件每一行的变更历史,显示是谁在什么时候修改了该行。
基本用法
1 |
|
参数说明
-L <start>,<end>
:仅显示指定行范围的提交信息。-C
:追踪代码块在文件内的移动。--date
:显示日期格式(short
,relative
,iso
等)。-w
:忽略空白字符的变更。
示例
1 |
|
git shortlog
作用
git shortlog
按作者分类并统计提交次数。
基本用法
1 |
|
参数说明
-s
:仅显示每个作者的提交数量。-n
:按提交数量排序。-e
:显示作者的电子邮件。
示例
1 |
|
git show
作用
git show
显示特定提交、分支或对象(标签、文件)的详细信息,包括提交信息、变更的代码等。
基本用法
1 |
|
参数说明
<commit>
:指定提交哈希值。<branch>
:指定分支名,查看最近提交详情。--stat
:仅显示文件变更统计信息。-p
:显示补丁格式(默认)。--name-only
:仅显示修改的文件名。--name-status
:显示文件变更类型(新增、删除、修改)。
示例
1 |
|
分支及操作
git branch
作用
git branch
用于创建、删除、重命名和查看分支。
基本用法
1 |
|
参数说明
-d
:删除本地已合并的分支。-D
:强制删除分支(即使未合并)。-m
:重命名分支。-r
:查看远程分支。-a
:查看所有分支(本地+远程)。
示例
1 |
|
git checkout
逐步被
git switch
取代,但仍然适用于恢复文件。
作用
git checkout
主要用于:
- 切换分支(已被
git switch
替代)。 - 恢复工作区的文件到某个版本。
基本用法
1 |
|
参数说明
-b
:创建并切换到新分支。--
:避免歧义,明确指定文件名。
示例
1 |
|
git switch
作为
git checkout
的替代,更简洁安全。
基本用法
1 |
|
参数说明
-c
:创建新分支并切换。--detach
:进入分离HEAD
状态(不会绑定到分支)。-
:上一个分支。
示例
1 |
|
git merge
作用
git merge
用于合并指定分支到当前分支。
基本用法
1 |
|
参数说明
--no-ff
:禁用fast-forward
合并,保留merge commit
。--squash
:压缩合并,不自动提交。--abort
:取消正在进行的合并。
示例
1 |
|
git rebase
作用
git rebase
让当前分支的提交叠加到目标分支,使历史更线性。
基本用法
1 |
|
参数说明
--interactive
(-i
):交互式变基,可编辑提交。--onto <new-base>
:将当前分支基于<new-base>
重新应用。--abort
:取消变基。--continue
:继续变基(解决冲突后)。
示例
1 |
|
git cherry-pick
作用
git cherry-pick
将某个提交复制到当前分支。
基本用法
1 |
|
参数说明
-n
:仅应用变更,不提交。-x
:在提交信息中添加原始提交哈希。--abort
:取消cherry-pick
。
示例
1 |
|
git revert
作用
git revert
用于撤销某次提交,同时保留历史记录,不影响之前的提交。
基本用法
1 |
|
参数说明
-n
:仅应用撤销变更,不提交。--no-edit
:使用默认提交信息。--abort
:取消撤销。
示例
1 |
|
暂存与提交
git add
作用
git add
将工作区的修改添加到暂存区(Staging Area
),等待提交。
基本用法
1 |
|
参数说明
.
:添加当前目录及子目录所有变更的文件。-A
:添加所有文件(包括新增、修改、删除)。-u
:仅添加已修改和已删除的文件(不包括新文件)。-p
:交互式选择部分变更进行暂存。
示例
1 |
|
git commit
作用
git commit
将暂存区的变更提交到本地版本库。
基本用法
1 |
|
参数说明
-m "<message>"
:直接在命令行输入提交信息。-a
:自动暂存所有已跟踪的文件(省略git add
)。--amend
:修改上一次提交(包括提交信息或文件)。--no-edit
:--amend
时不修改提交信息。
示例
1 |
|
git reset
作用
git reset
用于撤销提交、取消暂存或恢复文件到特定状态。
基本用法
1 |
|
参数说明
--soft
:撤销提交,但保留文件在暂存区。--mixed
(默认):撤销提交,同时取消暂存,但不修改工作区文件。--hard
:彻底撤销提交、暂存和工作区文件(数据不可恢复)。
示例
1 |
|
git rm
作用
git rm
用于从 Git
版本控制中删除文件(可选是否删除本地文件)。
基本用法
1 |
|
参数说明
-r
:递归删除目录。--cached
:仅从Git
版本库中删除文件,保留本地文件。-f
:强制删除文件(即使已修改)。
示例
1 |
|
git stash
作用
git stash
用于临时存储未提交的修改,以便切换分支或执行其他任务,稍后再恢复。
基本用法
1 |
|
参数说明
list
:显示所有stash
记录。pop
:恢复最近的stash
并删除记录。apply
:恢复stash
但不删除记录。drop
:删除最近的stash
记录。clear
:清空所有stash
记录。
示例
1 |
|
git restore
作用
git restore
用于恢复工作区中的文件,可以:
- 撤销未提交的修改(恢复为上次提交的版本)。
- 从暂存区恢复文件(相当于
git reset HEAD <file>
)。 - 恢复已删除的文件(只要还未提交删除)。
基本用法
1 |
|
参数说明
<file>
:需要恢复的文件名。--staged
:从暂存区恢复文件到工作区(撤销git add
)。--source=<commit>
:恢复到指定的提交版本(如HEAD~1
、commit-hash
)。.
:恢复所有文件。
示例
1 |
|
标签
git tag
作用
git tag
用于创建、删除、查看标签。Git
提供两种类型的标签:
- 轻量标签(Lightweight Tag):仅作为提交的引用,不包含额外信息。
- 附注标签(Annotated Tag):包含作者、日期、标签信息,存储在
Git
历史中。
基本用法
1 |
|
参数说明
-a
:创建附注标签,需添加描述信息。-m "<message>"
:指定标签的描述信息(用于附注标签)。-d
:删除本地标签。-l <pattern>
:按模式搜索标签(如v1.*
)。-f
:强制覆盖已有标签(需谨慎)。
示例
1 |
|
git describe
作用
git describe
用于显示最近的标签信息,通常用于版本管理,格式如下:
1 |
|
例如:
1 |
|
表示 v1.0
之后有 5 次提交,最新提交的哈希是 f3b1c2d
。
基本用法
1 |
|
参数说明
--tags
:允许使用轻量标签。--always
:如果没有标签,则返回提交哈希。--long
:显示完整格式。--dirty
:如果工作区有修改,则标记为dirty
。
示例
1 |
|
子模块
git submodule
提供了一系列命令来管理子模块,这在管理第三方库、依赖项目或大规模分布式开发时非常有用。
git submodule add
作用
将另一个 Git
仓库作为子模块添加到当前仓库。
基本用法
1 |
|
参数说明
<repository_url>
:远程子模块仓库的地址。<path>
:子模块存放的目录(可选,默认仓库名)。
示例
1 |
|
git submodule init
作用
git submodule init
不会拉取子模块的代码,只是让 Git
知道有子模块的存在(注册子模块)。
基本用法
1 |
|
示例
1 |
|
git submodule update
作用
git submodule update
用于拉取子模块的代码,并将其同步到父仓库指定的提交。
基本用法
1 |
|
参数说明
--recursive
:递归更新所有子模块(包括嵌套子模块)。--remote
:更新子模块到远程最新提交,而不是父仓库记录的提交。
示例
1 |
|
git submodule status
作用
git submodule status
显示当前子模块的状态,包括:
- 哈希值:子模块当前指向的提交。
- 是否已修改:如果子模块的
HEAD
与父仓库的记录不同,则会有+
标记。 - 路径:子模块存放的目录。
基本用法
1 |
|
示例
1 |
|
git submodule foreach
作用
git submodule foreach
允许对所有子模块执行批量操作。
基本用法
1 |
|
示例
1 |
|
git submodule sync
作用
如果父仓库修改了 .gitmodules
文件中的子模块 URL,需要执行 git submodule sync
来同步 URL。
基本用法
1 |
|
示例
1 |
|
git submodule deinit
作用
git submodule deinit
取消初始化子模块,使其变成未克隆的状态。
基本用法
1 |
|
示例
1 |
|
git submodule remove
作用
Git 没有 git submodule remove
,但可以手动删除子模块。
基本用法
基本步骤如下:
1 |
|
git clone –recursive
作用
如果一个 Git
仓库包含子模块,直接 git clone
不会自动克隆子模块。需要使用 --recursive
参数。
基本用法
1 |
|
示例
1 |
|
清理
git clean
作用
删除未跟踪文件,但不会影响已提交或暂存的文件,它只删除:
- 未被
Git
跟踪的文件(未git add
的文件)。 - 忽略的文件(如
.gitignore
里的文件,可选择删除)。 - 未跟踪的目录(可选择删除)。
基本用法
1 |
|
参数说明
-n
:仅模拟执行,不删除任何文件,只显示将被删除的文件列表。-f
:强制删除未跟踪的文件(Git
为了安全,不允许clean
默认执行,需要-f
)。-d
:删除未跟踪的目录(默认只删除文件)。-x
:删除所有未跟踪的文件,包括.gitignore
里忽略的文件。-X
:仅删除.gitignore
里忽略的文件(不删除未跟踪但未被忽略的文件)。
示例
1 |
|
总结
Git
提供了丰富且灵活的命令,从简单的 init
、add
、commit
,到高级的 rebase
、cherry-pick
、submodule
等,覆盖了开发者在项目协作过程中可能遇到的几乎所有场景。掌握这些命令及其常见参数,能大幅提升我们对版本历史的可控性与开发效率。
然而,最重要的并不是死记硬背所有命令,而是在实际项目中灵活运用。遇到问题时,及时查看官方文档或 “git <command> --help
” 也能快速解惑。希望本篇整理能帮助你在日常开发中更加游刃有余地管理代码。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!