Git学习
一、什么是Git
Git 是一个分布式版本控制系统。能帮你"记住"文件每一次修改历史、方便你回退到任意版本、并且支持多人协作的工具。
二、核心概念
| 概念 | 说明 |
|---|---|
| 版本控制 | 记录文件随时间的变化,你可以随时回溯到某个历史版本 |
| 分布式 | 每个人的电脑上都有一份完整的代码历史,不依赖中央 |
| 快照 | Git 每次提交不是只记录"差异",而是拍一张全部文件状态 |
| 本地优先 | 绝大多数操作(提交、查看历史、对比、创建分支)都在本地完成,速度快,不依赖网络 |
- 保存历史:每次 git commit 就像游戏里的"存档点"
- 查看差异:知道今天改了哪些地方,和上周相比多了哪几行
- 回退版本:改坏了?git reset 或 git revert 一键回到过去
- 并行开发:用分支同时开发多个功能,互不干扰,完成后合并
- 多人协作:你的同事 push 代码,你 pull 下来,Git 自动合并(有冲突会提示你手动解决)
三、工作流程
- 工作区:你电脑里能看到的文件夹
- 暂存区:临时存放改动的地方(git add 后)
- 本地仓库:正式保存版本的地方(git commit 后)
- 远程仓库:比如 GitHub、GitLab 上的仓库
这三个区域的流转关系:工作区 → git add → 暂存区 → git commit → 本地仓库 → git push → 远程仓库
工作区
这个是在电脑写代码的地方
暂存区
在工作区的文件进行git add . (该命令是上传所有文件)之后,文件就会到暂存区。英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
四、新建一个完整工作流
1、本地电脑创建文件夹
先在代码文件夹创建一个项目文件夹,然后打开命令
bash
git init
初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。其实这个文件夹就变成了一个本地仓库,Git 会在里面创建隐藏的 .git 目录。这个文件夹的绝对路径就是本地仓库地址。
2、配置当前仓库信息
bash
# 配置用户名
git config user.name "xuziyuan"
# 配置邮箱
git config user.email "xxxx@qq.com"
如果需要全局,则添加--global
bash
# 配置用户名
git config --global user.name "xuziyuan"
# 配置邮箱
git config --global user.email "xxxx@qq.com"
3、配置远程仓库
方式一:克隆时自动配置
bash
git clone https://github.com/用户名/仓库名.git
方式二:手动添加(本次学习)
bash
# 添加一个远程仓库,命名为 origin,地址为 xxx
git remote add origin https://github.com/用户名/仓库名.git
# 查看当前配置的远程地址
git remote -v
# 如果已有 origin,想修改地址
# git remote set-url origin https://新地址.git
4、添加文件并提交到本地仓库
bash
# 添加所有改动
git add .
# 提交到本地仓库
git commit -m "说明"
5、推送到远程仓库
bash
# 查看远程仓库地址
git remote -v
# 推送到远程 main 分支
git push origin main
到这一步,本次提交就完成了。现在就得去远程仓库提PR了。如果被打回来修改后重复就好了
6、拉去合并后的代码
bash
# 拉取远程 main 分支的更新
git pull origin main
# 查看本地分支
git branch
# 创建并切换到新分支
git checkout -b new-branch
# 合并分支到当前分支
git merge new-branch
其他人可能也提了PR,所以下一次开发要拉新代码下来,并且要查看一下更新。
7、撤销与修改
bash
# 撤销工作区的修改(未 add)
git restore <文件>
# 从暂存区撤回到工作区
git restore --staged <文件>
# 撤销最后一次 commit,改动保留在暂存区
git reset --soft HEAD~1
# 彻底撤销最后一次 commit(谨慎使用)
git reset --hard HEAD~1
五、Git命令学习
六、疑惑问题
6.1、为什么不能只用本地仓库?
本地仓库非常强大------所有提交、分支、历史记录都在你自己的电脑上。但仅有本地仓库,会遇到三个致命问题:
- 无法与别人协作你改完代码,同事怎么拿到?把 U 盘拷给他?每人各自改完再手动合并?那简直是一场灾难。远程仓库充当公共服务器,所有人都能 push / pull,Git 自动合并和解决冲突。
- 没有备份,电脑坏了代码就没了:硬盘损坏、电脑丢失、勒索病毒...... 如果只有本地仓库,所有版本历史瞬间消失。远程仓库(GitHub / GitLab 等)相当于云备份,随时可以克隆回来。
- 多设备同步困难:你在公司电脑写了一半的功能,回家想继续写。如果没有远程仓库,就得用网盘或 U 盘拷贝,非常麻烦。
有了远程仓库,只需 git push 然后回家 git pull,代码状态完全同步。
6.2、远程地址的两种协议有什么区别?
| 协议 | 格式示例 | 特点 |
|---|---|---|
| HTTPS | https://github.com/user/repo.git |
每次 push 可能需要输入用户名和密码(可用凭证缓存或 token) |
| SSH | git@github.com:user/repo.git |
需要配置 SSH 公钥,免密码更安全,推荐 |
6.3、我本地的文件夹路径和远程地址能一样吗?
不能。一个是你电脑的路径,一个是网络地址,格式完全不同。
6.4、如果我换了电脑,怎么把代码连到同一个远程仓库?
在新电脑上 git clone <远程地址>,Git 会自动创建本地仓库并关联好远程地址。
6.5、本地仓库可以和多个远程仓库关联吗?
可以。比如同时关联 GitHub 和 Gitee:
bash
git remote add github https://github.com/user/repo.git
git remote add gitee https://gitee.com/user/repo.git
推送时分别 git push github main 和 git push gitee main。
查看本地仓库关联了哪些远程地址
bash
git remote -v