3092 字
8 分钟
git 的使用方法
2024-07-24

一、Git 是什么#

Git 是一个分布式版本控制系统,由 Linus Torvalds 在 2005 年为了管理 Linux 内核代码而创建。它的核心作用是记录代码历史、支持多人协作、管理分支,以及让本地仓库脱离网络也能独立工作。

如果没有版本控制,团队协作中常会遇到代码覆盖、无法追溯修改来源、回退困难等问题,而 Git 正是为了解决这些痛点而设计的。

二、Git 与 GitHub 的区别#

对比项GitGitHub
本质版本控制工具/软件基于 Git 的代码托管平台
运行环境本地安装,命令行工具云端服务,需要联网访问
是否必须一起使用可以独立使用依赖 Git 作为底层工具
类似产品SVN、MercurialGitLab、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.git

2. 提交相关#

# 查看当前状态(哪些文件被修改、新增)
git status
# 将文件加入暂存区
git add 文件名
git add . # 添加所有改动
# 提交到本地仓库
git commit -m "提交说明"
# 提交说明规范

推荐使用 Conventional Commits:

类型说明示例
feat新增功能feat: 新增用户登录功能
fix修复 bugfix: 修复登录接口报 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 log
git log --oneline # 简洁版历史记录

3. 远程仓库操作#

# 关联远程仓库
git remote add origin https://github.com/user/repo.git
# 推送到远程仓库
git push origin main
# 拉取远程仓库最新内容并合并
git pull origin main
# 仅获取远程更新,不自动合并
git fetch origin

4. 分支操作#

# 查看分支列表
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_id

6. 其他常用命令#

# 查看文件改动的具体内容
git diff
# 暂存当前修改,稍后再恢复(适合临时切换任务)
git stash
git 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.0

5. Codespaces / 在线工作空间#

Codespaces 可以直接在浏览器中打开开发容器,适合快速验证和临时协作。

6. Star 与 Watch#

  • Star:收藏项目,方便以后查找。
  • Watch:关注仓库动态,接收 Issue、PR 和更新通知。

五、多人协作时 Git 的使用方式#

在团队开发中,直接在 main 分支开发风险很高,通常要通过功能分支和 PR 进行协作。

1. 基本协作流程#

  1. 拉取最新代码:开始工作前先执行 git pull
  2. 创建功能分支:如 git checkout -b feature/login
  3. 本地开发与提交:多次 git add + git commit,保持提交粒度清晰。
  4. 推送分支:git push origin feature/login
  5. 发起 Pull Request:请求合并到主分支。
  6. 代码审查:团队成员在 PR 中评审代码。
  7. 合并代码:审核通过后合并并删除分支。

2. 常见分支模型#

  • Git Flow:适合有明确发布周期的项目,分 maindevelopfeature/*release/*hotfix/*
  • GitHub Flow:更轻量,通常只有 main 和若干 feature 分支,适合持续部署。
  • Trunk-Based Development:所有人频繁提交小改动,配合功能开关控制上线。

3. 解决冲突(Merge Conflict)#

git pull origin main
# 冲突文件里会出现:
# <<<<<<< HEAD
# 你的代码
# =======
# 对方的代码
# >>>>>>> feature/login
git add 冲突文件
git commit

4. 团队协作建议#

  • 提交信息要统一、清晰。
  • 小步提交、频繁推送。
  • 善用 .gitignore
  • 保护主分支,要求 PR 审核后才能合并。
  • 长期分支要定期同步主分支。

六、搭建自己的 Git 服务#

方式一:SSH 裸仓库#

裸仓库只有版本历史,没有工作目录,适合作为多人 push/pull 的中转站。

mkdir -p /home/git/repos
cd /home/git/repos
git 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:latest

GitLab 功能更全,但资源占用更高:

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. 准备工作:克隆与绑定上游 你需要拥有自己的副本,同时关联原项目以保持同步。

    # 1. 克隆你 Fork 的仓库到本地
    git clone https://github.com/你的用户名/awesome-project.git
    cd awesome-project
    # 2. 绑定原作者的仓库为 upstream(上游)
    git remote add upstream https://github.com/原作者/awesome-project.git
  2. 同步与分支:确保基线最新 在开始修改前,务必同步原作者的最新代码,避免因代码过旧导致冲突。

    # 1. 拉取原作者的最新提交
    git fetch upstream
    # 2. 切换到主分支并合并上游代码
    git checkout main
    git 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 则是把这个黑盒拆开,让你能看清里面的每一步。

  3. 修改与提交:精准提交 修正 README.md 中的拼写错误(recieve -> receive)。

    # 1. 将修改加入暂存区
    git add README.md
    # 2. 提交修改 (规范的提交信息)
    git commit -m "docs: fix typo in README (recieve -> receive)"
  4. 推送与发起 PR 将你的分支推送到你的 Fork 仓库,并在 GitHub 上发起 Pull Request。

    # 推送到你的远程仓库
    git push origin docs/fix-readme-typo

    操作: 去 GitHub 页面,选择 Base: main (原作者仓库) 与 Compare: docs/fix-readme-typo (你的分支),点击 Create pull request

  5. 应对审查:修正提交 如果维护者要求修改 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 中开发新功能。 流程共享仓库 -> 功能分支开发 -> 推送远程 -> 内部审查 -> 合并清理

  1. 拉取最新代码 每天开始工作前,确保本地 main 分支与团队最新进度一致。

    git checkout main # 切换到主分支
    git pull origin main # 拉取远程仓库的最新代码 (团队协作通常不需要 upstream,直接 pull origin)
  2. 创建功能分支 基于最新的 main 分支,创建一个独立的开发环境。

    git checkout -b feature/login # 创建并切换到新分支
  3. 本地开发与多次提交 在这个分支上进行完整的功能开发,保持提交粒度清晰。

    # 第一次提交:完成页面 UI
    git add src/pages/Login.vue
    git commit -m "feat: add login page UI components"
    # 第二次提交:配置路由
    git add src/router/index.js
    git commit -m "feat: configure login page route"
  4. 推送分支 将本地功能分支推送到共享的远程仓库,以便同事审查。

    git push origin feature/login

    操作: 在 GitHub/GitLab 上,系统通常会提示“Your branch has been pushed…”,点击 Compare & pull request

  5. 代码审查与迭代 同事在 PR 中指出代码问题(如样式错误)。你无需重新开 PR,只需在本地继续修改并推送。

    # 修改代码后,再次提交
    git add src/pages/Login.vue
    git commit -m "fix: update login button color to use theme variable"
    git push origin feature/login # 推送到同一分支,PR 自动更新
  6. 合并与清理 审查通过后,点击 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 upstreamgit pull origin main (直接拉取)

通过结合这两个场景,你可以应对从个人参与开源到企业级团队协作的绝大多数 Git 工作流。

4. 团队协作的一些建议#

  • 提交信息要清晰:遵循统一的提交规范(如 Conventional Commits:feat: 新增登录功能fix: 修复登录报错),方便日后追溯。
  • 小步提交、频繁推送:避免一次性提交大量改动,降低冲突概率,也方便代码审查。
  • 善用 .gitignore:避免将依赖包、编译产物、敏感配置文件提交到仓库。
  • 保护主分支:在 GitHub 仓库设置中开启分支保护规则,要求 PR 必须经过审核才能合并,防止未经检查的代码直接进入主分支。
  • 定期同步主分支:长期开发的分支要经常合并(或 rebase)主分支的最新代码,避免最后合并时产生大量冲突。
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

git 的使用方法
https://minikou.cloud/posts/use_of_git/
作者
minikou
发布于
2024-07-24
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录