Git与GitHub

GitHub 是一个基于 Git 的代码托管平台,它提供了一个远程仓库(Remote Repository)来存储和共享代码,并提供了一系列协作工具,如Pull Requests(拉取请求)、Issues(问题跟踪)、CI/CD(持续集成/持续部署)等。

你可以把 Git 比作是一本笔记本,而 GitHub 就像是一个云笔记平台(比如 Evernote),它让你可以随时随地访问、分享和协作管理你的笔记(代码)。


版本控制

什么是版本控制

版本控制是一种用于管理文件变更历史的技术,特别适用于软件开发中的代码管理。它可以记录文件的每次修改,允许开发者回溯历史版本、比较差异,并且支持多人协作开发。

版本控制的几种方式

  • 手动控制: 最原始的方法就是手动备份文件,这种方法容易混乱,不适合团队协作。
  • 集中式:SVN(所有文件保存在Server上,使用起来非常简单)
  • 分布式:Git(分布式存储,每个local都有版本库)

版本控制的应用场景

  • 软件开发:管理代码、团队协作、功能开发、bug 修复等。
  • 文档管理:追踪文档历史,适用于论文、合同等版本管理。
  • 网站开发:管理网站源码,配合 CI/CD 进行自动化部署。
  • 配置管理:运维工程师使用 Git 追踪服务器配置文件的变更。

Git基础

使用方式:

  • 命令行(CLI)
  • 图形化界面(GUI)
  • IDE插件(Vscode之类的)

使用之前:

  • 使用git config命令配置用户名和邮箱
    • 三种参数 Local/global/system 对应不同配置域
    • 使用git config --list检查配置信息

初始化:

  • 概念:仓库(Repo)
    • 一个特定目录
    • 其中的所有文件都会被git统一管理
    • 跟踪文件历史和版本
    • 在目录中生成.git文件夹作为管理文件夹
  • 创建:
    • 使用git init本地创建仓库
    • 使用git clone远程克隆仓库
  • 概念:分区
    • 工作区:资源管理器能够看到的文件夹(.git 所在目录)
    • 暂存区:缓冲区,暂存文件的位置(.git/index)
    • 本地仓库:存储版本代码和主要信息的位置(.git/object)
    • 流程:工作区通过git add将文件提交至暂存区,再通过git commit将文件提交到本地仓库
    • 文件状态:因为分区形式诞生的对文件所处分区的追踪
      • 未跟踪(Untrack):未被git管理的文件
      • 未修改(Unmodified):已经被git管理起来但未被修改的文件
      • 已修改(Modified):已经被git管理起来且被修改的文件
      • 已暂存(Staged):已经添加到暂存区的文件

开始使用:

  • 仓库状态: 使用git staus查看仓库状态
  • 暂存:使用git add 将文件提交至暂存区
  • 提交: 使用git commit 只会提交暂存区的文件,每次提交都需要指定信息
  • 撤销: 使用git reset回退文件版本
    • –soft
    • –hard
    • –mixed (默认参数)
  • 查看差异:使用git dif查看
    • 可以比较不同区域以及同一文件的不同版本的差异
    • 默认行为是比较工作区和暂存区之间的差异
  • 删除文件:
    • 直接删除文件后提交
    • 使用git rm进行文件删除 会默认将文件同时从工作区和暂存区同时删除
      • --cached 参数可以命令只删除缓存区文件
  • .gitignore
    • 将一些文件添加到git管理的忽略项中(一些敏感文件,编译后文件等)

发起你的第一个Pull Request

前置条件

  • GitHub 账号
  • Git 安装(确保本地已安装 Git,使用 git --version 检查)
  • Fork 目标仓库(如果你不是该项目的维护者)
  • Git 配置 SSH 或 HTTPS 访问权限

步骤 1:Fork 目标仓库

如果你要为开源项目贡献代码,你通常没有直接推送的权限,所以需要先 Fork(复制)一份代码到自己的 GitHub 账户下:

  1. 打开 GitHub 目标仓库(如 https://github.com/example/repo)。
  2. 点击右上角的 “Fork” 按钮,创建你自己的副本(https://github.com/your-username/repo)。
  3. 这个 Fork 版本属于你,接下来你可以自由修改。

步骤 2:克隆 Fork 后的仓库到本地

使用 git clone 将 Fork 的仓库下载到本地:

1
git clone https://github.com/your-username/repo.git

或者使用 SSH(如果配置了 SSH Key):

1
git clone [email protected]:your-username/repo.git

进入项目目录:

1
cd repo

步骤 3:添加上游(Upstream)仓库

为了保持你的 Fork 代码是最新的,需要添加原始仓库(Upstream):

1
git remote add upstream https://github.com/example/repo.git

验证远程仓库:

1
git remote -v

输出类似:

1
2
3
4
origin    https://github.com/your-username/repo.git (fetch)
origin https://github.com/your-username/repo.git (push)
upstream https://github.com/example/repo.git (fetch)
upstream https://github.com/example/repo.git (push)

步骤 4:创建新分支

在修改代码之前,创建一个新的分支(避免直接修改 main 分支):

1
git checkout -b feature-branch

例如:

1
git checkout -b fix-bug-123

步骤 5:修改代码并提交

编辑代码后,执行:

1
2
git add .
git commit -m "修复了 bug #123"

最佳实践:

  • 使用有意义的 commit 信息,如 "修复登录页面的 CSS 样式"
  • 如果是关联 Issue,可以使用 fixes #123(PR 合并后,Issue #123 会自动关闭)。

步骤 6:同步最新代码(可选)

如果你的 Fork 代码较旧,最好与上游同步,以避免冲突:

1
2
3
4
5
6
git checkout main
git fetch upstream
git merge upstream/main
git push origin main
git checkout feature-branch
git rebase main # 让你的分支基于最新的 main

步骤 7:推送分支到 GitHub

1
git push origin feature-branch

步骤 8:在 GitHub 提交 Pull Request

  1. 打开 GitHub 仓库https://github.com/your-username/repo)。
  2. 点击 “Compare & pull request” 按钮(GitHub 会检测到你有新分支)。
  3. 填写 PR 详情:
    • 标题(如:修复登录按钮点击无效的问题)。
    • 描述(简要说明你的修改,并附带 Issue 号)。
    • 选择合并分支
      • base 选择 upstream/main(目标仓库的主分支)。
      • compare 选择 feature-branch(你修改的分支)。
  4. 点击 “Create pull request” 提交 PR

步骤 9:等待审核

  • 维护者会进行 Code Review(代码审查)。
  • 可能会要求你 修改代码(你可以继续提交到 feature-branch,PR 会自动更新)。
  • 通过后,维护者会 合并 PR,你的代码就正式进入主仓库!

步骤 10:清理本地分支

PR 合并后,你可以删除本地分支:

1
2
3
4
git checkout main
git pull upstream main # 更新本地 main
git branch -d feature-branch
git push origin --delete feature-branch # 删除远程分支