第2章:Git基础入门:Git的安装与配置,工作区、暂存区、仓库的概念

好,咱们正式开始动手了。

上一章聊了版本管理的必要性,也提到了Git这个工具。这一章,咱们就把它装起来,把环境配好,再把Git最核心的三个概念——工作区、暂存区、仓库——彻底搞清楚。

这三个概念,说白了就是Git的“三板斧”。你搞懂了它们,后面学分支、学合并,都会顺风顺水。我当年刚接触Git时,就是没搞明白暂存区是干嘛的,结果提交代码时总丢三落四。嗯,咱们今天一次性把它理清。

2.1 Git的安装

安装Git其实很简单,不同操作系统略有差异。我分别说一下。

2.1.1 Windows系统

去Git官网下载安装包,或者用国内镜像也行。安装时一路默认选项就好,但有几个地方我建议你注意一下:

  • 选择默认编辑器:我习惯选Vim,但如果你不熟悉Vim,选Notepad++或VS Code都行。别选Vim又不会用,到时候提交信息卡住了,你会很崩溃的。
  • 调整PATH环境变量:选“Git from the command line and also from 3rd-party software”。这样你在CMD或PowerShell里都能直接用git命令。
  • 换行符转换:选“Checkout Windows-style, commit Unix-style line endings”。这个很重要,我在项目中遇到过因为换行符不一致导致整个团队代码diff乱七八糟的情况。Windows用CRLF,Linux用LF,Git帮你自动转换,省心很多。

2.1.2 macOS系统

最简单的方法:打开终端,输入 git --version。如果没装,系统会弹窗提示你安装Xcode Command Line Tools,点确定就行。或者用Homebrew:

brew install git

2.1.3 Linux系统

不同发行版命令不一样,但都很直接:

# Ubuntu / Debian
sudo apt-get install git

# CentOS / RHEL
sudo yum install git

# Fedora
sudo dnf install git

装完之后,验证一下:

git --version

看到版本号,就说明装好了。

2.2 Git的配置

装好之后,第一件事就是配置你的身份信息。为什么?因为每次提交代码,Git都会记录是谁提交的。你想想看,如果团队里所有人都显示“Unknown”,那版本管理还有什么意义?

2.2.1 配置用户名和邮箱

git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

这里用了 --global 参数,意思是全局生效。也就是说,这台机器上所有仓库默认都用这个身份。我个人习惯是,公司电脑用公司邮箱,个人电脑用个人邮箱。如果你有特殊需求,可以在某个仓库里单独配置(去掉 --global 就行)。

2.2.2 配置默认分支名

从Git 2.28版本开始,你可以设置默认分支名。以前默认是 master,现在很多团队改成了 main。我建议你也改一下:

git config --global init.defaultBranch main

2.2.3 查看配置

想知道当前配置了哪些内容?用这个命令:

git config --list

它会列出所有配置项。如果某个配置有多个值(比如全局和局部冲突),后面的会覆盖前面的。

小技巧:配置完用户名和邮箱后,可以用 git config user.name 单独查看某个配置项的值。我经常用这个来确认当前仓库用的是哪个身份。

2.3 工作区、暂存区、仓库的概念

好,接下来是本章的重头戏。这三个概念,是Git最核心的设计思想。你理解了它们,就理解了Git的一半。

2.3.1 工作区(Working Directory)

工作区,就是你电脑上能看到的那个文件夹。你在里面写代码、改文件、删文件,所有操作都是直接作用于工作区。

举个例子:你打开STM32的工程目录,里面那些 .c.h 文件,就是工作区的内容。你修改了 motor_control.c,这个修改就在工作区里。

工作区的特点:你改了什么,Git还不知道。它只是默默地看着你改,但不会记录任何版本信息。

2.3.2 暂存区(Staging Area / Index)

暂存区,是Git里一个很巧妙的设计。它是一个中间区域,用来存放你“准备提交”的修改。

为什么要搞这么个东西?我举个例子你就明白了。

假设你同时改了三个文件:main.cmotor.cuart.c。但你想把 main.cmotor.c 作为一个提交,uart.c 作为另一个提交。如果没有暂存区,你只能一次把所有修改都提交,或者靠复制文件这种笨办法。

有了暂存区,你可以先把 main.cmotor.c 添加到暂存区,提交一次;再把 uart.c 添加到暂存区,再提交一次。完美分开。

命令就是:

git add main.c motor.c   # 添加到暂存区
git commit -m "实现了电机控制逻辑"

git add uart.c            # 再添加另一个文件
git commit -m "添加了串口通信功能"
核心理解:暂存区就像是一个“购物车”。你在工作区(超市)里挑好了商品(修改),先放到购物车(暂存区)里,最后到收银台(仓库)统一结账(提交)。

2.3.3 仓库(Repository / .git目录)

仓库,就是Git真正保存版本历史的地方。它藏在你的项目目录下的 .git 文件夹里。这个文件夹包含了所有提交记录、分支信息、标签等等。

你平时用 git log 看到的历史记录,就是从仓库里读出来的。你执行 git commit 时,就是把暂存区的内容打包成一个快照,存到仓库里。

仓库的特点:它是完整的、分布式的。每个开发者电脑上都有一个完整的仓库副本。这就是Git比SVN厉害的地方——即使服务器挂了,你本地还有完整的历史。

2.3.4 三者的关系

用一个流程图来说明它们的关系:

工作区  ----git add---->  暂存区  ----git commit---->  仓库
   |                           |                          |
   |  修改文件                  |  可以撤销添加            |  保存所有版本
   |  新建文件                  |  可以查看差异            |  可以回滚
   |  删除文件                  |                          |
   +--- git checkout  ----+                          |
   +--------------------------- git reset --hard ----------+

我再补充几个常用命令,帮你理解这三个区域:

  • git status:查看工作区和暂存区的状态。红色表示工作区有修改但没添加到暂存区,绿色表示已添加到暂存区但还没提交。
  • git diff:查看工作区和暂存区的差异。不加参数时,比较的是工作区和暂存区。
  • git diff --staged:查看暂存区和仓库(最近一次提交)的差异。
注意git checkout -- <file> 这个命令会丢弃工作区的修改,用暂存区的内容覆盖它。我曾经在项目里不小心用这个命令覆盖了写了一整天的代码……嗯,从那以后我每次用之前都会先 git status 确认一下。

2.4 动手实践:初始化第一个仓库

光说不练假把式。咱们现在动手创建一个仓库,把刚才的概念走一遍。

# 1. 创建一个新目录
mkdir curtain_motor_project
cd curtain_motor_project

# 2. 初始化Git仓库
git init
# 输出:Initialized empty Git repository in /path/curtain_motor_project/.git/

# 3. 创建一个文件
echo "# 窗帘电机控制程序" > README.md

# 4. 查看状态
git status
# 输出:Untracked files: README.md

# 5. 添加到暂存区
git add README.md

# 6. 再次查看状态
git status
# 输出:Changes to be committed: new file: README.md

# 7. 提交到仓库
git commit -m "初始化项目,添加README文件"

# 8. 查看提交历史
git log
# 输出:commit xxxxx... Author: ... Date: ... 初始化项目,添加README文件

看到了吗?每一步都对应着三个区域之间的流转。你亲手走一遍,比看十遍文章都管用。

我的习惯:每次提交前,我都会用 git statusgit diff --staged 确认一下要提交的内容。这样能避免把调试代码或者临时文件提交上去。尤其是嵌入式开发,那些 .o.hex 文件,千万别提交到仓库里。

2.5 本章小结

这一章咱们干了三件事:

  1. 安装了Git:Windows、macOS、Linux三种系统的方法都说了。
  2. 配置了Git:用户名、邮箱、默认分支名,这些都是基础中的基础。
  3. 理解了三个核心概念:工作区是你写代码的地方,暂存区是你准备提交的缓冲区,仓库是保存所有版本历史的地方。

下一章,咱们会深入讲 git addgit commit 的更多用法,以及如何写出好的提交信息。嗯,提交信息怎么写,这里面的门道可不少。到时候我把我踩过的坑都告诉你。

先把这个仓库留着,后面咱们还要用它做实验。