git命令详解与使用指南

好的,这是一份非常全面的 Git 命令指南,涵盖了从入门到进阶的常用命令,并对每条命令的作用进行了详细解释。

Git 命令核心概念

在开始之前,理解 Git 的三个主要工作区域至关重要:

  1. 工作目录 (Working Directory):你正在查看和编辑的本地文件。
  2. 暂存区 (Staging Area / Index):一个准备下次提交的文件列表。它像是购物车,你把需要的改动放进去。
  3. 本地仓库 (Local Repository):存储项目元数据和对象数据库的地方,位于你的 .git 目录中。HEAD 是一个指向当前所在分支的指针。

一、 初始化和配置

这些命令通常只在开始一个新项目或配置新环境时使用一次。

命令 解释
git init 在当前目录创建一个新的 Git 仓库。这会创建一个 .git 子目录,其中包含所有必需的仓库文件。
git clone <repo_url> 克隆(下载)一个远程仓库到本地。它会自动创建一个与远程仓库同名的目录,并初始化 .git 目录,拉取所有数据,并检出默认分支(通常是 mainmaster)的最新版本。
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 和分支引用的移动历史(包括被 resetrebase 删除的提交)。如果你不小心误操作丢失了提交,可以通过 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 co
git 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 高手。记住,涉及重写历史的命令在共享分支上要格外小心!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容