一、Git 是什么
Git 是一个分布式版本控制系统,由 Linus Torvalds 在 2005 年为了管理 Linux 内核代码而创建。它的核心作用是记录代码历史、支持多人协作、管理分支,以及让本地仓库脱离网络也能独立工作。
如果没有版本控制,团队协作中常会遇到代码覆盖、无法追溯修改来源、回退困难等问题,而 Git 正是为了解决这些痛点而设计的。
二、Git 与 GitHub 的区别
| 对比项 | Git | GitHub |
|---|---|---|
| 本质 | 版本控制工具/软件 | 基于 Git 的代码托管平台 |
| 运行环境 | 本地安装,命令行工具 | 云端服务,需要联网访问 |
| 是否必须一起使用 | 可以独立使用 | 依赖 Git 作为底层工具 |
| 类似产品 | SVN、Mercurial | GitLab、Gitee、Bitbucket |
| 主要功能 | 提交、分支、合并、回退 | 托管、PR、Issue、CI/CD |
总结:Git 是工具,GitHub 是基于这个工具搭建的在线服务。你也可以把代码托管到 GitLab、Gitee 等平台。
三、Git 基本使用
1. 配置与初始化
# 配置用户名和邮箱(首次使用需要设置)git config --global user.name "你的名字"git config --global user.email "你的邮箱"
# 初始化一个新的 Git 仓库git init
# 克隆远程仓库到本地git clone https://github.com/user/repo.git2. 提交相关
# 查看当前状态(哪些文件被修改、新增)git status
# 将文件加入暂存区git add 文件名git add . # 添加所有改动
# 提交到本地仓库git commit -m "提交说明"# 提交说明规范推荐使用 Conventional Commits:
| 类型 | 说明 | 示例 |
|---|---|---|
feat | 新增功能 | feat: 新增用户登录功能 |
fix | 修复 bug | fix: 修复登录接口报 500 错误 |
docs | 文档改动 | docs: 更新 README 安装说明 |
style | 代码格式调整 | style: 统一代码缩进为 2 空格 |
refactor | 代码重构 | refactor: 优化订单查询逻辑 |
perf | 性能优化 | perf: 优化图片懒加载性能 |
test | 增加或修改测试 | test: 新增登录模块单元测试 |
chore | 构建/依赖等杂项 | chore: 升级 webpack 版本 |
revert | 撤销提交 | revert: 回退上一次错误的合并 |
提交信息建议带上影响范围:
git commit -m "feat(user): 新增用户头像上传功能"git commit -m "fix(order): 修复订单金额计算错误"git commit -m "docs(readme): 补充部署步骤说明"提交信息小原则
- 一次提交只做一件事:不要把”修复bug”和”新增功能”混在一次提交里,方便日后回溯和
revert。
git commit -m "feat: 新增文章评论功能" -m "支持二级回复、点赞和举报功能,评论内容做了敏感词过滤"第一个 -m 是标题,第二个 -m 是正文详细说明,git log 里会分行显示。
# 查看提交历史git loggit log --oneline # 简洁版历史记录3. 远程仓库操作
# 关联远程仓库git remote add origin https://github.com/user/repo.git
# 推送到远程仓库git push origin main
# 拉取远程仓库最新内容并合并git pull origin main
# 仅获取远程更新,不自动合并git fetch origin4. 分支操作
# 查看分支列表git branch
# 创建新分支git branch 分支名
# 切换分支git checkout 分支名# 或使用新命令git switch 分支名
# 创建并切换到新分支git checkout -b 分支名
# 合并分支(将指定分支合并到当前分支)git merge 分支名
# 删除分支git branch -d 分支名5. 撤销与回退
# 撤销工作区的修改(未 add 之前)git checkout -- 文件名
# 撤销 add(回到未暂存状态)git reset 文件名
# 回退到某次提交(--soft 保留改动,--hard 完全回退)git reset --hard commit_id
# 查看某次提交的详细内容git show commit_id6. 其他常用命令
# 查看文件改动的具体内容git diff
# 暂存当前修改,稍后再恢复(适合临时切换任务)git stashgit stash pop
# 查看某个文件的修改记录git log -p 文件名
# 忽略特定文件(配合 .gitignore 文件使用)# 在项目根目录新建 .gitignore,写入要忽略的文件/文件夹名即可| 命令 | 核心作用 | 数据流向 | 对本地工作区的影响 | 典型使用场景 |
|---|---|---|---|---|
| branch | 分支管理:创建、查看、删除分支 | 本地内部操作 | 切换分支会改变工作区文件;新建分支不影响当前工作区 | 开启新功能或修复 Bug 时,创建独立分支(如 feat/xxx) |
| fetch | 安全拉取:从远程下载最新代码到本地追踪分支 | 远程 ➔ 本地(仅更新追踪分支) | 完全不影响当前工作区和当前分支 | 同步上游代码但不立即合并,先审查后再决定何时合并 |
| pull | 拉取并合并:获取远程代码并自动合并到当前分支 | 远程 ➔ 本地(直接合并到当前分支) | 直接修改当前工作区文件,可能引发冲突 | 确定本地工作区干净,且需要快速同步团队最新代码时 |
| push | 推送上传:将本地的提交推送到远程仓库 | 本地 ➔ 远程 | 不影响本地工作区 | 本地功能开发完成并测试通过后,将代码同步到远程仓库 |
| merge | 分支合并:将指定分支的变更合并到当前分支 | 本地内部操作(或本地与远程追踪分支) | 直接修改当前工作区,可能引发冲突 | 将 feat/xxx 分支的修改合入 main 分支,或将 upstream/main 合入本地 main |
四、GitHub 上的常用操作
1. Fork(复刻)
Fork 是把别人的仓库复制一份到自己的账号下,适合参与开源项目。流程通常是 Fork 仓库、克隆到本地开发、修改后通过 Pull Request 提交回原仓库。
2. Pull Request(PR)
PR 用于请求把某个分支或 fork 仓库中的改动合并到目标仓库/分支。它是协作开发中最核心的功能之一,支持代码差异查看、讨论和审核。
3. Issue(议题)
Issue 用于记录 Bug、功能建议、任务讨论等,也可以打标签、指派负责人、关联 PR。
4. Release(发布)
项目稳定后可以创建 Release,并配合 Git Tag 使用:
git tag -a v1.0.0 -m "发布说明"git push origin v1.0.05. Codespaces / 在线工作空间
Codespaces 可以直接在浏览器中打开开发容器,适合快速验证和临时协作。
6. Star 与 Watch
- Star:收藏项目,方便以后查找。
- Watch:关注仓库动态,接收 Issue、PR 和更新通知。
五、多人协作时 Git 的使用方式
在团队开发中,直接在 main 分支开发风险很高,通常要通过功能分支和 PR 进行协作。
1. 基本协作流程
- 拉取最新代码:开始工作前先执行
git pull。 - 创建功能分支:如
git checkout -b feature/login。 - 本地开发与提交:多次
git add+git commit,保持提交粒度清晰。 - 推送分支:
git push origin feature/login。 - 发起 Pull Request:请求合并到主分支。
- 代码审查:团队成员在 PR 中评审代码。
- 合并代码:审核通过后合并并删除分支。
2. 常见分支模型
- Git Flow:适合有明确发布周期的项目,分
main、develop、feature/*、release/*、hotfix/*。 - GitHub Flow:更轻量,通常只有
main和若干feature分支,适合持续部署。 - Trunk-Based Development:所有人频繁提交小改动,配合功能开关控制上线。
3. 解决冲突(Merge Conflict)
git pull origin main
# 冲突文件里会出现:# <<<<<<< HEAD# 你的代码# =======# 对方的代码# >>>>>>> feature/login
git add 冲突文件git commit4. 团队协作建议
- 提交信息要统一、清晰。
- 小步提交、频繁推送。
- 善用
.gitignore。 - 保护主分支,要求 PR 审核后才能合并。
- 长期分支要定期同步主分支。
六、搭建自己的 Git 服务
方式一:SSH 裸仓库
裸仓库只有版本历史,没有工作目录,适合作为多人 push/pull 的中转站。
mkdir -p /home/git/reposcd /home/git/reposgit init --bare myproject.git本地可以直接克隆或添加远程:
# 方式 A:如果是全新项目,直接克隆空仓库git clone user@your-server-ip:/home/git/repos/myproject.git
# 方式 B:如果本地已有项目,添加远程地址后推送git remote add origin user@your-server-ip:/home/git/repos/myproject.git
git push -u origin main # 如果是第一次推送,使用 -u 建立本地分支与远程分支的关联此处为什么是 push origin, 是由于我们添加的远程仓库名称是 origin
方式二:Gitea / GitLab
如果你想要类似 GitHub 的网页界面,可以使用 Gitea 或 GitLab 自建代码托管平台。
Gitea 更轻量,适合个人或小团队:
docker run -d --name gitea \ -p 3000:3000 -p 2222:22 \ -v /data/gitea:/data \ gitea/gitea:latestGitLab 功能更全,但资源占用更高:
docker run -d --name gitlab \ -p 443:443 -p 80:80 -p 222:22 \ -v /srv/gitlab/config:/etc/gitlab \ -v /srv/gitlab/logs:/var/log/gitlab \ -v /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest方式三:git daemon
适合局域网临时共享仓库,不推荐长期或公网使用。
git daemon --base-path=/home/git/repos --export-all方式选择建议
| 方式 | 适合场景 | 优点 | 缺点 |
|---|---|---|---|
| SSH 裸仓库 | 个人/小团队 | 简单、轻量、安全 | 没有网页界面和 Issue/PR |
| Gitea | 想要类似 GitHub 的体验 | 轻量、友好、功能齐全 | 需要单独维护服务 |
| GitLab | 企业/大团队 | 功能最全 | 资源占用大,配置复杂 |
| git daemon | 局域网临时共享 | 零配置 | 无权限控制,不安全 |
七、完整实操演练
这两个场景分别代表了开源协作中**“由下至上”的贡献模式(Scenario A)和“由上至下”的维护模式(Scenario B)。 Scenario A(文档修复)展示了外部贡献者如何通过 Fork + PR 流程参与项目;而 Scenario B(登录功能)展示了核心团队**如何在统一仓库内通过分支管理进行功能开发。
🛠️ 完整实操演练:从个人修复到团队功能开发
场景 A:开源贡献(个人修复文档错误)
角色:外部贡献者(你)
目标:修复 awesome-project 项目中的拼写错误。
流程:Fork 独立 -> 推送到个人远程 -> 提交 PR -> 对话修正
-
准备工作:克隆与绑定上游 你需要拥有自己的副本,同时关联原项目以保持同步。
# 1. 克隆你 Fork 的仓库到本地git clone https://github.com/你的用户名/awesome-project.gitcd awesome-project# 2. 绑定原作者的仓库为 upstream(上游)git remote add upstream https://github.com/原作者/awesome-project.git -
同步与分支:确保基线最新 在开始修改前,务必同步原作者的最新代码,避免因代码过旧导致冲突。
# 1. 拉取原作者的最新提交git fetch upstream# 2. 切换到主分支并合并上游代码git checkout maingit merge upstream/main# 3. 创建专门的修复分支 (遵循 fix/ 或 docs/ 命名规范)git checkout -b docs/fix-readme-typo问题1:明明前面已经clone了项目,为什么还要fetch upstream? 你克隆(clone)的只是“你 Fork 的副本”,而不是“原作者的仓库”。 git clone 和 git fetch upstream 获取的数据来源是完全不同的。
问题2:为什么此处是fetch,而不是pull? 因为我们不想直接合并到当前分支, 只是想获取最新的代码
问题3:那这样看git pull与fetch + merge结果上没什么区别呀? 在执行过程、安全性和掌控力上,这两者有着天壤之别。我们可以把 git pull 看作是一个“黑盒”,而 fetch + merge 则是把这个黑盒拆开,让你能看清里面的每一步。 -
修改与提交:精准提交 修正
README.md中的拼写错误(recieve->receive)。# 1. 将修改加入暂存区git add README.md# 2. 提交修改 (规范的提交信息)git commit -m "docs: fix typo in README (recieve -> receive)" -
推送与发起 PR 将你的分支推送到你的 Fork 仓库,并在 GitHub 上发起 Pull Request。
# 推送到你的远程仓库git push origin docs/fix-readme-typo操作: 去 GitHub 页面,选择
Base: main(原作者仓库) 与Compare: docs/fix-readme-typo(你的分支),点击 Create pull request。 -
应对审查:修正提交 如果维护者要求修改 Commit Message,你不需要关闭 PR,只需在本地修正并强制推送(针对个人分支是安全的):
# 修正上一次的提交信息git commit --amend -m "docs: fix typo in README (recieve -> receive) [Corrected message]"# 强制推送到你的分支 (PR 会自动更新)git push origin docs/fix-readme-typo --force
场景 B:团队协作(新增登录功能)
角色:核心开发成员
目标:在公司项目 awesome-project 中开发新功能。
流程:共享仓库 -> 功能分支开发 -> 推送远程 -> 内部审查 -> 合并清理
-
拉取最新代码 每天开始工作前,确保本地
main分支与团队最新进度一致。git checkout main # 切换到主分支git pull origin main # 拉取远程仓库的最新代码 (团队协作通常不需要 upstream,直接 pull origin) -
创建功能分支 基于最新的
main分支,创建一个独立的开发环境。git checkout -b feature/login # 创建并切换到新分支 -
本地开发与多次提交 在这个分支上进行完整的功能开发,保持提交粒度清晰。
# 第一次提交:完成页面 UIgit add src/pages/Login.vuegit commit -m "feat: add login page UI components"# 第二次提交:配置路由git add src/router/index.jsgit commit -m "feat: configure login page route" -
推送分支 将本地功能分支推送到共享的远程仓库,以便同事审查。
git push origin feature/login操作: 在 GitHub/GitLab 上,系统通常会提示“Your branch has been pushed…”,点击 Compare & pull request。
-
代码审查与迭代 同事在 PR 中指出代码问题(如样式错误)。你无需重新开 PR,只需在本地继续修改并推送。
# 修改代码后,再次提交git add src/pages/Login.vuegit commit -m "fix: update login button color to use theme variable"git push origin feature/login # 推送到同一分支,PR 自动更新 -
合并与清理 审查通过后,点击 Merge pull request。合并完成后,务必删除远程分支,并清理本地分支。
# 1. 切换回主分支git checkout main# 2. 拉取最新的合并记录git pull origin main# 3. 删除本地已合并的分支git branch -d feature/login
📊 场景对比总结
| 维度 | 场景 A:开源修复 (Scenario A) | 场景 B:团队开发 (Scenario B) |
|---|---|---|
| 仓库关系 | Fork 模式:你拥有独立的远程副本 | 共享模式:所有人直接向同一个远程仓库推送分支 |
| 远程源配置 | 需配置 upstream (原作者) 和 origin (自己) | 通常只需 origin (团队仓库) |
| 推送目标 | 推送到你的 Fork (git push origin branch) | 推送到团队仓库 (git push origin branch) |
| 分支管理 | 个人分支,可随意强制推送 (--force) 修正历史 | 功能分支,通常禁止强制推送,需通过新提交来修正 |
| 核心命令差异 | git remote add upstream git fetch upstream | git pull origin main (直接拉取) |
通过结合这两个场景,你可以应对从个人参与开源到企业级团队协作的绝大多数 Git 工作流。
4. 团队协作的一些建议
- 提交信息要清晰:遵循统一的提交规范(如 Conventional Commits:
feat: 新增登录功能、fix: 修复登录报错),方便日后追溯。 - 小步提交、频繁推送:避免一次性提交大量改动,降低冲突概率,也方便代码审查。
- 善用
.gitignore:避免将依赖包、编译产物、敏感配置文件提交到仓库。 - 保护主分支:在 GitHub 仓库设置中开启分支保护规则,要求 PR 必须经过审核才能合并,防止未经检查的代码直接进入主分支。
- 定期同步主分支:长期开发的分支要经常合并(或 rebase)主分支的最新代码,避免最后合并时产生大量冲突。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
