目录
一、为什么必须学 Git?—— 版本控制的 “终极解决方案”
2.2 核心概念:搞懂 Git 的 “三大区域” 与 “三种状态”
3.4.2 撤销暂存区的修改(已 add,未 commit)
3.4.3 撤销已提交的修改(已 commit,未推送到远程)
8.3 坑点 3:git reset --hard误操作,丢失未提交修改

class 卑微码农:
def __init__(self):
self.技能 = ['能读懂十年前祖传代码', '擅长用Ctrl+C/V搭建世界', '信奉"能跑就别动"的玄学']
self.发量 = 100 # 初始发量
self.咖啡因耐受度 = '极限'
def 修Bug(self, bug):
try:
# 试图用玄学解决问题
if bug.严重程度 == '离谱':
print("这一定是环境问题!")
else:
print("让我看看是谁又没写注释...哦,是我自己。")
except Exception as e:
# 如果try块都救不了,那就...
print("重启一下试试?")
self.发量 -= 1 # 每解决一个bug,头发-1
# 实例化一个我
我 = 卑微码农()
引言
在开发过程中,你是否遇到过这些困扰:代码改崩了想回退却找不到旧版本?多人协作时代码冲突难以解决?本地代码丢失无法恢复?而 Git—— 这款全球最流行的分布式版本控制系统,能轻松搞定这些问题,成为开发者必备的 “代码管家”。
本文从 Git 基础概念切入,循序渐进讲解核心操作、分支管理、远程协作、进阶技巧与实战案例,搭配大量可直接上手的命令示例,帮你从零基础快速掌握 Git,轻松应对个人开发与团队协作中的版本控制需求。
一、为什么必须学 Git?—— 版本控制的 “终极解决方案”

在 Git 出现之前,开发者常用的版本控制方式(如复制文件、本地记录)存在诸多痛点:
- 版本混乱:多个版本的文件堆积在本地,命名混乱(如
demo_v1.txt、demo_final.txt),难以区分; - 协作低效:多人开发时需手动合并代码,容易覆盖他人工作,冲突解决繁琐;
- 风险极高:本地文件丢失(如电脑损坏)导致代码全部丢失,无法恢复;
- 追溯困难:无法清晰查看代码修改记录、修改人及修改原因。
而 Git 的核心价值在于 **“分布式版本控制”**,它能解决以上所有问题:
- 完整版本记录:每一次修改都被记录,可随时回退到任意历史版本;
- 高效多人协作:支持多人同时开发,自动处理代码合并,冲突解决直观;
- 数据安全可靠:分布式存储,本地和远程仓库都有完整代码,不怕文件丢失;
- 清晰追溯审计:可查看每一次提交的作者、时间、内容,便于责任追踪;
- 灵活分支管理:支持创建多个分支并行开发,互不干扰,合并便捷。
无论是个人开发、小型团队协作,还是大型开源项目(如 Linux 内核、Vue.js),Git 都是版本控制的首选工具。
二、基础入门:Git 环境搭建与核心概念

2.1 环境搭建:安装 Git 并配置
2.1.1 安装 Git
-
Windows 系统:
- 下载安装包:Git 官网;
- 双击安装,默认下一步即可(建议勾选 “Add Git to PATH”,添加环境变量);
- 安装完成后,打开 “Git Bash”,进入命令行界面。
-
Linux 系统:
- Ubuntu/Debian:
sudo apt-get install git; - CentOS:
sudo yum install git。
- Ubuntu/Debian:
-
Mac 系统:
- 方式 1:通过 Xcode Command Line Tools 安装:
xcode-select --install; - 方式 2:下载官网安装包:Git 官网。
- 方式 1:通过 Xcode Command Line Tools 安装:
2.1.2 验证安装
打开终端 / 命令行,输入以下命令,显示版本号即安装成功:
git --version
# 输出示例:git version 2.43.0 (Windows) / git version 2.34.1 (Linux)
2.1.3 初始配置:设置用户信息
Git 需要知道你的身份,以便记录提交记录的作者。第一次使用 Git 必须配置:
# 设置用户名(建议与GitHub/Gitee用户名一致)
git config --global user.name "Your Name"
# 设置邮箱(建议与代码托管平台绑定邮箱一致)
git config --global user.email "your.email@example.com"
--global:全局配置,所有 Git 仓库都生效;若只想对当前仓库生效,去掉该参数。
2.1.4 查看配置信息
# 查看所有全局配置
git config --global --list
# 查看当前仓库配置(进入仓库目录后执行)
git config --list
2.2 核心概念:搞懂 Git 的 “三大区域” 与 “三种状态”
Git 的核心逻辑围绕 “三大区域” 和 “三种状态” 展开,这是理解 Git 操作的基础,新手必须吃透。
2.2.1 三大区域
- 工作区(Working Directory):你电脑上实际操作的文件目录,就是你能看到和编辑的文件;
- 暂存区(Staging Area):临时存放修改的文件,相当于 “待提交缓冲区”,可选择性提交部分修改;
- 版本库(Repository):Git 仓库的核心区域,存储所有提交的版本记录,位于工作区下的
.git目录(隐藏目录)。
2.2.2 三种状态
- 已修改(Modified):工作区的文件被修改,但未添加到暂存区;
- 已暂存(Staged):修改后的文件已添加到暂存区,等待提交到版本库;
- 已提交(Committed):暂存区的文件已提交到版本库,形成一个新的版本。
核心流程:文件状态流转
- 在工作区创建 / 修改文件(状态:已修改);
- 将修改的文件添加到暂存区(
git add)(状态:已暂存); - 将暂存区的文件提交到版本库(
git commit)(状态:已提交)。
三、Git 基础操作:从初始化到提交版本
掌握以下基础操作,就能应对个人开发中的版本控制需求,每个操作都搭配详细示例和说明。

3.1 初始化仓库:创建本地 Git 仓库
Git 仓库分为 “本地仓库” 和 “远程仓库”,本地仓库用于存储本地代码的版本记录。
3.1.1 新建本地仓库
在本地新建一个目录,将其初始化为 Git 仓库:
# 1. 创建目录(示例:git-demo)
mkdir git-demo
# 2. 进入目录
cd git-demo
# 3. 初始化Git仓库(生成.git隐藏目录)
git init
# 输出:Initialized empty Git repository in /xxx/git-demo/.git/
3.1.2 克隆远程仓库
若要参与他人项目,可克隆远程仓库(如 GitHub/Gitee 上的仓库)到本地:
# 语法:git clone 远程仓库地址
git clone https://github.com/your-username/your-repo.git
# 示例:克隆一个测试仓库
git clone https://github.com/octocat/Hello-World.git
克隆后,本地会生成与远程仓库同名的目录,包含完整的代码和版本记录。
3.2 基础操作:添加、提交与查看状态
3.2.1 查看仓库状态:git status
随时查看工作区、暂存区的文件状态:
# 进入仓库目录后执行
git status
# 输出示例1:工作区干净(无修改、无未跟踪文件)
# On branch main
# Your branch is up to date with 'origin/main'.
# nothing to commit, working tree clean
# 输出示例2:有未跟踪文件(新建的文件)
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# test.txt
# nothing added to commit but untracked files present (use "git add" to track)
3.2.2 添加文件到暂存区:git add
将工作区的修改(新建、编辑、删除)添加到暂存区:
# 1. 添加单个文件
git add test.txt
# 2. 添加多个文件(空格分隔)
git add file1.txt file2.txt
# 3. 添加当前目录下所有修改(包括子目录)
git add . # 推荐使用,便捷高效
# 4. 添加指定目录下的所有文件
git add docs/
3.2.3 提交暂存区到版本库:git commit
将暂存区的文件提交到版本库,形成一个新的版本,每次提交必须写提交信息(说明修改内容):
# 基本用法:-m 后接提交信息
git commit -m "feat: 新增测试文件test.txt"
# 提交信息规范(推荐):类型: 描述(如feat/feat/fix/docs/style/refactor/test/chore)
# feat:新功能;fix:修复bug;docs:文档修改;style:代码格式调整;refactor:重构;test:测试;chore:构建/依赖调整
# 示例:修复bug
git commit -m "fix: 修复登录接口参数校验错误"
# 扩展:若已跟踪的文件修改后,可跳过暂存区直接提交(不推荐,建议先add查看修改)
git commit -a -m "fix: 调整用户列表展示逻辑"
3.2.4 查看提交日志:git log
查看版本库的提交记录(作者、时间、提交信息、版本号):
# 基本用法:查看所有提交记录
git log
# 输出示例:
# commit a1b2c3d4e5f67890abcdef1234567890abcdef12 (HEAD -> main)
# Author: Your Name <your.email@example.com>
# Date: Mon Oct 1 10:00:00 2024 +0800
# feat: 新增测试文件test.txt
# 简化输出:一行显示一条记录
git log --oneline
# 输出示例:
# a1b2c3d (HEAD -> main) feat: 新增测试文件test.txt
# d7e8f9a init: 初始化仓库
# 查看指定作者的提交记录
git log --author="Your Name"
# 查看最近n条记录
git log -n 3
3.3 版本回退:回到历史版本
当代码改崩或需要查看旧版本时,可通过git reset回退到指定版本。
3.3.1 查看版本号
首先通过git log --oneline获取要回退的版本号(前 7 位即可):
git log --oneline
# 输出:
# a1b2c3d (HEAD -> main) feat: 新增测试文件test.txt
# d7e8f9a init: 初始化仓库
3.3.2 回退到指定版本
# 语法:git reset --hard 版本号
git reset --hard d7e8f9a
# 输出:
# HEAD is now at d7e8f9a init: 初始化仓库
--hard:彻底回退,工作区、暂存区、版本库都同步到目标版本(谨慎使用,会丢弃当前未提交的修改);- 其他参数:
--soft(仅版本库回退,暂存区和工作区不变)、--mixed(默认,版本库和暂存区回退,工作区不变)。
3.3.3 回退后悔了?恢复到最新版本
若回退后想回到之前的最新版本,先查看所有操作记录(包括回退记录):
git reflog
# 输出示例:
# d7e8f9a (HEAD -> main) HEAD@{0}: reset: moving to d7e8f9a
# a1b2c3d HEAD@{1}: commit: feat: 新增测试文件test.txt
# d7e8f9a HEAD@{2}: commit (initial): init: 初始化仓库
然后通过版本号恢复到最新版本:
git reset --hard a1b2c3d
3.4 撤销修改:丢弃工作区 / 暂存区的修改
3.4.1 撤销工作区的修改(未 add 到暂存区)
# 语法:git checkout -- 文件名
git checkout -- test.txt
该命令会将文件恢复到最近一次git commit或git add时的状态。
3.4.2 撤销暂存区的修改(已 add,未 commit)
先将暂存区的修改撤回到工作区,再撤销工作区的修改:
# 1. 暂存区撤回到工作区
git reset HEAD test.txt
# 2. 撤销工作区的修改
git checkout -- test.txt
3.4.3 撤销已提交的修改(已 commit,未推送到远程)
使用git revert创建一个新的提交,撤销之前的提交(推荐,不破坏历史记录):
# 撤销最近一次提交
git revert HEAD
# 撤销指定版本(版本号通过git log获取)
git revert a1b2c3d
执行后会进入编辑界面,填写撤销提交的信息,保存退出即可。
四、分支管理:Git 的 “灵魂功能”
分支是 Git 最强大的功能之一,它允许你在独立的 “分支” 上开发新功能、修复 bug,不影响主分支的稳定代码。

4.1 分支的核心概念
- 主分支(main/master):默认创建的分支,用于存放稳定的代码,最终上线的代码都在主分支;
- 功能分支(feature 分支):用于开发新功能,如
feature/user-login; - bug 修复分支(hotfix 分支):用于修复主分支上的紧急 bug,如
hotfix/login-error; - 开发分支(develop 分支):部分团队会用 develop 分支作为开发主分支,功能完成后合并到 main。
4.2 分支基础操作
4.2.1 查看分支
bash
# 查看本地所有分支(*标记当前所在分支)
git branch
# 查看本地和远程所有分支
git branch -a
# 查看分支详情(最后提交信息、作者、时间)
git branch -v
4.2.2 创建分支
# 语法:git branch 分支名
git branch feature/user-login
4.2.3 切换分支
# 语法:git checkout 分支名
git checkout feature/user-login
# 简化:创建并切换分支(推荐)
git checkout -b feature/user-login
4.2.4 合并分支
将一个分支的代码合并到当前分支,例如将功能分支合并到主分支:
# 1. 切换到主分支
git checkout main
# 2. 合并功能分支到主分支
git merge feature/user-login
4.2.5 删除分支
# 删除本地分支(分支已合并到主分支)
git branch -d feature/user-login
# 强制删除本地分支(分支未合并,丢弃修改)
git branch -D feature/user-login
# 删除远程分支
git push origin --delete feature/user-login
4.3 分支合并冲突:如何解决?
当两个分支修改了同一个文件的同一部分内容,合并时会产生冲突,Git 无法自动解决,需要手动处理。
4.3.1 冲突产生示例
- 主分支
main的test.txt内容:Hello Git!; - 创建并切换到
feature/test分支,修改test.txt为:Hello Git! This is feature branch.; - 切换回
main分支,修改test.txt为:Hello Git! This is main branch.; - 合并
feature/test到main,产生冲突:
git merge feature/test
# 输出:Auto-merging test.txt
# CONFLICT (content): Merge conflict in test.txt
# Automatic merge failed; fix conflicts and then commit the result.
4.3.2 解决冲突步骤
- 查看冲突文件:冲突部分会被
<<<<<<<、=======、>>>>>>>标记:
Hello Git!
<<<<<<< HEAD # 当前分支(main)的内容
This is main branch.
=======
This is feature branch.
>>>>>>> feature/test # 待合并分支(feature/test)的内容
- 编辑文件,手动修改冲突部分(保留需要的内容,删除标记):
Hello Git!
This is merged content. # 手动修改后的内容
- 添加到暂存区并提交:
git add test.txt
git commit -m "merge: 解决test.txt合并冲突"
4.4 分支管理最佳实践
- 主分支保护:main 分支禁止直接提交,所有修改通过分支合并;
- 分支命名规范:
feature/功能名、hotfix/bug描述、release/版本号; - 小步提交:功能分支开发过程中,频繁提交,便于回退和代码审查;
- 及时合并:功能开发完成后,及时合并到主分支,避免分支落后过多导致冲突。
五、远程仓库:多人协作的核心
本地仓库仅能满足个人开发,多人协作需要借助远程仓库(如 GitHub、Gitee、GitLab),实现代码共享和同步。

5.1 远程仓库基础操作
5.1.1 关联远程仓库
若本地仓库已存在,关联远程仓库:
# 语法:git remote add 远程仓库别名 远程仓库地址
git remote add origin https://github.com/your-username/your-repo.git
origin:远程仓库的默认别名,可自定义(如github、gitee)。
5.1.2 查看远程仓库信息
# 查看远程仓库列表
git remote
# 查看远程仓库详细信息(包括地址)
git remote -v
# 输出:
# origin https://github.com/your-username/your-repo.git (fetch)
# origin https://github.com/your-username/your-repo.git (push)
5.1.3 拉取远程代码:git pull
将远程仓库的代码拉取到本地,并合并到当前分支(多人协作时,提交前务必先拉取):
# 拉取origin远程仓库的main分支到本地当前分支
git pull origin main
# 简化:若本地分支与远程分支已关联,直接拉取
git pull
5.1.4 推送本地代码:git push
将本地分支的提交推送到远程仓库:
# 推送本地main分支到origin远程仓库
git push origin main
# 首次推送时,关联本地分支和远程分支(后续可直接git push)
git push -u origin main
# 推送指定分支
git push origin feature/user-login
5.2 多人协作流程(实战)
以 “开发新功能并合并到主分支” 为例,讲解多人协作的完整流程:
5.2.1 流程步骤
- 克隆远程仓库到本地:
git clone https://github.com/team-repo/project.git
cd project
- 创建功能分支并开发:
git checkout -b feature/new-function
# 编写代码,多次提交
git add .
git commit -m "feat: 实现新功能核心逻辑"
git commit -m "feat: 添加新功能测试用例"
- 拉取远程最新代码(避免冲突):
# 切换到main分支拉取最新代码
git checkout main
git pull
# 切换回功能分支,合并main分支的最新代码
git checkout feature/new-function
git merge main
# 若有冲突,解决冲突后提交
- 推送功能分支到远程:
git push origin feature/new-function
- 创建 Pull Request(PR)/Merge Request(MR):
- 登录 GitHub/Gitee,进入仓库,找到 “Pull Request” 功能;
- 选择 “feature/new-function” 分支合并到 “main” 分支,填写 PR 描述;
- 等待团队成员代码审查。
- 审查通过后合并:
- 审查通过后,点击 “Merge” 合并分支到 main;
- 合并完成后,删除远程功能分支。
- 同步本地仓库:
# 拉取远程main分支的最新代码
git checkout main
git pull
# 删除本地功能分支
git branch -d feature/new-function
5.3 远程仓库常见问题
5.3.1 推送失败:远程仓库有未拉取的代码
报错信息:error: failed to push some refs to 'https://github.com/...'解决方案:先拉取远程代码,合并后再推送:
git pull origin main
# 解决冲突(若有)
git push origin main
5.3.2 忘记密码 / 权限不足
解决方案:
- 若使用 HTTPS 地址,输入正确的用户名和密码(或使用访问令牌,GitHub 已禁用密码推送,需创建 Personal Access Token);
- 若使用 SSH 地址,配置 SSH 密钥(免密码登录)。
5.3.3 配置 SSH 密钥(免密码推送)
- 生成 SSH 密钥:
ssh-keygen -t rsa -C "your.email@example.com"
# 按回车默认保存路径,无需设置密码
- 查看公钥内容:
# Windows:cat ~/.ssh/id_rsa.pub
# Linux/Mac:cat ~/.ssh/id_rsa.pub
- 登录 GitHub/Gitee,进入 “设置”→“SSH 密钥”,添加公钥内容;
- 验证 SSH 连接:
ssh -T git@github.com # GitHub
ssh -T git@gitee.com # Gitee
- 关联远程仓库时使用 SSH 地址:
git remote add origin git@github.com:your-username/your-repo.git
六、Git 进阶功能:提升效率的技巧
掌握以下进阶功能,能大幅提升 Git 使用效率,应对更复杂的开发场景。

6.1 标签管理:标记版本(如发布版本)
标签用于标记重要的版本(如v1.0.0),便于后续回退和查看。
# 1. 创建标签(默认标记当前提交)
git tag v1.0.0
# 2. 给指定版本创建标签
git tag v0.9.0 d7e8f9a
# 3. 查看所有标签
git tag
# 4. 查看标签详情
git show v1.0.0
# 5. 推送标签到远程
git push origin v1.0.0 # 推送单个标签
git push origin --tags # 推送所有标签
# 6. 删除标签
git tag -d v1.0.0 # 删除本地标签
git push origin --delete v1.0.0 # 删除远程标签
6.2 暂存修改:git stash
当你正在开发一个功能,需要切换到其他分支处理紧急问题,但当前修改未完成不想提交时,可使用git stash暂存修改。
# 1. 暂存当前工作区和暂存区的修改
git stash
# 2. 查看所有暂存记录
git stash list
# 输出:stash@{0}: WIP on feature/new-function: a1b2c3d feat: 实现新功能核心逻辑
# 3. 恢复暂存的修改(应用后保留暂存记录)
git stash apply stash@{0}
# 4. 恢复并删除暂存记录(推荐)
git stash pop stash@{0}
# 5. 删除所有暂存记录
git stash clear
6.3 忽略文件:.gitignore
有些文件不需要纳入版本控制(如编译产物、日志、IDE 配置文件),可通过.gitignore文件指定忽略规则。
6.3.1 创建.gitignore文件
在仓库根目录创建.gitignore文件,添加忽略规则:
# 忽略所有.class文件(Java编译产物)
*.class
# 忽略日志目录
logs/
# 忽略IDE配置文件(IntelliJ IDEA)
.idea/
*.iml
# 忽略Python虚拟环境
venv/
# 忽略特定文件
test.log
6.3.2 生效规则
.gitignore只对未跟踪的文件生效;- 若文件已被跟踪(已
git add),修改.gitignore后需先移除跟踪:
git rm --cached test.log # 移除跟踪,保留文件
git commit -m "docs: 添加.gitignore,忽略test.log"
6.4 差异对比:git diff
查看文件在不同状态下的差异,便于代码审查和修改确认。
# 1. 查看工作区与暂存区的差异
git diff
# 2. 查看工作区与版本库(当前分支最新提交)的差异
git diff HEAD
# 3. 查看暂存区与版本库的差异
git diff --cached
# 4. 查看两个分支之间的差异
git diff main feature/new-function
# 5. 查看指定文件的差异
git diff test.txt
七、实战案例:Git 在实际开发中的应用

7.1 案例 1:个人项目版本控制流程
- 初始化本地仓库:
git init; - 编写代码,提交版本:
git add .
git commit -m "init: 初始化项目,实现核心功能"
git commit -m "feat: 新增用户管理模块"
git commit -m "fix: 修复用户登录bug"
- 关联远程仓库,推送代码:
git remote add origin https://github.com/your-username/your-project.git
git push -u origin main
- 开发新功能,创建分支:
git checkout -b feature/payment
# 开发完成后合并
git checkout main
git merge feature/payment
git push
- 发现线上 bug,创建 hotfix 分支修复:
git checkout -b hotfix/payment-error
# 修复后合并到main
git checkout main
git merge hotfix/payment-error
git push
# 合并到开发分支(若有)
git checkout feature/payment
git merge hotfix/payment-error
7.2 案例 2:多人协作开发一个 Web 项目
- 团队成员 A 创建远程仓库并初始化:
git init --bare project.git # 创建裸仓库(无工作区,用于共享)
# 或直接在GitHub/Gitee创建仓库,团队成员克隆
- 团队成员 B 克隆仓库并开发:
git clone https://github.com/team/project.git
git checkout -b feature/login
# 开发登录功能并提交
git push origin feature/login
- 团队成员 C 同步代码并开发注册功能:
git clone https://github.com/team/project.git
git pull origin feature/login # 同步A开发的登录功能
git checkout -b feature/register
# 开发注册功能并提交
git push origin feature/register
- 团队负责人审查代码,合并到 main:
git checkout main
git pull origin feature/login
git pull origin feature/register
# 解决冲突后提交
git push origin main
八、避坑指南:新手常见错误与解决方案

8.1 坑点 1:提交信息不规范,难以追溯
问题:提交信息随意(如 “修改了一下”“fix bug”),后续无法快速了解修改内容。解决方案:遵循提交信息规范:类型: 描述,例如:
git commit -m "feat: 新增微信登录功能"
git commit -m "fix: 修复手机号验证码发送失败问题"
8.2 坑点 2:直接在 main 分支开发,导致代码混乱
问题:多人直接在 main 分支提交代码,频繁冲突,难以维护。解决方案:严格遵循分支管理规范,所有修改通过功能分支合并,禁止直接提交 main 分支。
8.3 坑点 3:git reset --hard误操作,丢失未提交修改
问题:使用git reset --hard回退版本,导致当前未提交的修改全部丢失。解决方案:
- 谨慎使用
--hard参数,回退前确保已提交所有需要保留的修改; - 若已丢失,可尝试通过
git reflog查看操作记录,若修改已被暂存过,可能通过版本恢复。
8.4 坑点 4:忽略文件不生效
问题:添加.gitignore后,忽略的文件仍被 Git 跟踪。解决方案:
- 确保文件未被跟踪(未执行
git add); - 若已跟踪,先移除跟踪:
git rm --cached 文件名,再提交。
8.5 坑点 5:推送失败,远程仓库有更新
问题:多人协作时,远程仓库有他人提交的代码,直接推送导致失败。解决方案:先拉取远程最新代码,合并后再推送:
git pull origin main
# 解决冲突(若有)
git push origin main
九、总结:Git 学习路径与进阶建议
9.1 核心要点回顾
- 基础操作:掌握仓库初始化、添加、提交、查看状态 / 日志、版本回退;
- 分支管理:熟练创建、切换、合并分支,解决合并冲突;
- 远程协作:掌握远程仓库关联、拉取、推送,多人协作流程;
- 进阶技巧:运用标签、stash、.gitignore、diff 提升效率。
9.2 进阶学习建议
- 深入理解 Git 原理:学习 Git 对象模型(blob、tree、commit),理解版本存储机制;
- 学习 Git 高级命令:
git rebase(变基合并)、git cherry-pick(挑选提交)、git bisect(二分查找定位 bug); - 结合 CI/CD 工具:集成 Jenkins、GitHub Actions,实现自动化测试、构建、部署;
- 参与开源项目:通过 Fork、PR 流程参与开源项目,熟悉实际协作场景。
Git 的学习核心是 “多动手实践”,只有频繁使用,才能熟练掌握各种操作和技巧。从个人项目开始尝试,逐步参与多人协作,你会发现 Git 能极大提升开发效率,成为你开发路上的 “得力助手”。
847

被折叠的 条评论
为什么被折叠?



