Git基础 - 版本控制入门
Git与GitHub协作指南系列第1篇
前言:为什么需要版本控制?
在开发过程中,大家或多或少都有过这样的经历:"昨天写的代码更好......"、"我想回到添加这个功能之前的状态"、"同事修改的部分和我修改的部分冲突了,真是一团糟"。在文件名后面加上日期,或者添加"最终版"、"真的最终版"、"真的真的最终版"这样的后缀,大家应该都有过这样的经历吧?
为了解决这些问题,版本控制系统(Version Control System, VCS)应运而生。而目前全球开发者使用最广泛的版本控制系统,正是我们今天要学习的Git。
Git于2005年由Linus Torvalds为Linux内核开发而创建。最初只在Linux开发团队内部使用,但凭借其出色的性能和灵活性,现已成为软件开发的标准工具。从初创公司到大型企业,从个人开发者到数千人参与的开源项目,没有Git很难想象现代软件开发。
在这篇文章中,我们将从Git的基本概念开始,逐步学习可以直接用于实际工作的命令。即使是第一次接触Git的朋友,跟着这篇文章也能开始基本的版本控制。
1. 安装Git
要使用Git,首先需要在电脑上安装它。不同操作系统的安装方法略有不同,请根据自己的环境选择合适的方法。
1.1 在Windows上安装
Windows用户可以从Git官网下载安装文件,这是最简单的方法。
- 访问git-scm.com/download/win。
- 下载会自动开始。如果没有开始,请点击"Click here to download manually"。
- 运行下载的安装文件。
- 安装过程中大部分选项可以保持默认值。
- 不过,在"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一起享受愉快的开发之旅!