<摘要>
本指南从纯粹实用的角度,系统解析了 Git Bash 中 Git 命令的核心使用场景与方法。内容围绕开发工作流展开:从初始配置 (git config
)、仓库初始化与克隆 (git init
, git clone
),到日常的修改、暂存与提交循环 (git status
, git add
, git commit
, git diff
)。重点阐述了分支管理 (git branch
, git switch
, git checkout
) 与合并策略 (git merge
, git rebase
) 的应用与选择。详细说明了与远程仓库协作的关键命令 (git remote
, git push
, git fetch
, git pull
)。提供了多种撤销更改的策略 (git restore
, git reset
, git revert
),并强调了安全操作的重要性。最后,介绍了一些实用技巧,如临时储藏工作 (git stash
) 和配置忽略文件 (.gitignore
)。全文旨在作为一份即查即用的手册,帮助开发者高效、安全地使用 Git 进行版本控制和团队协作。
解析:Git Bash 中 Git 命令的实用主义指南
本解析旨在成为一份即查即用的手册,我们将命令按照开发工作流进行分类,并通过场景化的方式解释其用法。
一、起步与配置:打好基础
在开始任何工作之前,需要先配置好你的工具。这部分命令通常只需执行一次。
使用场景:在新电脑上首次安装 Git 后,或在公司配置符合规范的 Git 环境。
-
git config
- 配置用户信息-
为什么需要:你的每一次提交都会记录这些信息,这是标识提交者身份的关键。
-
怎么用 :
bash# 设置全局用户名和邮箱(适用于本机所有仓库) git config --global user.name "Your Name" git config --global user.email "your.email@example.com" # 如果某个特定项目想用不同的信息,可以在项目目录下去掉 --global 选项设置 git config user.name "Your Work Name" # 查看所有配置 git config --list
-
-
git init
- 初始化新仓库-
使用场景:你本地有一个项目文件夹,想开始用 Git 管理它的版本。
-
怎么用 :
bashcd /path/to/your/project # 进入项目文件夹 git init # 初始化
-
效果 :该命令会在当前目录创建一个名为
.git
的子目录,所有 Git 需要的数据和资源都存放在这里。
-
-
git clone
- 克隆现有仓库-
使用场景:你需要获取一份远程仓库(如 GitHub、GitLab 上的项目)的完整拷贝到本地。
-
怎么用 :
bash# 克隆一个远程仓库 git clone https://github.com/username/repository.git # 克隆到指定目录 git clone https://github.com/username/repository.git my-project-name
-
效果 :这命令会做三件事:1. 在当前目录创建一个
my-project-name
文件夹。2. 初始化一个.git
目录。3. 拉取远程仓库的所有数据。4. 自动创建一个跟踪远程main
或master
分支的本地分支。
-
二、日常工作流:添加、提交与查看
这是你每天都会重复无数次的循环:修改代码 -> 暂存 -> 提交。
基本工作流图示:
git add git commit git push 工作目录 Working Directory 暂存区 Staging Area 本地仓库 Repository 远程仓库 Remote
-
git status
- 检查当前状态- 使用场景:任何时候你忘了自己在上一步做了什么,或者想知道哪些文件被修改了、哪些已暂存,首先就运行它。它是你最常用的"侦察兵"。
- 怎么用 :
git status
- 输出解读 :
Changes not staged for commit
: 表示你修改了文件,但还没有用git add
暂存它们。Changes to be committed
: 表示文件已暂存,等待提交。Untracked files
: 表示新创建的文件,Git 还没有开始跟踪。
-
git add
- 暂存更改-
使用场景:你想把文件的当前快照包含到下一次提交中。
-
怎么用 :
bash# 暂存一个特定文件 git add filename.html # 暂存当前目录下的所有更改(包括修改和新增文件,但不包括删除) git add . # 暂存所有已被 Git 跟踪的文件的更改(不包括新增的未跟踪文件) git add -u # 或者 git add --update
-
-
git commit
- 提交更改-
使用场景:你已完成一个逻辑完整的更改(例如修复了一个 bug、完成了一个小功能),想永久保存当前暂存区的快照。
-
怎么用 :
bash# 提交,并附带提交信息 git commit -m "Fix the login bug" # 更推荐的做法:直接打开编辑器编写详细的提交信息(第一行是摘要,空一行,然后是详细描述) git commit
-
黄金法则:一次提交只做一件事,提交信息要清晰明了。
-
-
git diff
- 查看差异-
使用场景 :在运行
git add
之前,你想精确地看看你到底修改了什么代码,而不是通过git status
只看文件名。 -
怎么用 :
bash# 查看工作目录和暂存区之间的差异(即:你修改了什么但还没 add) git diff # 查看暂存区和上一次提交之间的差异(即:你 add 了什么准备提交) git diff --staged
-
三、分支与合并:并行开发的利器
分支是 Git 的"杀手级"功能,它让你能安全地隔离开发。
-
git branch
- 管理分支-
使用场景:查看、创建或删除分支。
-
怎么用 :
bash# 列出所有本地分支,当前所在分支前有 * 号 git branch # 创建一个新分支 git branch new-feature # 删除一个已合并的分支(安全删除) git branch -d merged-branch # 强制删除一个未合并的分支(谨慎使用!) git branch -D unmerged-branch
-
-
git checkout
&git switch
- 切换分支-
使用场景:在不同的工作上下文之间切换。
-
怎么用 :
bash# 传统命令(功能较多,容易混淆) git checkout existing-branch # 更语义化的新命令(专用于切换分支) git switch existing-branch # 创建并立即切换到新分支 git switch -c new-feature # 等同于旧的 git checkout -b new-feature
-
-
git merge
- 合并分支-
使用场景 :当你完成
new-feature
分支的开发后,想将其成果合并回主分支(如main
)。 -
怎么用 :
bash# 1. 首先,切换到要合并到的目标分支(通常是主分支) git switch main # 2. 然后,将特性分支合并到当前分支 git merge new-feature
-
结果:如果合并顺利,Git 会创建一个新的"合并提交"(merge commit)。如果发生冲突,则需要手动解决。
-
-
git rebase
- 变基(高级操作)-
使用场景 :让你分支的提交历史看起来像是在主线的最新提交之后进行的,使历史更加线性、整洁。注意:Rebase 会重写历史,只适用于你本地尚未推送的分支。
-
怎么用 :
bash# 在 feature-branch 上执行 git rebase main
-
效果 :相当于把
feature-branch
分支上的工作成果"挪动"到main
分支的最新提交之后。
-
特性 | Merge |
Rebase |
---|---|---|
结果 | 生成一个新的合并提交,保留所有分支的历史 | 线性历史,好像工作是在主线基础上连续进行的 |
历史 | 更真实地反映了实际的开发过程 | 更整洁,但修改了历史 |
安全性 | 安全,适用于公共分支 | 风险高,不要 rebase 已经推送到远程的分支 |
四、与远程仓库协作:团队工作的核心
Git 是分布式的,远程仓库(如 GitHub)是团队交换代码的中心节点。
-
git remote
- 管理远程地址-
使用场景:查看或配置本地仓库与哪些远程仓库关联。
-
怎么用 :
bash# 查看远程仓库列表(通常默认的叫 origin) git remote -v # 添加一个新的远程仓库地址(常用于一个项目要推送到多个远程) git remote add upstream https://github.com/original/repo.git
-
-
git push
- 推送提交-
使用场景:你想将本地提交共享到远程仓库,让团队成员也能看到。
-
怎么用 :
bash# 将当前分支推送到远程仓库的对应分支(如果远程没有,则创建它) git push origin main # 第一次推送时,使用 -u 来建立跟踪关系,以后直接 git push 即可 git push -u origin main
-
-
git fetch
- 获取更新- 使用场景:你想看看其他人是否推送了新的提交,但还不想立即合并到你的工作区。这是一个"只查看,不合并"的安全操作。
- 怎么用 :
git fetch origin
- 效果 :它将远程仓库的最新数据(如
origin/main
)下载到本地,但你的本地分支(如main
)还停留在原地。
-
git pull
- 拉取并合并更新- 使用场景:你想获取远程的最新更改并立即将其合并到你的当前分支。这是最常用的更新命令。
- 怎么用 :
git pull origin
- 本质 :
git pull
=git fetch
+git merge
- 警告 :如果本地有未提交的更改,可能会产生冲突。推荐先
git stash
(见下文)再git pull
。
五、撤销与恢复:时光倒流
人难免犯错,Git 提供了强大的撤销功能。
-
git restore
- 恢复文件(Git 2.23+ 推荐)-
使用场景:你修改了一个文件,但想丢弃所有更改,恢复到上次提交的样子。
-
怎么用 :
bash# 丢弃工作目录中某个文件的修改(危险!不可撤销!) git restore filename.html # 将文件从暂存区挪回工作区(取消暂存) git restore --staged filename.html
-
-
git reset
- 重置提交(谨慎使用!)-
使用场景:你想撤销最近的提交。
-
怎么用 :
bash# 软重置:撤销提交,但保留更改内容在暂存区和工作目录 git reset --soft HEAD~1 # 混合重置(默认):撤销提交和暂存,但保留更改内容在工作目录 git reset --mixed HEAD~1 # 硬重置(非常危险!):彻底丢弃最近的提交和所有更改 git reset --hard HEAD~1
-
警告 :
--hard
重置会永久丢弃数据,仅用于本地分支。
-
-
git revert
- 反转提交(安全撤销)- 使用场景:你想撤销一个已经推送到远程的公共提交。它不是删除提交,而是创建一个新的提交来抵消旧提交的更改。
- 怎么用 :
git revert <commit-hash>
- 优点:不会重写历史,是团队协作中撤销更改的安全方式。
六、实用技巧与高级场景
-
git stash
- 暂存临时工作-
使用场景 :你正在
feature
分支上工作到一半,突然需要切到main
分支去修复一个紧急 bug。但你现在的修改还不构成一个提交。 -
怎么用 :
bash# 将当前工作目录和暂存区的修改保存到一个新的储藏堆栈 git stash # 完成其他工作后,回到这个分支,恢复储藏的内容 git stash pop # 恢复并删除储藏 # 或者 git stash apply # 恢复但不删除储藏
-
-
.gitignore
文件-
使用场景:你的项目中有一些文件(如日志、编译产物、本地配置文件、node_modules)永远不应该被提交到 Git。
-
怎么用 :在项目根目录创建一个名为
.gitignore
的文件,每一行写一个要忽略的文件模式。# 忽略所有 .log 文件 *.log # 忽略 node_modules 目录 node_modules/ # 但是不要忽略重要的 example.config 文件 !example.config
-