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 协议 ,转载请注明出处!