前言:为什么需要版本控制?

在开发过程中,大家或多或少都有过这样的经历:"昨天写的代码更好......"、"我想回到添加这个功能之前的状态"、"同事修改的部分和我修改的部分冲突了,真是一团糟"。在文件名后面加上日期,或者添加"最终版"、"真的最终版"、"真的真的最终版"这样的后缀,大家应该都有过这样的经历吧?

为了解决这些问题,版本控制系统(Version Control System, VCS)应运而生。而目前全球开发者使用最广泛的版本控制系统,正是我们今天要学习的Git

Git于2005年由Linus Torvalds为Linux内核开发而创建。最初只在Linux开发团队内部使用,但凭借其出色的性能和灵活性,现已成为软件开发的标准工具。从初创公司到大型企业,从个人开发者到数千人参与的开源项目,没有Git很难想象现代软件开发。

在这篇文章中,我们将从Git的基本概念开始,逐步学习可以直接用于实际工作的命令。即使是第一次接触Git的朋友,跟着这篇文章也能开始基本的版本控制。

1. 安装Git

要使用Git,首先需要在电脑上安装它。不同操作系统的安装方法略有不同,请根据自己的环境选择合适的方法。

1.1 在Windows上安装

Windows用户可以从Git官网下载安装文件,这是最简单的方法。

  1. 访问git-scm.com/download/win
  2. 下载会自动开始。如果没有开始,请点击"Click here to download manually"。
  3. 运行下载的安装文件。
  4. 安装过程中大部分选项可以保持默认值。
  5. 不过,在"Adjusting your PATH environment"步骤中,建议选择"Git from the command line and also from 3rd-party software"。

安装完成后,在开始菜单中找到"Git Bash"并运行。在这个终端中可以使用Git命令。

1.2 在macOS上安装

在macOS上有多种方法可以安装Git。

方法1:使用Xcode Command Line Tools

打开终端,输入以下命令。

xcode-select --install

弹出窗口出现后点击"安装"。包括Git在内的开发工具会一起安装。

方法2:使用Homebrew

如果已安装Homebrew,更简单。

brew install git

1.3 在Linux上安装

根据Linux发行版使用对应的包管理器即可。

Ubuntu/Debian系列:

sudo apt update
sudo apt install git

Fedora/CentOS/RHEL系列:

sudo dnf install git
# 或者在旧版本中
sudo yum install git

1.4 验证安装

无论什么操作系统,安装完成后可以在终端中使用以下命令验证。

git --version

如果输出类似git version 2.x.x的版本号,说明安装成功。

2. Git初始配置

首次安装Git后,需要进行一些基本配置。这些配置只需设置一次,之后随时可以修改。

2.1 设置用户信息

Git在每次提交代码时都会记录提交者信息。因此首先需要设置你的姓名和邮箱。

# 设置用户名
git config --global user.name "张三"

# 设置邮箱
git config --global user.email "zhangsan@example.com"

使用--global选项后,这台电脑上的所有Git仓库都会使用这个配置。如果想在特定项目中使用不同的信息,可以在该项目文件夹中不加--global运行相同命令。

2.2 设置默认编辑器

Git在编写提交信息时会打开文本编辑器。默认是Vim,如果不熟悉Vim可以更换为其他编辑器。

# 使用VS Code
git config --global core.editor "code --wait"

# 使用Notepad++ (Windows)
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

# 使用nano (Linux/macOS)
git config --global core.editor "nano"

2.3 查看配置

要查看当前配置,可以使用以下命令。

# 查看所有配置
git config --list

# 查看特定配置
git config user.name
git config user.email

3. 理解Git的核心概念

要正确使用Git,需要理解几个核心概念。一开始可能有点困惑,但理解了这些概念后,Git的所有命令都会变得合乎逻辑。

3.1 三个区域:工作目录、暂存区、仓库

Git通过三个区域管理文件。

工作目录(Working Directory)

实际编辑文件的空间。就是你编写和修改代码的那个文件夹。这个区域的文件可以是Git"已跟踪(tracked)"或"未跟踪(untracked)"的。

暂存区(Staging Area, Index)

准备下次提交要包含的文件的空间。就像标记"这些文件的当前状态要保存"一样。使用git add命令将文件添加到这个区域。

仓库(Repository)

Git存储所有版本信息的空间。项目文件夹中的.git文件夹就是这个仓库。使用git commit命令将暂存的文件永久记录到这里。

打个简单的比方,就像制作相册的过程。工作目录是相机胶卷中的所有照片,暂存区是"选择要放入这次相册的照片",仓库是实际冲洗出来贴进相册的照片。

3.2 文件状态

在Git中,文件可以有以下状态。

  • Untracked:Git尚未跟踪的新文件
  • Staged:已添加到暂存区的文件
  • Modified:已修改但尚未暂存的文件
  • Committed (Unmodified):已安全保存到仓库的文件

4. 掌握基本命令

现在让我们实际使用Git。我们来逐一了解最常用的基本命令。

4.1 git init - 创建仓库

开始新项目时首先执行的命令。

# 创建新文件夹并初始化Git仓库
mkdir my-project
cd my-project
git init

执行这个命令后,当前文件夹会生成一个名为.git的隐藏文件夹。这个文件夹中存储着Git版本管理所需的所有信息。

4.2 git status - 查看状态

查看当前工作目录和暂存区的状态。这是使用Git时最常执行的命令。

git status

通过输出结果可以一目了然地看到哪些文件被修改了,哪些文件被暂存了,哪些文件未被跟踪。

4.3 git add - 暂存

将文件添加到暂存区。

# 只暂存特定文件
git add index.html

# 暂存多个文件
git add index.html style.css script.js

# 暂存当前文件夹的所有更改
git add .

# 只暂存特定扩展名的文件
git add *.js

提示:git add .很方便,但可能会不小心暂存不需要的文件。提交前务必用git status确认暂存的文件。

4.4 git commit - 保存更改

将暂存的文件记录到仓库。

# 带提交信息提交
git commit -m "实现登录功能"

# 一次性暂存并提交(仅限已跟踪的文件)
git commit -am "修复bug"

编写好的提交信息

提交信息在以后查看变更历史时非常重要。建议遵循以下规则。

  • 清楚地描述做了什么更改
  • 使用现在时(例如:"Add feature"或"添加功能")
  • 第一行控制在50个字符以内
  • 如果需要,可以空一行后添加详细说明

4.5 git log - 查看提交历史

查看迄今为止的提交历史。

# 查看基本日志
git log

# 简洁地显示为一行
git log --oneline

# 用图形显示分支结构
git log --oneline --graph

# 只显示最近5次提交
git log -5

# 查看特定文件的变更历史
git log -- index.html

4.6 git diff - 查看更改内容

查看文件的具体更改内容。

# 比较工作目录和暂存区
git diff

# 比较暂存区和最后一次提交
git diff --staged

# 比较两次提交之间的差异
git diff abc123 def456

# 只比较特定文件
git diff index.html

5. 配置.gitignore文件

项目中有些文件不应该用Git管理。例如构建产物、日志文件、包含API密钥的配置文件、node_modules等依赖文件夹。.gitignore文件就是用来配置忽略这些文件的。

5.1 创建.gitignore文件

在项目根目录创建.gitignore文件,写入要忽略的文件或文件夹的模式。

# 操作系统相关文件
.DS_Store
Thumbs.db

# 编辑器/IDE配置文件
.vscode/
.idea/
*.swp

# 依赖文件夹
node_modules/
vendor/

# 构建产物
dist/
build/
*.min.js
*.min.css

# 日志文件
*.log
logs/

# 环境配置文件(敏感信息)
.env
.env.local
config/secrets.yml

# 缓存
.cache/
__pycache__/
*.pyc

5.2 .gitignore模式语法

  • #开头的行是注释
  • *匹配0个或多个字符
  • ?精确匹配1个字符
  • /开头表示只在当前文件夹
  • /结尾表示是文件夹
  • !开头表示例外处理(不忽略)
# 忽略所有.txt文件
*.txt

# 但跟踪important.txt
!important.txt

# 只忽略根目录的TODO文件(跟踪子文件夹的TODO)
/TODO

# 忽略整个build文件夹
build/

# 只忽略doc文件夹内的.txt文件
doc/**/*.txt

5.3 忽略已被跟踪的文件

如果添加到.gitignore后文件仍然被跟踪,那是因为Git已经开始跟踪该文件了。这种情况需要删除缓存。

# 停止跟踪特定文件(不删除文件)
git rm --cached config.json

# 停止跟踪文件夹
git rm -r --cached node_modules/

# 提交更改
git commit -m "Add gitignore and remove tracked files"

6. 撤销错误操作

Git最强大的功能之一是可以撤销错误操作。根据情况使用不同的命令。

6.1 取消暂存

如果不小心暂存了文件,可以用以下命令取消。

# 取消暂存特定文件
git restore --staged index.html

# 取消暂存所有文件
git restore --staged .

6.2 撤销文件修改

如果想放弃工作目录的更改并恢复到最后一次提交的状态:

# 将特定文件恢复到最后一次提交的状态
git restore index.html

# 注意:这个命令会完全删除更改!
# 未保存的工作将无法恢复。

6.3 git reset - 撤销提交

git reset是取消提交的命令。有三种模式。

# --soft:只取消提交,更改保留在暂存状态
git reset --soft HEAD~1

# --mixed(默认):取消提交,更改保留在工作目录
git reset HEAD~1

# --hard:取消提交,更改也完全删除(注意!)
git reset --hard HEAD~1

HEAD~1表示"当前提交的前1步"。HEAD~3表示前3步的提交。

注意:git reset --hard会完全删除更改。对已与他人共享的提交使用reset可能会导致大问题,所以只在本地使用。

6.4 git revert - 安全地撤销

git revert创建一个新提交来取消特定提交的更改。可以安全地用于撤销已共享的提交。

# 撤销特定提交
git revert abc123

# 撤销最近一次提交
git revert HEAD

与reset不同,revert不会删除历史而是添加新提交,因此在协作环境中更安全。

7. 实战示例和技巧

7.1 典型的Git工作流程

让我们通过示例来看看实际开发中如何使用Git。

# 1. 开始新项目
mkdir my-website
cd my-website
git init

# 2. 创建文件并首次提交
echo "<h1>Hello World</h1>" > index.html
git add index.html
git commit -m "项目初始化:创建index.html"

# 3. 功能开发
# (修改文件...)
git status  # 确认更改
git diff    # 查看具体更改内容
git add .
git commit -m "添加头部导航"

# 4. 犯错时
git log --oneline  # 确认历史
git reset --soft HEAD~1  # 取消提交重新工作
# (修改后)
git add .
git commit -m "添加头部导航(修复bug)"

7.2 设置有用的Git别名(Alias)

可以将常用的长命令缩短使用。

# 设置别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --oneline --graph --all"

# 使用示例
git st      # 等同于git status
git lg      # 漂亮的日志图形

7.3 常见错误及解决方法

写错提交信息时:

git commit --amend -m "修改后的提交信息"

忘记添加文件就提交了:

git add forgotten-file.txt
git commit --amend --no-edit

在错误的分支上工作了:

# 临时保存当前更改
git stash
# 切换到正确的分支
git checkout correct-branch
# 恢复更改
git stash pop

结语

在这篇文章中,我们学习了Git的基础知识。从Git安装到基本命令、.gitignore配置以及撤销错误操作的方法。一开始可能因为命令多而感到困惑,但实际使用后很快就能熟练掌握。

仅凭今天学到的内容,你就可以独自管理项目的版本了。但Git的真正力量在于协作。在下一篇文章中,我们将学习如何使用GitHub进行远程仓库管理和协作。

Git一开始可能感觉很难,但一旦熟悉后,它是能大大提高开发效率的必备工具。请把今天学到的命令应用到实际项目中,如果有不清楚的地方,可以使用git help [命令]查看帮助。祝你与Git一起享受愉快的开发之旅!