Git&Github
Git & GitHub
Git简介
1.1 版本控制具备的功能
- 协同开发:多人并行不悖的修改服务器端的同一个文件。
- 数据备份:不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。
- 版本管理:在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空
间,提高运行效率。这方面 SVN 采用的是增量式管理的方式,而 Git 采取了文
件系统快照的方式。 - 权限控制:对团队中参与开发的人员进行权限控制。对团队外开发者贡献的代码进行审核——Git 独有。
- 历史记录:查看修改人、修改时间、修改内容、日志信息。将本地文件恢复到某一个历史状态。
- 分支管理:允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。
Git官网:https://git-scm.com/
1.2 Git优势
- 大部分操作在本地完成,不需要联网
- 完整性保证:对每次数据提交都会进行hash操作
- 尽可能添加数据而不是删除或修改数据
- 分支操作非常快捷流畅
- 与 Linux 命令全面兼容
1.3本地库和远程库交互方式
1.3.1 团队内部协作
1.3.2 跨团队协作
1.4 Git命令行操作
1.4.1 本地库初始化 git init
- 命令:git init
- 效果:会在当前目录下创建一个 .git的隐藏文件.`
.git 目录存放的是与本地库相关的目录和文件,不要删除
1.4.2 设置签名 git config
作用:用来区分不同开发人员身份
辨析:这里设置的签名和登录远程库(Github)的账号密码没有任何关系。
-
命令:
- 项目级别/仓库级别:仅在当前本地库有效
git config user.name 设置的姓名 git config user.email 设置的email - 系统用户级别:登录当前操作系统的用户范围
git config --global user.name 设置的姓名 git config --global user.email 设置的email
就近原则:项目级别优先于系统用户级别,二者都有时用项目级别的签名
- 项目级别/仓库级别:仅在当前本地库有效
-
效果
-
项目级别信息保存到.git下面的config文件
-
系统用户级别信息存放在~/.gitconfig
1.4.3 查看文件状态 git status
- 命令 :git status
1.4.4 添加 git add
流程:新创建的一个文件,必须先要添加到暂存区,然后再提交到本地库;然后可以push推送到远程库
- git add [filename]
- 将工作区“新建/修改”添加到暂存区
1.新创建一个文件 git init初始化完成后
2.查看文件状态:新创建的文件没有被追踪
3.git add添加到暂存区后,在查看文件状态 :已经被追踪了
4.从暂存区移除文件 git rm --cashed [filename] 文件状态又变成未追踪
5.然后通过git add [filename]继续提交
1.4.5 提交 git commit
- 命令:git commit [filename]
- 命令:git commit -m "给提交的命名" [filename] 常用
将hello.txt文档进行修改 文件状态发生改变 此时相当于你本地文件发生改变了 但是缓存区文件未改变,所以不能直接git commit提交
使用git add将工作区文件添加到暂存区,然后再用命令提交 或者 git commit -a 直接添加并提交,而不能直接git commit提交
git add后再提交 这种提交方式常用 直接命名提交
1.4.6 版本控制 git reset --hard
本质:就是通过移动历史记录中的HEAD指针,实现版本前进后退
查看日志:
- 命令:git log 详细显示
- 命令:git log --pretty=online 每条记录信息一行显示
- 命令: git reflog 常用 HEAD@
1.4.6.1 基于索引值实现版本控制 [推荐]
命令:git reset --hard [局部版本索引值] 可前进可后退
1.4.6.2 基于^符号实现版本控制
只能用于后退
- 命令: git reset --hard HEAD^^^ 回退3步
一个^符号退一次
1.4.6.3 基于~符号实现版本控制
- 命令:git reset --hard HEAD~n 回退n步
1.4.6.4 reset命令三个参数对比
通过git reflog查看本地库变化;通过git status查看暂存区的变化;通过本地文件查看工作区的变化;
初始上本地库、暂存区和工作区是同一个版本
-
--soft参数:仅仅在本地库移动HEAD指针;
相当于你的本地库属新的版本,而暂存区和工作区都处于新的版本,所以对暂存区而言,相当于被修改的文件经过了git add /git commit -a,但是没有经过git commit提交
如果执行git commit提交后,暂存区相当于会和本地库位于同一个版本,但是工作区任然处于上一版本。
-
--mixed参数:1.在本地库移动HEAD参数;2.重置暂存区;
就相当于本地库和暂存区属于同一版本,工作区还停留在上一版本
-
--hard参数:1.在本地库移动HEAD参数;2.重置暂存区;3.重置工作区;
而--hard参数保证本地库,暂存区和工作区版本保持一致;
git提交的记录(不管创建/删除文件)永远存在,即使你将本地文件删除;
1.5 找回本地已删除的文件
前提:创建的文件已经完成提交,提交到了本地库中;
操作:通过git reset --hard [指针指向文件没有删除时候]
首先完成本地库提交
然后删除本地文件
查看状态,将删除状态提交 只要文件被修改,都需要git add重新提交
查看日志,存在两个版本,一个是hello.txt存在提交的版本,另一个删除hello.txt提交的版本
然后通过版本控制回退到上一版本
将文件继续删除
1.6 比较文件前后差异 git diff
命令:git diff [文件名] 将工作区文件和暂存区文件进行比较
命令:git diff [本地库中历史版本] 将工作区和历史版本进行比较
不带文件名比较多个文件
比较:git diff [文件名] 工作区文件和暂存区文件进行比较
比较:git diff [本地库中历史版本] 将工作区和历史版本进行比较
1.7 分支
概念:在版本控制过程中,使用多条线同时推进任务。
1.7.1 分支的优点:
1.同时并行推进多个功能开发,提高工作效率;
2.各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可;
1.7.2 分支的相关命令
1.7.2.1 查看当前所有分支 git branch -v
-v是比较详细显示
命令:git branch -v [推荐] 显示全部分支
1.7.2.2 创建分支 git brach [分支名称]
命令:git branch [分支名称]
1.7.2.3 切换分支 git checkout [分支名称]
命令:git checkout [分支名称]
1.7.2.4 合并分支 git merge [待合并分支名称]
首先将hot-fix分支文件进行修改
命令:git merge [待合并分支名称]
合并分支第一步:切换到接受修改的分支(被合并,增加新内容)上;常将其他分支合并到master,所以切换到master分支上;
合并分支第一步:执行分支合并命令
1.7.3 分支合并的问题
描述:两个分支分别对同一个文件的同一部位修改,然后将一个分支合并到另一个分支,就会产生冲突;
表现为:
解决方法:
- 编辑文件,删除特殊符号,然后修改文件至满意;
- git add
- git commit -m [文件信息] 此时后面不能跟文件名,否则报错;
1.8 Git原理
1.8.1 哈希
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
- 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
- 哈希算法确定,输入数据确定,输出数据能够保证不变
- 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
- 哈希算法不可逆
Git 底层采用的是 SHA-1 算法。
哈希算法可以被用来验证文件。原理如下图所示:
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的工作方式可以称之为快照流。
每一个新版本会保存一个快照信息,快照信息里面包含了指向上一版本的信息
git创建分支本质:创建一个指针,指向当前版本信息;即图中testing分支
切换到testing分支,对testing分支提交修改;
修改当前分支,也即是HEAD节点指向谁,谁就是当前分支;
git切换分支本质:相当于将HEAD节点指向当前分支的指针,即仅仅修改了HEAD指向;
- GitHub
2.1 团队内部协作开发
2.1.1 项目经理创建本地库和远程库
1.创建远程库
2.创建本地库 本地库与远程库可以不同名称;
3.项目经理将文件推送到Github
首先为远程库起一个快捷方式的别名
命令:git remote -v 查看本地库中远程网址
命令:git remote add [别名] [对应远程库HTTPS网址]
命令:git push [远程库对应分支网址信息] [本地分支名称]
推送成功
2.1.2 程序员从远程库进行clone
命令:git clone [远程库克隆信息]
克隆的作用:
-
完整的把远程库下载到本地
-
创建origin远程地址别名
-
初始化本地库 不用人为初始化,就已经存在.git 文件
2.1.3 项目经理邀请程序员加入团队
程序员修改代码后推送到项目经理的远程库
将项目经理邀请链接发送给程序员,程序员确认即可;https://github.com/wustjq/study/invitations
加入群组后,程序员再推送才会成功
程序员的代码推送到远程库后,项目经理还需要进行合并操作
程序员:
项目经理:
可以发现,两者都可在远程库看见,但是本地文件并没有被修改。
我们一般不直接pull ,而是先fetch(必须先拉取,不然切换分支看不到的),再切换到远程库分支进行查看,是否代码已修改好,确认后在merge合并到本地
2.1.4 项目经理合并代码
可发现合并后本地就显示程序员修改代码
pull = fetch + merge
必须先拉取才能合并
命令:git fetch [远程库别名] [远程分支名] 从远程库拉取
命令:git merge [远程库别名/远程库分支名] 合并
2.2 冲突问题
冲突问题:跟前面分支合并方式一样,后修改的人需要先将代码拉取下来,在前人基础上在进行修改;否后修改人直接修改会报错
- 如果不是基于GitHub远程库的最新版所作的修改,不能进行推送,必须先拉取到本地修改;
- 拉取下来后如果进入冲突状态,则按照1.7.3 分支合并解决分支冲突解决方法即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?