基本概念
什么是git
Git 是一款分布式版本控制系统(DVCS),是用于管理文件(尤其是代码)修改记录、追踪版本迭代、支持多人协作的开源工具。
核心特性:
- 分布式:每个开发者本地都有完整的代码仓库(包含所有版本记录),无需依赖中央服务器即可完成大部分操作(提交、分支、回滚等),离线也能工作;
- 版本追踪:精准记录文件的每一次修改(谁改、改了什么、什么时候改),支持随时回滚到任意历史版本;
- 分支管理:可轻松创建分支(比如开发新功能、修复 Bug 单独开分支),分支间独立开发,完成后再合并,避免代码冲突;
- 跨平台:支持 Windows、Mac、Linux,可通过命令行或图形化工具(如 SourceTree、GitKraken)操作。
简单说:Git 是本地管理代码版本的工具,不依赖任何云端平台也能独立使用。
Git 记录修改的方式:直接记录快照,而不是差异比较。
每当提交更新或在 Git 中保存项目状态时,它就会针对当时项目的全部文件制作一个快照, 保存快照的索引。如果文件没有修改,Git 就不重新存储该文件,只保留一个链接指向之前存储的文件。 Git 对待数据类似于快照流。
Git 三种状态:
- 已提交(committed):修改已经保存在本地代码仓库中。
- 已修改(modified):修改了文件,但还没保存到代码仓库中。
- 已暂存(staged):对一个已修改文件的当前版本做标记,使它包含在下次提交的快照中。
所以 Git 项目一般有三个工作区域:Git 代码仓库、工作目录、暂存区域。
Git 和 GitHub 的关系?
GitHub 是一个基于 Git 的云端代码托管平台,核心是为 Git 仓库提供远程存储服务。
| Git | GitHub | |
|---|---|---|
| 本质 | 版本控制工具(软件 / 命令集) | 基于 Git 的云端服务平台(网站) |
| 运行位置 | 本地电脑 / 私有服务器 | 云端服务器 |
| 核心功能 | 管理代码版本、分支、提交 | 托管 Git 仓库、协作、分享、开源 |
| 依赖关系 | 可完全独立使用(无需 GitHub) | 核心功能依赖 Git 实现 |
关于 Github 的使用,请参考:
入门指令
一、本地仓库提交
生成 SSH Key 并添加到 Github 等平台后,就要配置 Git 身份(提交记录会关联该信息),--global 表示全局生效(所有仓库共用),去掉则仅当前仓库生效。
下面是一个最简单的 git 工作流程常用命令:
bash
# 首先 cd 到工作目录
# 1.初始化 git 仓库
git init
# 2.配置个人信息(配一次即可)
# 配置个人信息,双引号要用英文的
git config user.name "你的名字"
git config user.email "你的邮箱"
# 配置个人信息,全局配置
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
# 3.检查状态(可选)
# 查看工作区文件状态(未跟踪 / 已修改 / 暂存),推荐加 -s 简化输出:git status -s
git status
# 查看工作区未暂存的修改内容
git diff
# 4.添加
# 把文件的变化添加到暂存区
# .是当前文件夹下所有 也可以指定推送某个文件 git add 文件名
git add .
git add <文件名>
# 5.提交
# 把暂存区的文件,提交到仓库(备注必填)
git commit -m "提交备注"
核心流程:初始化(配置个人信息) -> 添加文件进入暂存区 -> 提交文件到本地仓库
二、查看状态与回滚
bash
# 查看提交历史(按时间倒序)
git log
# 回滚到指定版本(清空工作区 / 暂存区,慎用)
git reset --hard <提交ID>
# 回滚到指定版本(保留工作区 / 暂存区修改)
git reset --soft <提交ID>
# 撤销指定提交(生成新提交,适合已推送的版本)
git revert <提交ID>
三、与远程仓库协作
本地仓库的过程,在头尾加上拉取远程代码和推送远程代码的过程:
克隆远程仓库 / 拉取代码 -> 添加文件进入暂存区 -> 提交文件到本地仓库 -> 推送本地分支到远程仓库
bash
# 查看远程仓库的别名和地址
git remote -v
# 1.克隆远程仓库到本地(含所有版本记录)
# 例如:git clone https://github.com/xxx/xxx.git
git clone <远程仓库地址>
# 2.拉取远程分支代码并合并到本地(= fetch + merge)
# 指定分支为 main:git pull origin main
git pull <远程别名> <分支名>
# 3.推送本地分支到远程仓库
# 例如:git push origin main
git push <远程别名> <本地分支>