从零基础到团队协作 —— 掌握必备的版本控制技能
Git 是世界上最流行的版本控制系统,被全球 90% 以上的开发者使用。无论是个人项目还是团队协作,Git 都是必不可少的工具。
你知道吗? Linux 内核、Google、Microsoft、Facebook 等顶级科技公司的代码都使用 Git 进行管理!
你是否经历过这样的场景:
最终版.doc、最终版2.doc、绝对最终版.doc、真的最终版_v3.doc...
版本控制系统(Version Control System)可以记录文件的每一次修改,让你随时回到任何历史版本,查看修改记录,轻松与他人协作。
Git 是一个分布式版本控制系统,由 Linux 之父 Linus Torvalds 于 2005 年创建。
重要区别: Git 是工具,GitHub/Gitee 是使用 Git 工具的平台。就像 Word 是工具,Google Docs 是使用类似工具的在线平台。
首先,我们需要在电脑上安装 Git。根据你的操作系统选择对应的方法:
打开终端(Terminal),运行以下命令:
brew install git
或者安装 Xcode Command Line Tools 会自动包含 Git
Ubuntu/Debian 系统:
sudo apt install git
CentOS/Fedora 系统:
sudo yum install git
打开终端/命令提示符,输入以下命令检查 Git 是否安装成功:
git --version
安装完成后,需要告诉 Git 你是谁。这样在提交代码时,Git 就知道是谁做的修改。
替换成你的名字(可以使用中文):
git config --global user.name "张三"
替换成你的邮箱地址:
git config --global user.email "zhangsan@example.com"
确认配置是否正确:
git config --list
git log 的作者信息里user.email 去匹配你账号中已验证的邮箱,从而计入贡献并显示头像提示: --global 表示全局配置,对你电脑上的所有 Git 仓库都生效。如果只想对某个项目设置不同的用户信息,去掉 --global 即可。
Git 有三个重要的区域,理解它们是掌握 Git 的关键:
让我们通过实践来学习!打开终端/命令提示符,跟着下面的步骤操作:
请在电脑上创建一个新文件夹,然后按照步骤操作。
创建一个新文件夹并进入:
mkdir my-first-project
cd my-first-project
运行 git init 命令:
git init
🎉 恭喜!你现在有了一个 Git 仓库!
用你喜欢的编辑器创建一个 README.md 文件:
# 我的项目
这是我的第一个 Git 项目!
查看 Git 知道哪些文件被修改了:
git status
Git 发现了一个新文件 README.md,但还没有跟踪它。
使用 git add 命令将文件添加到暂存区:
git add README.md
💡 提示: 使用 git add . 可以添加所有修改的文件。
使用 git commit 将暂存区的内容保存到仓库:
git commit -m "首次提交:添加 README 文件"
你刚刚完成了 Git 的基本工作流程:修改 → 添加 → 提交。这个循环会在你使用 Git 时不断重复。
.gitignore 用来告诉 Git:哪些文件/目录不要被跟踪,从而避免把缓存、编译产物、密钥文件等误提交到仓库。
.env、密钥等敏感文件.py / .js / .tex 等)在项目根目录创建一个名为 .gitignore 的文件,并写入规则:
# 系统文件
.DS_Store
Thumbs.db
# 编辑器
.vscode/
.idea/
# Node / 前端构建产物
node_modules/
dist/
build/
# Python
__pycache__/
*.pyc
# 日志与环境变量
*.log
.env
规则提示:目录/ 表示忽略整个目录,*.log 表示忽略所有以 .log 结尾的文件。
检查某个文件是否会被忽略(输出会显示是哪条规则命中的):
git check-ignore -v path/to/file
如果某个文件/目录以前已经被提交过,那么即使你后来把它写进 .gitignore,Git 也会继续跟踪它。此时需要“取消跟踪但保留本地文件”:
git rm -r --cached node_modules/
git commit -m "停止跟踪已忽略文件"
当你已经有多次提交后,如果想“回到过去”,先想清楚目标:是只查看旧版本,还是要真的回退并继续开发。
先用一行模式查看提交历史(复制前面的短哈希即可):
git log --oneline
这会进入“分离头指针(detached HEAD)”状态,适合临时查看:
git switch --detach abc1234
看完回到当前分支(例如 main):
git switch main
这是协作/学习里最推荐的“回到过去并继续写”的方式:
git switch -c back-to-old abc1234
把当前分支指针“强行移回去”。如果你已经把提交分享给别人,协作时容易出问题。
git reset --hard abc1234
生成一个“反向提交”来撤销某次提交,协作场景更安全。
git revert abc1234
记忆法: 想“回去看看”用 switch --detach;想“从旧版本继续写”用 switch -c;协作时撤销提交优先用 revert。
这些是你在日常使用中最常遇到的 Git 命令:
| 命令 | 说明 |
|---|---|
git status | 查看当前文件状态 |
git add <file> | 将文件添加到暂存区 |
git add . | 添加所有修改的文件 |
git commit -m "消息" | 提交更改并添加说明 |
git log | 查看提交历史 |
git diff | 查看工作区的修改 |
git diff --staged | 查看暂存区的修改 |
git check-ignore -v <path> | 检查文件是否被 .gitignore 忽略(显示命中的规则) |
git rm -r --cached <path> | 取消跟踪但保留本地文件(配合 .gitignore) |
使用 git log --oneline 可以看到简洁的提交历史,每条记录只显示一行。
git log --oneline
分支是 Git 最强大的功能之一!它让你可以同时进行多个任务而不互相干扰。
学习如何创建、切换和合并分支:
创建一个新分支:
git branch feature-login
切换到新分支:
git checkout feature-login
创建并切换(快捷方式):
git checkout -b feature-login
查看所有分支:
git branch
合并分支到当前分支:
git merge feature-login
新命令: Git 2.23+ 引入了新命令 git switch 和 git restore,更清晰地分离了分支切换和文件恢复的功能。git switch = git checkout(切换分支)
远程仓库是存放在互联网或其他网络上的 Git 仓库,通常用于团队协作。
将本地仓库连接到远程仓库:
git remote add origin https://gitee.com/username/repo.git
将本地提交推送到远程:
git push -u origin main
获取远程仓库的更新:
git pull origin main
复制一个远程仓库到本地:
git clone https://gitee.com/username/repo.git
GitHub 和 Gitee 是最流行的 Git 代码托管平台,让团队协作变得简单。
在没有互联网的情况下,或者在公司内部网络中,你也可以和同事共享 Git 仓库!
如果你和同事在同一个局域网,可以使用共享文件夹的方式:
在共享文件夹中创建一个裸仓库(bare repository):
mkdir /shared/project.git
cd /shared/project.git
git init --bare
💡 什么是裸仓库? 裸仓库没有工作区,只用于共享,不能直接编辑文件。
同学 B 从共享文件夹克隆项目:
git clone /shared/project.git my-project
双方都可以进行 git push 和 git pull 操作:
git push origin main
git pull origin main
注意: 共享文件夹方式需要文件系统支持。在 Windows 上可以使用网络共享,在 macOS/Linux 上可以使用 NFS 或 SMB。
当两个人修改了同一文件的同一行时,Git 无法自动合并,需要手动解决冲突。
使用 git status 查看哪些文件有冲突:
用编辑器打开文件,找到冲突标记 <<<<<<< 和 >>>>>>>
删除冲突标记,保留你想要的代码:
修改前:
<<<<<<< HEAD
print("你好")
=======
print("Hello")
>>>>>>> branch
修改后:
解决冲突
print("你好,世界!")
保存文件,添加并提交:
git add hello.py
git commit
预防冲突: 经常拉取更新(git pull),保持小而频繁的提交,及时和团队成员沟通,可以减少冲突的发生。
让我们模拟一个真实的团队协作场景!请找一个同学一起完成这个练习。
创建一个简单的网页项目,两名同学分别负责不同的部分,然后合并代码。
mkdir team-project
cd team-project
git init
创建一个基础的 HTML 文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>团队项目</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>欢迎来到我们的项目</h1>
<p>这是团队合作的结果!</p>
<div id="content"></div>
<script src="app.js"</script>
</body>
</html>
git add .
git commit -m "初始提交:基础 HTML 结构"
将项目文件夹或仓库地址分享给同学 B:
# 方式1:使用 U 盘或共享文件夹
# 直接把文件夹拷贝给同学
# 方式2:推送到 Gitee
git remote add origin https://gitee.com/xxx/team-project.git
git push -u origin main
git clone https://gitee.com/xxx/team-project.git
cd team-project
git checkout -b feature-style
body {
font-family: Arial, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
h1 {
color: white;
text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
}
git add style.css
git commit -m "添加样式文件"
git push -u origin feature-style
git pull origin feature-style
git merge feature-style
git push origin main
现在你可以打开浏览器,查看 index.html 文件,看到你们合作的成果!
使用 git commit --amend 修改最后一次提交信息:
git commit --amend -m "新的提交信息"
使用 git restore 恢复文件到上次提交的状态:
git restore file.txt
使用 git log 的各种选项:
git log --oneline --graph --all
使用 git help 查看帮助:
git help commit
遵循这些惯例,可以让你的 Git 使用体验更愉快:
# 常用的 .gitignore 示例
# Python
__pycache__/
*.py[cod]
.venv/
# Node.js
node_modules/
package-lock.json
# IDE
.vscode/
.idea/
# 系统文件
.DS_Store
Thumbs.db
| 命令 | 说明 |
|---|---|
| 🚀 初始化与配置 | |
git init | 初始化仓库 |
git clone <url> | 克隆远程仓库 |
git config --global user.name "xxx" | 设置用户名 |
git config --global user.email "xxx" | 设置邮箱 |
| 📝 日常操作 | |
git status | 查看状态 |
git add <file> | 添加到暂存区 |
git add . | 添加所有文件 |
git commit -m "xxx" | 提交更改 |
git log | 查看历史 |
git log --oneline | 简洁历史 |
| 🌿 分支操作 | |
git branch | 查看分支 |
git branch <name> | 创建分支 |
git checkout <name> | 切换分支 |
git checkout -b <name> | 创建并切换 |
git merge <name> | 合并分支 |
git branch -d <name> | 删除分支 |
| ☁️ 远程操作 | |
git remote add origin <url> | 添加远程仓库 |
git push -u origin main | 推送到远程 |
git pull origin main | 拉取更新 |
git fetch | 获取远程信息 |