好的,这是一份非常全面的 Git 命令指南,涵盖了从入门到进阶的常用命令,并对每条命令的作用进行了详细解释。
Git 命令核心概念
在开始之前,理解 Git 的三个主要工作区域至关重要:
- 工作目录 (Working Directory):你正在查看和编辑的本地文件。
- 暂存区 (Staging Area / Index):一个准备下次提交的文件列表。它像是购物车,你把需要的改动放进去。
-
本地仓库 (Local Repository):存储项目元数据和对象数据库的地方,位于你的
.git目录中。HEAD是一个指向当前所在分支的指针。
一、 初始化和配置
这些命令通常只在开始一个新项目或配置新环境时使用一次。
| 命令 | 解释 |
|---|---|
git init |
在当前目录创建一个新的 Git 仓库。这会创建一个 .git 子目录,其中包含所有必需的仓库文件。 |
git clone <repo_url> |
克隆(下载)一个远程仓库到本地。它会自动创建一个与远程仓库同名的目录,并初始化 .git 目录,拉取所有数据,并检出默认分支(通常是 main 或 master)的最新版本。 |
git config --global user.name "Your Name" |
设置全局的用户名,你在这个机器上所有的 Git 提交都会使用这个名称。 |
git config --global user.email "your_email@example.com" |
设置全局的邮箱地址,同样用于所有提交。 |
git config --list |
列出当前所有的 Git 配置项。 |
二、 基础工作流
这是你日常开发中使用最频繁的命令集合。
| 命令 | 解释 |
|---|---|
git status |
查看工作目录和暂存区的状态。它会显示哪些文件已被修改、哪些文件已暂存、哪些文件未被跟踪。这是最常用的命令之一。 |
git add <file> |
将工作目录中的文件改动添加到暂存区。准备下次提交。 |
git add . 或 git add -A
|
添加所有修改和新增的文件到暂存区(-A 是 --all 的缩写)。 |
git commit -m "Commit message" |
将暂存区的内容提交到本地仓库,并附带一条描述性的提交信息。-m 选项用于直接在命令行中输入信息。 |
git commit -a -m "Message" |
-a 选项可以跳过 git add 步骤,自动将所有已跟踪文件的修改添加到暂存区并提交。(对新文件无效)。 |
git log |
显示当前分支的提交历史。按 q 键退出。 |
git log --oneline |
以简洁的单行形式显示提交历史。 |
git diff |
显示工作目录与暂存区之间的差异(即,你修改了但还没 git add 的内容)。 |
git diff --staged |
显示暂存区与最后一次提交之间的差异(即,你已经 git add 了但还没提交的内容)。 |
三、 分支与合并
分支是 Git 的核心功能,用于并行开发。
| 命令 | 解释 |
|---|---|
git branch |
列出所有本地分支。当前分支会用 * 标出。 |
git branch <branch_name> |
创建一个新分支,但不会自动切换到该分支。 |
git checkout <branch_name> |
切换到指定的分支。 |
git switch <branch_name> |
(较新版本 Git) 一个更直观的切换分支的命令,专门用于切换,避免 checkout 的多重职责带来的混淆。 |
git checkout -b <branch_name> |
创建并立即切换到新分支。这是非常常用的组合命令。 |
git switch -c <branch_name> |
(较新版本 Git) git checkout -b 的替代命令,创建并切换。 |
git merge <branch_name> |
将指定分支的更改合并到当前分支。通常用于合并特性分支到主分支。 |
git branch -d <branch_name> |
删除指定的分支(如果该分支已被合并)。 |
git branch -D <branch_name> |
强制删除分支,即使它还没有被合并。慎用。 |
git log --graph --oneline |
以图形化方式显示分支和合并历史,非常直观。 |
四、 撤销与回退
当你犯错时,这些命令是你的救命稻草。
| 命令 | 解释 |
|---|---|
git restore <file> |
(较新版本 Git) 丢弃工作目录中指定文件的修改,将其恢复到最后一次提交的状态(或暂存区的状态,如果已暂存)。 |
git restore --staged <file> |
(较新版本 Git) 将文件从暂存区移回工作目录,即取消 git add 操作。文件内容保持不变。 |
git reset --hard HEAD |
危险命令。将工作目录和暂存区都重置到最近一次提交(HEAD)的状态,丢弃所有未提交的修改。 |
git reset --hard <commit_hash> |
危险命令。重置到指定的某次提交,丢弃该提交之后的所有提交和修改。<commit_hash> 可以从 git log 中获取。 |
git revert <commit_hash> |
安全撤销。创建一个新的提交,该提交的内容与指定提交的修改相反,从而“撤销”那次提交的更改。这是公共分支(如 main)上推荐的撤销方法,因为它不会重写历史。 |
五、 远程协作
与团队其他成员共享代码。
| 命令 | 解释 |
|---|---|
git remote -v |
查看已配置的远程仓库及其 URL。-v 显示详细信息。 |
git remote add <name> <url> |
添加一个新的远程仓库,并为其起一个简称(如 origin)。 |
git fetch <remote> |
从远程仓库下载所有新的分支和数据到你的本地仓库,但不会自动合并到你的工作文件中。这是一个安全的操作。 |
git pull <remote> <branch> |
git fetch + git merge 的组合。从远程仓库拉取指定分支的最新更改,并立即合并到当前本地分支。 |
git push <remote> <branch> |
将本地分支的提交上传到远程仓库。 |
git push -u <remote> <branch> |
第一次推送分支时使用 -u (或 --set-upstream) 选项,它会建立本地分支与远程分支的跟踪关系,之后可以直接使用 git push。 |
git branch -r |
查看所有远程分支。 |
git branch -a |
查看所有本地和远程分支。 |
六、 高级与实用命令
| 命令 | 解释 |
|---|---|
git stash |
将当前工作目录和暂存区的修改临时保存起来,让你有一个干净的工作区去处理其他事情(如切换分支)。修改被保存在一个“堆栈”中。 |
git stash pop |
应用最近一次储藏(stash)的修改,并将其从储藏堆栈中移除。 |
git stash list |
列出所有储藏条目。 |
git tag <tag_name> |
为当前提交创建一个轻量级标签(通常用于版本发布,如 v1.0.0)。 |
git tag -a <tag_name> -m "Message" |
创建一个带注解的标签,包含更多信息。 |
git push <remote> --tags |
将所有本地标签推送到远程仓库。 |
.gitignore |
(这是一个文件,不是命令) 创建一个名为 .gitignore 的文件,在其中列出你希望 Git 忽略的文件和目录模式(如 log/, *.tmp, node_modules/)。 |
总结工作流示例
一个典型的日常 Git 工作流如下:
# 1. 开始新功能前,确保在主分支上是最新的
git switch main
git pull origin main
# 2. 为新功能创建一个分支
git switch -c feature/awesome-new-feature
# ...(编写代码,修改文件)...
# 3. 检查修改了哪些文件
git status
# 4. 查看具体修改了什么内容
git diff
# 5. 将改动添加到暂存区
git add .
# 6. 提交到本地仓库
git commit -m "Implement the awesome new feature"
# 7. 推送到远程仓库(首次推送需要 -u)
git push -u origin feature/awesome-new-feature
# (然后在 GitHub/GitLab 上创建 Pull/Merge Request)
# 8. 功能合并后,回到主分支并拉取最新代码
git switch main
git pull origin main
# 9. 删除已合并的本地特性分支
git branch -d feature/awesome-new-feature
好的,在之前的基础上,我再补充一些更高级和实用的 Git 命令,这些命令在日常开发和问题排查中非常有用。
七、 历史查看与比较进阶
这些命令帮助你更精细地查看项目历史和分析改动。
| 命令 | 解释 |
|---|---|
git log -p |
显示提交历史的补丁(diff)信息,可以看到每次提交具体修改了哪些内容。 |
git log --stat |
显示提交历史的简要统计信息,包括哪些文件被修改,以及添加/删除了多少行。 |
git log --oneline --graph --all |
以图形化方式显示所有分支的提交历史,让你对整个仓库的结构一目了然。 |
git show <commit_hash> |
显示某次特定提交的详细信息,包括提交元数据和内容差异。 |
git blame <file> |
逐行显示指定文件,并标注每一行最后是由谁在哪个提交中修改的。用于追溯代码来源。 |
git diff <commit1> <commit2> |
比较两次提交之间的差异。 |
git diff <branch1>..<branch2> |
比较两个分支最新提交之间的差异。 |
git diff <branch1>...<branch2> |
比较两个分支从共同祖先分叉点开始的差异,这在查看 Pull Request 的改动时特别有用。 |
git shortlog |
汇总提交日志,按作者分组显示提交信息,用于生成贡献者列表。 |
八、 提交历史重写(谨慎使用)
这些命令会修改提交历史,主要用于在推送前整理本地提交。对已推送到公共仓库的提交使用这些命令是极其危险的,因为它会强制其他人解决冲突。
| 命令 | 解释 |
|---|---|
git commit --amend |
修改最后一次提交。它可以让你:1) 将新的更改追加到上次提交;2) 修改上次提交的提交信息。 |
git rebase -i <base_branch> |
交互式变基。这是一个非常强大的工具,可以: - 重新排序提交 - 将多个提交压缩(squash) 成一个 - 编辑某个提交的内容 - 删除提交 - 拆分提交 常用于在合并到主分支前清理自己的分支历史。 |
git rebase <base_branch> |
变基。将当前分支的提交“移植”到目标分支(如 main)的最新提交之后,从而形成一条线性的历史。与 merge 不同,它不会产生合并提交。 |
九、 问题排查与调试
| 命令 | 解释 |
|---|---|
git bisect start |
启动一个二分查找过程,用于快速定位引入 bug 的提交。你需要告诉 Git 一个“好”的提交(没有 bug)和一个“坏”的提交(有 bug),Git 会自动在中间切换,让你测试,直到找到第一个引入 bug 的提交。 |
git bisect good <commit> |
标记当前提交为“好”。 |
git bisect bad <commit> |
标记当前提交为“坏”。 |
git bisect reset |
结束二分查找,回到开始前的状态。 |
git reflog |
救命命令。显示 HEAD 和分支引用的移动历史(包括被 reset 或 rebase 删除的提交)。如果你不小心误操作丢失了提交,可以通过 reflog 找到提交哈希并恢复它。 |
十、 子模块与工作树
用于管理复杂项目结构。
| 命令 | 解释 |
|---|---|
git submodule add <repo_url> <path> |
将一个 Git 仓库作为子模块添加到当前项目中。 |
git submodule update --init --recursive |
克隆主项目后,初始化并更新所有子模块。 |
git worktree add <path> <branch> |
为同一个仓库创建另一个链接的工作目录。允许你同时在多个分支上工作,而无需来回切换。非常适合同时处理一个项目的多个功能或修复。 |
十一、 配置与别名
让 Git 更符合你的使用习惯。
| 命令 | 解释 |
|---|---|
git config --global alias.<alias> <command> |
为 Git 命令创建别名,简化输入。 例如: git config --global alias.co checkout -> 之后可以用 git cogit config --global alias.l "log --oneline --graph --all" -> 之后可以用 git l
|
git config --global core.editor "code --wait" |
设置 VS Code 作为 Git 的默认文本编辑器(用于提交信息等)。 |
十二、 文件操作
| 命令 | 解释 |
|---|---|
git rm <file> |
从工作目录和 Git 仓库中删除文件,并暂存这个删除操作。 |
git rm --cached <file> |
仅从 Git 仓库的暂存区中删除文件(取消跟踪),但保留在工作目录中。常用于当你忘记将文件添加到 .gitignore 时。 |
git mv <old_file> <new_file> |
移动或重命名文件,并暂存这个操作。Git 能更好地跟踪文件的历史。 |
高级工作流示例
1. 使用 git commit --amend:
# 提交后发现漏了一个文件,或者提交信息写错了
git add forgotten_file.txt
git commit --amend -m "New corrected commit message"
# 这会替换上一次的提交,不会产生新的提交记录
2. 使用 git rebase -i 压缩提交:
# 假设你最近有3次提交,想合并成1个清晰的提交
git rebase -i HEAD~3
# 在打开的编辑器中,将后两次提交前面的 'pick' 改为 'squash' 或 's'
# 保存退出后,Git会让你编辑合并后的新提交信息
3. 使用 reflog 恢复误删的提交:
# 不小心用 `git reset --hard` 删除了一个提交
git reflog
# 找到删除前的那个提交的哈希值(例如 abc123f)
git reset --hard abc123f
# 你的提交就恢复了!
掌握这些补充命令将使你从一个 Git 基础用户升级为一个高效、能处理复杂场景的 Git 高手。记住,涉及重写历史的命令在共享分支上要格外小心!