生产环境部署与协同开发 Git
目录
一、前言——Git概述
1.1 Git是什么
1.2 为什么要使用Git
什么是版本控制系统
1.3 Git和SVN对比
SVN集中式
Git分布式
1.4 Git工作流程
四个工作区域
工作流程
1.5 Git下载安装
1.6 环境配置
设置用户信息
查看配置信息
二、git基础
2.1 本地初始化仓库
编辑
2.2 文件的两种状态
查看文件状态命令
untracked未跟踪
tracked已跟踪
2.3 文件加入暂存区
文件(文件夹)复制一份放入暂存区命令
文件从暂存区删除命令
文件夹从暂存区删除命令
查看暂存区所有文件命令
2.4 文件提交与删除
文件(文件夹)提交命令
查看本地仓库(版本库)中的文件
删除文件
修改commit信息
挽救已被删除的文件或目录
一、前言——Git概述
1.1 Git是什么
Git是一种代码托管技术。在开发中,Git是一种代码托管技术,很多代码托管平台也是基于Git来实现的。Git可以帮我们做到很多的事情,比如代码的版本控制,分支管理等。
注意:
我们可以把Git理解成是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。正是因为有了Git的存在,现在很多工作才可以变得相对轻松。
1.2 为什么要使用Git
什么是版本控制系统
你可以把一个版本控制系统(缩写VCS)理解为一个“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照(称之为“版本” )时,版本控制系统可以显示出当前版本与上一个版本之间的所有改动的细节。
想法:
因为我们怕在原来的基础改错了东西,没法恢复,所以,我们可能会有多个毕业论文的文件。而我们写代码的时候本身就是「多人协作」的,修改是无法避免的,我们不希望有多个文件的产生,又希望能够记录每次更改的内容。“
这个软件用起来就应该像这个样子,能记录每次文件的改动:
版本 | 文件名 | 用户 | 说明 | 日期 |
---|---|---|---|---|
1 | service.doc | 张三 | 删除了软件服务条款5 | 7/12 10:38 |
2 | service.doc | 张三 | 增加了License人数限制 | 7/12 18:09 |
3 | service.doc | 李四 | 财务部门调整了合同金额 | 7/13 9:51 |
4 | service.doc | 张三 | 延长了免费升级周期 | 7/14 15:17 |
注意:
结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪。
1.3 Git和SVN对比
SVN集中式
集中式版本控制系统需要找一个服务器作为大本营,所有的代码都需要提交到服务器上进行统一的管理。当你需要对代码进行改动时,需要先从服务器上下载一份拷贝,修改完成之后,还需要上传回服务器。
SVN优缺点
优点:
- 管理员也可以轻松掌控每个开发者的权限。
- 代码一致性非常高。
- 适合开发人数不多的项目开发。
缺点:
- 服务器压力太大,数据库容量暴增。
- 如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。
Git分布式
在分布式版本控制系统中,大家都拥有一个完整的版本库,不需要联网也可以提交修改,所以中心服务器就显得不那么重要了。
注意:
Git记录版本历史只关心文件数据的整体是否发生变化。Git 不保存文件内容前后变化的差异数据。
Git优缺点
优点:
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵活。
- 任意两个开发者之间可以很容易的解决冲突。
- 离线工作。
缺点:
- 学习周期相对而言比较长。
- 不符合常规思维。
- 易学难精.
1.4 Git工作流程
四个工作区域
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
工作流程
Git的工作流程一般是这样的:
-
在工作目录中添加、修改文件;
-
将需要进行版本管理的文件放入暂存区域;
-
将暂存区域的文件提交到git仓库(本地仓库)。
1.5 Git下载安装
注意:
在Windows操作系统中安装 Git之前,先从官方网站(Git)下载合适的Git版本。
鼠标右键桌面出现如图选项的时候表示git安装成功。
1.6 环境配置
当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息。
设置用户信息
鼠标单击 Git Bash Here执行以下命令:
git config --global user.name "zj"
git config --global user.email "xxxxxxxx@qq.com"
查看配置信息
检查当前设置的用户名和邮箱
git config --list
git config user.name
注意:
通过上面的命令设置的信息会保存在~/.gitconfig文件中。我们也可以通过修改这个文件夹来修改我们的个人信息。
二、git基础
2.1 本地初始化仓库
1、创建一个文件夹temp,目的是为了让git对该文件进行版本控制。
2、在temp文件夹中打开git命令窗口并输入以下指令:
git init #初始化这个目录让Git对这个目录开始进行版本控制。
此时会在文件夹中会创建一个隐藏的文件叫.git即表示当前目录是工作区目录。
2.2 文件的两种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
注意:
Git不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。
查看文件状态命令
git status
可以使用 -s 参数来获取简短的输出结果,常见的几种状态码如下所示:
状态码 | 描述 |
---|---|
A | 暂存区中新增的文件 |
D | 文件被删除 |
M | 文件被更改 |
R | 文件被重命名 |
?? | 工作区中未被跟踪的文件 |
untracked未跟踪
未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged(已跟踪状态),就相当于是将文件放到暂存区中。
tracked已跟踪
被纳入版本控制
- Staged
暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存,文件状态为Modified。
-
Unmodified
文件已经入库, 未修改, 即版本库(本地仓库)中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified,如果使用git rm移出版本库, 则成为Untracked文件。
-
Modified
文件已修改, 仅仅是修改, 并没有进行其他的操作(还没从版本库拿出来放到暂存区). 这个文件也有两个去处, 通过git add可使文件进入staged状态放到暂存区, 使用git checkout 则丢弃修改过的文件,返回unmodify状态, 这个git checkout即从版本库中取出文件, 覆盖当前修改。
注意:
这些文件的状态会随着我们执行Git的命令发生变化
2.3 文件加入暂存区
文件(文件夹)复制一份放入暂存区命令
git add 文件名(或者是文件夹名)
git add . #表示将该文件下未跟踪的文件(文件夹)全部放到暂存区
文件从暂存区删除命令
git reset 文件名 #文件从暂存区删除会回到工作区变为未跟踪状态。
git rm 文件名 #将暂存区和工作区的文件都删除
文件夹从暂存区删除命令
git reset 文件夹名 #将文件夹和文件夹中的文件从暂存区放到工作区
git rm -rf 文件夹名 #将暂存区和工作区的文件夹和文件夹中的文件都删除
查看暂存区所有文件命令
git ls-files
2.4 文件提交与删除
如果仅是通过git add命令把移动加到暂存区,还不算是完成整个流程。如果想让暂存区的内容永久保存下来,就要使用git commit命令。
文件(文件夹)提交命令
git commit -m "提交信息" #将暂存区中所有的文件复制到本地仓库一份
查看本地仓库(版本库)中的文件
git ls-files --with-tree=HEAD
删除文件
git rm 文件名 #删除工作区和暂存区的文件(前提是文件添加到了本地仓库中) git commit -m"删除xxx文件" #在执行git rm的基础上继续使用该命令会将版本库中的文件删除(前提是版本库中存在该文件)
参数:
- -m : 本次提交做了什么事,只要简单、清楚的文本说明即可,中英文都可以重点是说清楚,能让自己和别人很快明白就行。
假设我们在temp文件夹中创建一个文件夹叫aaa,一个文件叫ccc.txt,在aaa文件夹下又创建一个叫bbb.txt的文件。此时这些文件全部都在工作区中是未跟踪状态,我们使用git add . 命令将这些文件一次性全部放到暂存区中,此时这些文件就从未跟踪状态变成了跟踪状态。此时我们使用git ls-files命令可以查看在暂存区中的全部的文件包括文件夹。
如果我们想把ccc.txt仅从暂存区删除仍保留工作区的ccc.txt文件时可以使用git rm --cached ccc.txt命令将暂存区的文件删除,此时工作区的ccc.txt文件就又变成了未跟踪状态。
但是如果想把aaa文件夹以及该文件夹下的bbb.txt文件从暂存区删除的话只能使用git rm -rf aaa 命令将文件从暂存区和工作区删除。
如果想要将暂存区中的aaa文件夹及其子文件bbb.txt和ccc.txt文件添加到本地仓库的话需要使用 git commit -m"提交信息"命令来提交,使用git ls-files --with-tree=HEAD 命令可以查看本地仓库中的全部文件。如果想删除本地仓库中的ccc.txt文件的话需要先使用 git rm ccc.txt 命令删除暂存区工作区中的文件,然后再使用git commit -m"删除ccc.txt" 命令删除本地仓库中的ccc.txt文件。要想删除本地仓库中的aaa文件夹及其子文件夹bbb.txt需要先使用git rm -r aaa 命令将文件从暂存区和工作区删除再使用git commit -m"删除aaa文件" 命令删除本地仓库中的aaa文件和bbb.txt文件。
修改commit信息
身为程序员,难免会遇到一些不太顺心的客户或项目。心情不好的时候,在代码或Commit信息中“发泄”一下情绪也是很常见的,只是这要是让客户看见了总是不好解释。
要改动Commit记录有几种方式。
(1)把.git目录整个删除(不建议)。
(2)使用git rebase命令来改动历史记录。
(3)先把 Commit用git reset命令删除,整理后再重新Commit。
(4)使用--amend参数改动最后一次的Commit的信息。
git log --oneline #查看进行了哪些commit操作
git commit --amend -m "测试commit2" #使用amend命令修改最后一次提交的信息
挽救已被删除的文件或目录
“人有失手,马有失蹄”,人总会有不小心或状态不好的时候。不管是有意还是无心 在Git中如果不小心把文件或目录删除了,是可以挽救回来的,这也是使用版本控制系统最主要的原因之一。但是前提是暂存区或者本地仓库中存在该文件。
删除本地文件夹中的文件
rm -rf 文件名称(或者文件夹名称)
注意不是 git rm -rf 文件名,这是将暂存区和工作区中的该文件删除的命令。
将本地删除的文件恢复到本地
git checkout 文件名(或者文件夹名)git checkout . #将删除的全部文件都恢复
小技巧:
这个技巧不仅可以将删除的文件挽救回来,当改动某个文件后反悔了,也可以用它把文件恢复到上一次Commit的状态。不是所有情况下都能恢复被删除的文件的。因为整个Git的记录都是放在根目录下的 .git目录中,如果这个目录被删除了,也就意味着历史记录也被删除了,那么删除的文件也就不能恢复了。
文件添加至忽略列
一般我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以在工作目录中创建一个名为 .gitignore的文件(文件名称固定),列出要忽略的文件模式。
touch .gitignore #在git命令行创建.gitignore文件
注意:
- #匹配规则和linux文件匹配一样
- #以斜杠“/”开头表示目录
- #以星号“*”通配多个字符
- #以问号“?”通配单个字符
- #以方括号“[]”包含单个字符的匹配列表
- #以叹号“!”表示不忽略(跟踪)匹配到的文件或目录
# / 表示当前文件所在的目录# 忽略public下的所有目录及文件
/public/*#不忽略/public/assets,就是特例的意思,assets文件不忽略
!/public/assets# 忽略具体的文件
index.class# 忽略所有的class
*.class# 忽略 a.class b.class
[ab].class
2.5 日志记录操作
git log #查看日志
参数:
- --graph : 查看分支合并图
- --oneline : 标记把每一个提交压缩到了一行中
git reflog #获取执行过的命令
2.6 比较文件差异
diff是指的是两个事物的不同。例如在Linux系统中,diff命令会逐行比较两个文本的差异然后显示出来。
git diff [--cached]
三、Git远程仓库
码云(地址: https://gitee.com/)是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快。
3.1 注册码云和创建远程仓库
3.2 远程仓库操作
添加远程仓库
git remote add <shortname><url>
注意:
- shortname :远程仓库的名字(可以随意取名)
- url : 远程仓库地址
查看远程仓库
git remote
克隆远程仓库
就是将gitee上的代码拉取到本地
git clone 远程仓库地址url
移除无效的远程仓库
git remote rm 远程仓库名字
3.3 推送和拉取
推送
当你想分享你的代码时,可以将其推送到远程仓库。
git push [远程仓库的名字][分支名称]
注意第一次提交会让你输入username(你注册的手机号码)和password(你设置的密码)
拉取
git pull #从远程仓库获取最新版本到本地仓库
3.4 多人协作冲突问题
为什么会出现冲突问题
- 不同分支下的合并
- 同一个分支下的pull后者push
相关文章:

生产环境部署与协同开发 Git
目录 一、前言——Git概述 1.1 Git是什么 1.2 为什么要使用Git 什么是版本控制系统 1.3 Git和SVN对比 SVN集中式 Git分布式 1.4 Git工作流程 四个工作区域 工作流程 1.5 Git下载安装 1.6 环境配置 设置用户信息 查看配置信息 二、git基础 2.1 本地初始化仓库 编辑…...

Qt/C++编写视频监控系统80-远程回放视频流
一、前言 远程回放NVR或者服务器上的视频文件,一般有三种方式,第一种是调用厂家的SDK,这个功能最全,但是缺点明显就是每个厂家的设备都有自己的SDK,只兼容自家的设备,如果你的软件需要接入多个厂家的&…...

用于设计和分析具有恒定近心点半径的低推力螺旋轨迹研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

MongoDB - 构造复杂查询条件执行查询
文章目录 1. 构造 keyword 的查询条件2. 构造 threatSubType 的查询条件3. 相应的实体类 /*** 查询白名单详情** param offset 第几页开始* param limit 每页显示的最大值* param keyword 模糊搜索值* param order 排序方式(升序/降序…...

如何从ChatGPT中获得最佳聊天对话效果
从了解ChatGPT工作原理开始,然后从互动中学习,这是一位AI研究员的建议。 人们利用ChatGPT来撰写文章、论文、生成文案和计算机代码,或者仅仅作为学习或研究工具。然而,大多数人不了解它的工作原理或它能做什么,所以他…...

深入浅出:手把手教你实现单链表
一、什么是链表 链表是一种链状数据结构。简单来说,要存储的数据在内存中分别独立存放,它们之间通过某种方式相互关联。 如果我们使用C语言来实现链表,需要声明一个结构体作为链表的结点,结点之间使用指针关联。 二、单向链表的结…...

vite 打包项目后访问显示空白页的问题,开发环境正常,生产环境无报错。
有没有可能, 你跟我遇到同样的问题 白屏的写法 const routes [{path: /,component: import(../views/index.vue),} ]正确的写法 const routes [{path: /,component: () > import(../views/index.vue),} ]有时候方向很重要,当在错误的方向上无脑冲…...

打造成功的砍价营销大解析,销量飙升
砍价活动是吸引顾客的一种有效方式,可以帮助提高销量和提升品牌知名度。在乔拓云平台上,我们提供了一套简单易用的工具,让您能够轻松地制作一个成功的砍价活动。下面,我将详细介绍具体步骤,让您能够轻松上手。 第一步&…...

【Flink进阶】- Flink kubernetes operator 常用的命令
目录 1、应用程序管理 (1)提交 Flink 应用程序 (2)查看 Flink 应用程序列表...

ASP.NET Core 的日志系统
ASP.NET Core 提供了丰富日志系统。 可以通过多种途径输出日志,以满足不同的场景,内置的几个日志系统包括: Console,输出到控制台,用于调试,在产品环境可能会影响性能。Debug,输出到 System.Di…...

android13(T) 以太网设置工具类
13 版本的以太网设置和以前版本有所变动,在 AS 中就能直接调用对应 API 将 build.gradle 版本修改 compileSdkVersion 31, 即可直接调用 EthernetManager 相关, 设置静态等方法可以通过反射调用设置。 以下是核心设置静态和动态参数工具类,…...

电脑报错提示xinput1_3.dll缺失怎么办?xinput1_3.dll丢失的简单恢复方案
今天,我将为大家分享一个与我们日常工作息息相关的话题——xinput1_3.dll丢失的4种解决方法。在我们的日常工作和生活中,电脑出现问题是常有的事,而xinput1_3.dll丢失则是其中较为常见的一种问题。那么,什么是xinput1_3.dll?它为…...

unity 之参数类型之引用类型
文章目录 引用类型引用类型与值类型的差异 引用类型 在Unity中,引用类型是指那些在内存中存储对象引用的数据类型。以下是在Unity中常见的引用类型的介绍: 节点(GameObject): 在Unity中,游戏对象ÿ…...

SpringBoot自定义工具类—基于定时器完成文件清理功能
直接复制粘贴既可!! import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.File; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneOff…...

安卓设置混淆后,gson报错解决方法
一,设置开启混淆release {minifyEnabled truezipAlignEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro } 二,混淆的文件中,对gson相关类不进行混淆,否…...

WPF实战项目十四(API篇):登录注册接口
1、新建UserDto.cs public class UserDto : BaseDto{private string userName;/// <summary>/// 用户名/// </summary>public string UserName{get { return userName; }set { userName value;OnPropertyChanged(); }}private string account;/// <summary>…...

10个免费PPT下载资源网站分享
PPT超级市场https://pptsupermarket.com/ PPT超级市场是一个完全免费的PPT模板下载网站,不需要注册登录,点击下载就能直接使用。 叮当设计https://www.dingdangsheji.com/ 叮当设计是一个完全免费的PPT模板下载网站,每一套PPT的质量都很高。除…...

SpringCloud入门——微服务调用的方式 RestTemplate的使用 使用nacos的服务名初步(Ribbon负载均衡)
目录 引出微服务之间的调用几种调用方法spring提供的组件 RestTemplate的使用导入依赖生产者模块单个配置的情况多个配置的情况没加.yaml的报错【报错】两个同名配置【细节】 完整代码config配置主启动类controller层 消费者模块进行配置restTemplate配置类controller层 使用na…...

Python基础篇(16):python中__new__方法
一、__new__方法的定义 __new__() 方法是一种负责创建 类实例 的 静态方法 二、__new__方法的作用 在内存中为对象分配空间返回对象的引用 三、__new__方法的使用 创建对象时自动调用__new__方法,并且是在__init__初始化方法之前被调用Python解释器获得对象的引…...

linux并发服务器 —— 文件IO相关函数(三)
文件IO 以内存为主体,看待输入输出; 标准C库IO函数带有缓冲区,效率较高; 虚拟地址空间 虚拟地址空间是不存在的,一个应用程序运行期间对应一个虚拟地址空间; 虚拟地址空间的大小由CPU决定,位…...

matlab使用教程(27)—微分代数方程(DAE)求解
1.什么是微分代数方程? 微分代数方程是一类微分方程,其中一个或多个因变量导数未出现在方程中。方程中出现的未包含其导数的变量称为代数变量,代数变量的存在意味着您不能将这些方程记为显式形式 y ′ f t , y 。相反,您可以…...

vue3组合式api <script setup> props 父子组件的写法
父组件传入子组个的变量, 子组件是无法直接修改的, 只能通过 emit的方式, 让父组件修改, 之后子组件更新 <template><div class"parent">我是父组件<son :msg"msg" :obj"obj" chan…...

Compose - 自定义作用域限制函数
一、概念 在 Compose 中对于作用域的应用特别多。比如 weight 修饰符只能用在 RowScope 或者 ColumnScope 作用域中,item 组件只能用在 LazyListScope 作用域中。 标准库中的作用域函数如 apply()、let() 会以不同方式持有和返回上下文对象,调用它们时 L…...

【Flutter】Flutter 使用 photo_view 实现图片查看器
【Flutter】Flutter 使用 photo_view 实现图片查看器 文章目录 一、前言二、photo_view 简介三、安装与基本使用四、使用 PhotoViewGallery 展示多张图片五、完整示例六、总结 一、前言 大家好,我是小雨青年,今天我要给大家介绍一个在 Flutter 中非常实…...

电脑组装教程分享!
案例:如何自己组装电脑? 【看到身边的小伙伴组装一台自己的电脑,我也想试试。但是我对电脑并不是很熟悉,不太了解具体的电脑组装步骤,求一份详细的教程!】 电脑已经成为我们日常生活中不可或缺的一部分&a…...

【云原生之Docker实战】使用Docker部署flatnotes笔记工具
【云原生之Docker实战】使用Docker部署flatnotes笔记工具 一、flatnotes介绍1.1 flatnotes简介1.2 flatnotes特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载flatnotes…...

XSSchallenge1-20
test1 第一题直接在test插入XSS代码即可 test2 第二关对内容进行”“包裹 这里可以采用”>来绕过 test3 代码审计发现这里用了htmlspecialchars函数,这个函数对<>和’ “等进行了转义,这里可以用事件来绕过 test4 这里用了str_replace&a…...

centos 7的超详细安装教程
打开虚拟机,创建一个新电脑 我们选择经典,然后选择下一步 我们选择稍后安装,我们在后面进行改设备 因为centos系统是linux系统的一个版本,所有我们选择linux,版本选择centos 7 64位,然后就是点击下一步 这一…...

代码随想录算法训练营第五十二天 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组
代码随想录算法训练营第五十二天 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组 300.最长递增子序列674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 题目链接 视频讲解 给你一个整数数组 nums ,找到其中最…...

计算机图形软件(三)6-6 小结
小结 这一章概括了图形软件系统的主要特点。某些软件系统,如 CAD 软件包和绘图程序,其为特定应用而设计。另外一些软件系统则提供可以在诸如 C的程序设计语言中使用的一个通用图形子程序库,用来为任何应用生成图片。 ISO和AN…...