GIT(了解)
什么是(软件)版本控制?
作用:软件源码版本管理、多人协作开发,版本的多分支开发,代码回滚(回退)等功能。
版本控制(Version Control)是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。它可以帮助我们:
- 追踪文件的修改历史,查看谁在何时做了什么更改
- 恢复到之前的版本,当出现错误时可以快速回滚
- 多人协作时管理代码,避免文件冲突和覆盖
- 并行开发不同功能,最后再合并到一起
简单来说,版本控制就像给你的项目创建了一系列"快照",你可以随时回到过去的任何一个状态。
版本控制系统的类型
1.本地版本控制系统
- 在本地磁盘上保存文件的不同版本
- 例如:RCS(通过补丁集记录文件差异)
2.集中式版本控制系统
将代码仓库放在一台服务器上,下载,开发是要依赖这台服务器。都从这台服务器上获取源代码
优点:简单,方便管理,适用于中小型项目
缺点:一旦服务器宕机,会严重影响开发
SVN,CVS
- 所有版本数据存储在中央服务器
- 开发者从中央服务器拉取代码,完成后再推回
- 例如:SVN、CVS
- 缺点:中央服务器故障时无法协作,数据有丢失风险
3.分布式版本控制系统
每个开发者的本地都有完整的版本库副本
- 无需联网即可提交、查看历史
- 拥有更强的分支管理能力
- 例如:Git、Mercurial、Bazaar
- 优势:容错性高,协作灵活,支持离线工作
远程仓库
公网仓库:gitee、githup(开源,私有)
私有(局域网)仓库:gitlab、gitea
本地仓库:git客户端创建或者clone
git核心概念
diff:对比
checkout:切换
1.工作区(Working Directory)
- 你当前正在编辑的文件目录
- 这些文件可能处于未跟踪或已修改状态
2.暂存区(Staging Area)
- 一个文件(通常位于.git/index),用于临时保存你打算提交的修改
- 可以理解为待提交内容的缓冲区
3.本地仓库(Local Repository)
- 存储所有版本历史的数据库
- 位于工作区的.git目录中
- 包含所有提交记录、分支信息等
4.远程仓库(Remote Repository)
- 托管在网络上的仓库(如GitHub、GitLab)
- 用于多人协作时同步代码
5.提交(Commit)
- 对工作区修改的一次永久记录
- 每个提交都有一个唯一的哈希值作为标识
6.分支(Branch)
- 指向某个提交的指针
- 默认分支通常名为main或master
- 可以创建多个分支并行开发不同功能
Git的工作流程
1.修改文件:在工作区编辑文件
2.暂存修改:将需要提交的修改添加到暂存区(
git add
)3.提交修改:将暂存区的内容提交到本地仓库(
git commit
)4.同步远程:将本地仓库的修改推送到远程仓库(
git push
),或从远程拉取他人的修改(git pull
)
什么是Git?
Git是目前最流行的分布式版本控制系统,由Linux内核开发者Linus Torvalds于2005年创建。它的设计目标是:
- 速度快
- 支持非线性开发(强大的分支能力)
- 完全分布式
- 能高效处理大型项目(如Linux内核)
Git与其他版本控制系统的主要区别在于:它对待数据的方式更像是一个"快照流",而不是文件变化的列表。每次提交,Git都会对当时的全部文件创建一个快照并保存引用,而不是只记录差异。
为什么选择Git?
1.性能卓越:Git的所有操作几乎都是本地执行,速度极快
2.强大的分支管理:创建和合并分支非常高效,支持复杂的工作流
3.分布式架构:每个开发者都有完整副本,不怕数据丢失
4.广泛采用:几乎成为行业标准,大量开源项目和企业使用
5.丰富的生态:有GitHub、GitLab等平台提供托管服务,以及众多工具支持
常见的Git工作流
1.集中式工作流:类似SVN,所有人在同一个分支上工作
2.功能分支工作流:每个功能在单独分支开发,完成后合并到主分支
3.GitFlow工作流:有严格的分支模型,区分功能开发、发布准备和bug修复
4.Forking工作流:适合开源项目,通过Fork和Pull Request协作
无论选择哪种工作流,Git的核心功能和概念都是一致的,掌握了基础操作后可以灵活应用于各种场景。
Git的学习曲线虽然有些陡峭,但一旦掌握,将极大提升开发效率和代码管理能力,是现代软件开发不可或缺的工具。
安装步骤
、下载git并安装:
下载地址: https://git-scm.com/downloads
2、注册并登录码云:https://gitee.com/login
登录成功之后到选择【头像--设置--账号管理】绑定手机号,然后到邮箱管理中绑定邮箱,必须绑定邮箱,不然后期加入不了仓库成员,如果加入不了仓库成员,那么就没有权限修改仓库里面的代码。注意不要勾选不公开我的邮箱地址。
3、点击头像旁边的+号按钮选择创建仓库,然后输入仓库的名称,仓库的介绍,选择仓库是开源(所有人可见)还是私有(仅仓库成员可见)。最后点击创建。即可创建一个仓库(存放项目代码的一个云盘)。
4、创建完成之后,点击初始化readme文件。
常用命令:
创建git仓库: mkdir test
cd test
初始化仓库,.git目录,记录配置与每次提交的内容。
git init
将一个文件添加到缓存区
git add .
将缓存区内容提交到本地仓库
git commit -m “注释信息”
同步本地仓库到远程仓库
git push
第一次同步,需要远程地址(创建远程仓库时,自动生成)
类型仓库:
https方式:(直接在仓库那边克隆复制)
git remote add origin https://gitee.com/.......路径
ssh方式:
git remote add origin git@gitee.com:.....路径
克隆仓库
git clone git@gitee.com:瓜酷月/yun11......路径
查看分支:
git branch
创建分支:
git branch dev
切换分支:
git checkout dev
合并分支:
git checkout master
git merge dev
1. 暂存与提交
命令 | 说明 |
---|---|
git add <文件名> | 将指定文件从工作区添加到暂存区 |
git add . | 将当前目录所有修改/新增文件添加到暂存区 |
git add -p | 交互式暂存(按块选择文件内容) |
git commit -m "提交信息" | 将暂存区内容提交到本地仓库 |
git commit -am "提交信息" | 跳过暂存区,直接提交已跟踪文件的修改 |
git commit --amend | 补充提交(合并到上一次提交,修改提交信息) |
如果我们想要将本地的一个东西上传上去步骤:
windows中
本地创一个:touch 1.txt
windows中
git add . #把文件添加到缓存区
git commit -m "命令解释随便写"
可以通过git log 查看日志做了什么
git pull origin master --allow-unrelated-histories 拉取远程仓库并允许合并无关历史
git push ( git push --set-upstream origin master)推送本地当前分支到远程对应分支
第一次要输入用户名和密码(电话号和密码)
ubuntu中想要上传本地的代码
apt install git 下载git这个软件
git config --global user.name "姓名"
git config --global user.email "邮箱"
git config --global credential.helper store
git clone 复制的https链接地址
git pull #将代码同步到本地
创文件 vim 2.txt
git add .
git commit -m "备注"
git push (输入用户名和密码)
上传成功
但是每次上传时都需要输入用户名和密码,有时候太麻烦了。我们可以
做一个ssh免密
在windows上
以管理员身份运行
mkdir -p ~/.ssh
ssh-keygen -t ed25519 -C "15635838257@163.com"
cd c/Users/瓜酷月/.ssh/
cat pub文件
把公钥传上来
git push 发现不用密码了,然后就实现了免密。
例如:在ubuntu上,
ssh-keygen生成密钥,cd /root/.ssh/在这里找到公钥文件 cat id_rsa.pub复制内容
git remote -v 查看当前配置的远程地址,这里开头实时https。你当前使用的是 HTTPS 协议的仓库地址,而 SSH 免密只对 SSH 协议的仓库地址生效。需要调整仓库的远程地址为 SSH 格式
git remote set-url origin git@gitee.com:你的用户名/仓库名.git
例如:
git remote set-url origin git@gitee.com:guakuyue/y11test.git
git push
完整一次
ssh-keygen -t rsa -b 4096 -C "你的邮箱地址"
cat ~/.ssh/id_ed25519.pub
把密码复制到git仓库里面
ssh -T git@gitee.com #查看ssh连接是否成功
git remote -v #查看当前仓库的远程地址
git remote set-url origin git@gitee.com:你的用户名/你的仓库名.git #如果上一条出来https那么执行替换
再次push时发现不用密码了。
2. 撤销操作,回滚
查看提交记录:
git log
回滚到某次提交的内容:
git reset --soft 哈希值:软回滚保留缓存区和工作区数据,用于下次提交
git reset --hard哈希值:硬回滚,清除缓存区和工作区数据,版本回滚
git reset --mixed 哈希值:混合回滚
命令 | 说明 |
---|---|
git restore <文件名> | 撤销工作区修改(未暂存的文件) |
git restore --staged <文件名> | 将暂存区文件撤回工作区 |
git reset --soft <提交哈希> | 回滚到指定提交(保留暂存区和工作区) |
git reset --mixed <提交哈希> | 回滚到指定提交(清空暂存区,保留工作区) |
git reset --hard <提交哈希> | 强制回滚(清空暂存区+删除工作区修改) |
git revert <提交哈希> | 生成撤销提交(保留原历史,适合已推送的代码) |
撤销操作命令详解:
1.撤销工作区修改
git restore src/login.js
:适用于:修改了文件但未执行 git add
,想放弃修改,恢复到文件上一次提交或暂存的状态。修改会丢失,执行前确保无需保留。
2.取消暂存
git restore --staged src/login.js
:适用于:执行 git add
后发现文件有错误,想取消暂存但保留修改。执行后文件从暂存区回到工作区,可重新修改后再 git add
。
3.软回滚(保留变更)
git reset --soft HEAD~1
HEAD~1
表示上一次提交(HEAD~2
表示上上次,也可直接用提交哈希)- 效果:本地仓库回滚到指定提交,暂存区和工作区的修改完全保留(适合合并多次连续提交) 示例:最近两次提交可合并为一次,执行后最近一次提交的内容会回到暂存区,重新
git commit
即可合并。
4.混合回滚(默认模式)
git reset --mixed HEAD~1
- 效果:本地仓库回滚到指定提交,暂存区清空,工作区修改保留(适合“提交后发现代码需调整,想重新提交”)
- 示例:提交后发现代码有小问题,执行后可直接修改工作区文件,重新
git add
和git commit
。
5.强制回滚(危险操作)
git reset --hard a1b2c3d
- 效果:本地仓库回滚到指定提交(
a1b2c3d
为目标提交哈希),暂存区和工作区的所有修改永久删除 - 适用场景:提交了错误代码(如包含密码、病毒文件),需彻底清除
- 警告:执行前务必确认修改无需保留,且该提交未推送到远程(否则会影响团队协作)。
6.生成撤销提交(安全回滚)
git revert a1b2c3d
- 适用于:已推送到远程的错误提交,需撤销但保留原历史(避免修改共享的提交记录)
- 效果:创建一个新提交,内容为“抵消
a1b2c3d
提交的修改”,原提交仍保留在历史中 - 操作:执行后会打开编辑器填写撤销原因,提交后远程仓库会新增一个撤销提交,团队成员拉取后即可同步修改。
多人协同开发
1.邀请仓库成员,选择自己的仓库,然后点击【管理-仓库成员管理-可以添加仓库管理成员】。选择仓库权限为开发者,邀请成功之后,成员就可以在自己的账户中看到该仓库,就可以共同开发一个项目。
2、可以在【管理-仓库设置-基本信息】修改仓库是否开源。也可以删除修改仓库。
3、https与ssh克隆的区别,ssh安全性更高,必须设置密钥才能克隆拉取代码。配置完成之后可以用ssh拉取
团队协作中,需与 GitHub/GitLab 等远程仓库同步代码(拉取/推送/关联)。
命令 | 说明 |
---|---|
git remote | 查看已关联的远程仓库列表 |
git remote -v | 查看远程仓库的详细地址 |
git remote add <远程名> <远程地址> | 关联远程仓库 |
git pull | 拉取远程分支代码并合并到本地当前分支 |
git pull <远程名> <远程分支>:<本地分支> | 拉取指定远程分支到本地指定分支 |
git push | 推送本地当前分支到远程对应分支(首次需 -u 绑定) |
git push <远程名> <本地分支>:<远程分支> | 推送本地分支到远程指定分支 |
git fetch | 拉取远程仓库信息(不合并,仅更新本地跟踪分支) |
git remote set-url <远程名> <新地址> | 修改远程仓库地址 |
远程协作命令详解:
1.查看远程仓库名称
git remote
:列出本地已关联的远程仓库名称,默认克隆的仓库名通常为 origin
:
origin
upstream # 若关联了上游仓库(如 Fork 项目后)
2.查看远程仓库地址
git remote -v
:显示每个远程仓库的拉取(fetch
)和推送(push
)地址:
origin https://github.com/your-name/your-repo.git (fetch)
origin https://github.com/your-name/your-repo.git (push)
upstream https://github.com/original-owner/original-repo.git (fetch)
upstream https://github.com/original-owner/original-repo.git (push)
3.关联远程仓库
本地新建仓库后,需关联远程仓库才能推送代码:
git remote add origin https://github.com/your-name/new-repo.git
其中 origin
是远程仓库的别名(可自定义,通常用 origin
),后续推送/拉取时直接使用别名即可。
4.拉取远程代码(默认分支)
git pull
:拉取远程仓库中与本地当前分支对应的分支(如本地 main
对应远程 origin/main
),并自动合并到本地分支。相当于 git fetch
+ git merge
,拉取前建议提交本地修改,避免冲突。
5.拉取指定远程分支
git pull origin dev:local-dev
:拉取远程 origin/dev
分支的代码,合并到本地 local-dev
分支(本地分支不存在时会自动创建)。适用于同步远程非对应分支的场景。
6.推送本地分支到远程
- 首次推送:需绑定“上游分支”(远程分支与本地分支关联)
git push -u origin feature/payment # 推送本地 feature/payment 到远程 origin/feature/payment
- 后续推送:绑定后直接执行
git push
即可,无需重复指定远程和分支。
7.推送本地分支到远程指定分支
git push origin local-test:remote-test
:将本地 local-test
分支的代码推送到远程 remote-test
分支(远程分支不存在时会自动创建),适用于本地与远程分支名不同的场景。
8.拉取远程信息(不合并)
git fetch origin
:拉取远程仓库的所有分支信息到本地(更新本地的远程跟踪分支,如 origin/main
),但不合并到本地分支。适合先查看远程最新代码,再决定是否合并:
git fetch origin # 拉取远程信息
git checkout origin/main # 查看远程 main 分支的最新代码
git merge origin/main # 手动合并到本地 main 分支(如需)
9.修改远程仓库地址 当远程仓库迁移(如从 GitHub 迁移到 GitLab)时,需更新地址:
git remote set-url origin https://new-url.git
执行后可用 git remote -v
验证地址是否更新。
git多分支管理
仓库最高的权限是master主分支,多人开发,master主分支不允许修改上传代码的。他是最高权限,一般都是由架构师来操作,其他人是不允许修改,一般master只修改一次上传项目需要的框架以及素材。
如果我们想上传代码?
新建一个属于自己的分支ceshi,这个分支叫子分支。子分支继承了主分支master所有的代码。一个仓库由很多分支,每个分支的代码都是一套独立的代码,都是从master继承过来的,每个人只在自己的分支上修改代码。
每个人进公司都会给你一个git地址,这个git是有权限的,然后再给你一个子分支。你做完项目先提交到自己的分支上,当你做完之后, 确定自己子分支的内容没有问题之后,然后将子分支中的内容合并到主分支上。
1、新建分支:在码云仓库中点击master选择新建分支,然后输入分支名称,分支起点从哪个分支继承代码,选择master点击确定。此时这个仓库有两个分支。
【同步远程代码】 git pull
【查看所有的分支】 git branch -a
【切换分支】git checkout 分支名称
4、提交分支代码:在ceshi分支上,新建ceshi.txt,并执行下面命令提交到ceshi分支。
git pull
git add .
git commit -m"提交到子分支"
git push
但是我们会发现分支里的内容并不会主分支里
这时候就有了合并功能:
【查看所有分支】 git branch -a
【切换回主分支】 git checkout 主分支名
【然后合并分支】 git merge 子分支名
【上传线上仓库】 git push
注意切换分支必须保证当前分支没有可以提交的内容,然后合并到哪个分支就切换到哪个分支。如果合并出现问题只需要输入:qa回车,最后git push即可
标签
3. 标签(版本标记)
用于标记重要版本(如发布版本 v1.0.0),方便后续回溯。
命令 | 说明 |
---|---|
git tag | 查看所有本地标签 |
git tag -a <标签名> -m "标签说明" | 创建带注释的标签(推荐) |
git tag <标签名> | 创建轻量标签(仅存哈希,无注释) |
git push origin <标签名> | 推送指定标签到远程 |
git push origin --tags | 推送所有本地标签到远程 |
git tag -d <标签名> | 删除本地标签 |
git push origin --delete <标签名> | 删除远程标签 |
标签命令详解:
1.创建带注释的标签(推荐)
git tag -a v1.0.0 -m "第一个正式发布版本,支持登录、支付功能"
:带注释的标签包含标签名、创建者、时间、说明,适合正式版本标记,便于后续查看标签含义。
2.推送标签到远程
- 推送单个标签:
git push origin v1.0.0
- 推送所有标签:
git push origin --tags
(批量推送本地所有未推送的标签)
3.基于历史提交打标签 若需为过去的提交打标签,先通过 git log --oneline
找到目标提交哈希,再执行:
git tag -a v0.9.0 a1b2c3d -m "修复上线前的最后一个bug"
其中 a1b2c3d
是历史提交的哈希。
4.删除标签
- 删除本地标签:
git tag -d v0.9.0
- 删除远程标签:
git push origin --delete v0.9.0
Git 别名配置(提高效率)
为常用命令设置别名,减少输入量,提升操作效率。通过 git config
配置后,可使用简称代替完整命令。
命令 | 说明 | 示例效果 |
---|---|---|
git config --global alias.st status | 用 git st 代替 git status | git st 等价于 git status |
git config --global alias.co checkout | 用 git co 代替 git checkout | git co main 等价于 git checkout main |
git config --global alias.br branch | 用 git br 代替 git branch | git br 等价于 git branch |
git config --global alias.cm "commit -m" | 用 git cm 代替 git commit -m | git cm "fix: xxx" 等价于 git commit -m "fix: xxx" |
git config --global alias.unstage "restore --staged" | 用 git unstage 取消暂存 | git unstage file.js 等价于 git restore --staged file.js |
git config --global alias.last "log -1 HEAD" | 用 git last 查看最后一次提交 | git last 等价于 git log -1 HEAD |
配置示例:
# 一次性配置常用别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm "commit -m"
git config --global alias.unstage "restore --staged"
配置后,日常操作可简化为:
git st # 查看状态
git co -b dev # 创建并切换分支
git br # 查看分支
git cm "feat: xxx" # 提交代码
八、其他实用命令
处理特殊场景的辅助命令,如清理工作区、查看差异、暂存工作区等。
命令 | 说明 | 示例 |
---|---|---|
git clean -fd | 清理工作区的未跟踪文件和目录(-f 删文件,-d 删目录) | 执行 git clean -fd 会删除所有未 git add 的新增文件和文件夹(谨慎使用) |
git diff | 查看工作区与暂存区的差异(未暂存的修改内容) | git diff 显示所有未暂存的修改,git diff file.js 仅显示指定文件的修改 |
git diff --staged | 查看暂存区与本地仓库的差异(已暂存但未提交的内容) | 执行 git diff --staged 可确认 git add 后的内容是否正确 |
git stash | 暂存当前工作区的修改(未提交的内容),用于临时切换分支 | 开发到一半需切换分支,执行 git stash 暂存修改,切换回来后用 git stash pop 恢复 |
git stash pop | 恢复最近一次 git stash 暂存的内容,并删除暂存记录 | git stash pop 会将暂存的修改恢复到工作区 |
git stash list | 查看所有暂存的记录 | 执行后显示 stash@{0}: WIP on feature/login: a1b2c3d ... 等暂存列表 |
git cherry-pick <提交哈希> | 将指定提交复制到当前分支(适用于跨分支复用单个提交) | 在 main 分支执行 git cherry-pick e4f5g6h ,将 e4f5g6h 提交复制到 main |
实用命令详解:
1.清理未跟踪文件
git clean -fd
:用于删除工作区中所有未被 Git 跟踪的文件(如编译产物、临时文件),执行前建议先用 git clean -nfd
预览会删除的内容(-n
表示模拟操作)。
2.查看差异
git diff
:对比工作区与暂存区,显示未暂存的修改(如新增、删除的代码行)。git diff --staged
:对比暂存区与本地仓库,确认即将提交的内容是否正确。
3.暂存工作区(stash) 场景:正在开发分支 A,需紧急切换到分支 B 修复 bug,但分支 A 的修改未完成不想提交。
git stash # 暂存分支 A 的修改
git checkout B # 切换到分支 B 修复 bug
# 修复完成后切换回分支 A
git checkout A
git stash pop # 恢复暂存的修改,继续开发
4.复制提交(cherry-pick) 场景:分支 feature/login
有一个修复 e4f5g6h
需同步到 main
分支,但不想合并整个分支。
git checkout main # 切换到目标分支
git cherry-pick e4f5g6h # 复制 e4f5g6h 提交到 main 分支
若复制时出现冲突,解决方式与合并冲突相同,解决后执行 git cherry-pick --continue
完成操作。
九、常见问题与解决方法
1.提交后发现用户名/邮箱错误 若需修改历史提交的用户信息(仅限未推送到远程的提交):
git commit --amend --author="用户名 <邮箱>" --no-edit
若已推送且必须修改(不推荐,会改写历史),需强制推送:
git commit --amend --author="用户名 <邮箱>" --no-edit
git push --force origin 分支名 # 谨慎使用,可能覆盖团队成员的提交
2.误将敏感文件提交到仓库 需彻底从历史中删除(以 config.ini
为例):
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch config.ini" \
--prune-empty --tag-name-filter cat -- --all
# 推送修改(会改写历史,需通知团队)
git push origin --force --all
同时在 .gitignore
中添加该文件,避免再次提交。
3.拉取代码时提示“Your local changes would be overwritten by merge” 原因:本地有未提交的修改,拉取会覆盖。 解决:
- 提交本地修改:
git add . && git commit -m "暂存本地修改"
- 暂存本地修改:
git stash
,拉取后恢复:git stash pop
附:常用场景命令组合
1.新功能开发完整流程:
# 1. 切换到主分支并拉取最新代码
git checkout main
git pull# 2. 创建并切换到功能分支
git checkout -b feature/user-profile# 3. 开发代码(修改/新增文件)...# 4. 提交代码到本地仓库
git add .
git commit -m "feat: 实现用户资料页编辑功能"# 5. 推送分支到远程(首次需 -u 绑定)
git push -u origin feature/user-profile
2.修复线上紧急 bug 流程:
# 1. 切换到主分支并拉取最新代码
git checkout main
git pull# 2. 创建 bug 修复分支
git checkout -b bugfix/critical-error# 3. 修复代码...# 4. 提交修复
git add .
git commit -m "fix: 修复支付接口超时导致的订单异常"# 5. 推送分支并申请合并到主分支
git push -u origin bugfix/critical-error
3.版本发布流程:
# 1. 确保主分支代码最新且稳定
git checkout main
git pull# 2. 打版本标签
git tag -a v1.2.0 -m "v1.2.0 发布:新增用户资料页,修复支付bug"# 3. 推送标签到远程(触发发布流程)
git push origin v1.2.0