电子商务网站分析/广州日新增51万人
Git基本操作
创建化仓库
mkdir 目录
cd 目录
git init
配置本地仓库
# 配置用户名,邮箱
git config user.name "cxf"
git config user.email "1969612859@qq.com"
# 查看本地配置(小写的 L)
git config -l
# 重置配置(如果出现多个值,则需要使用 --unset-all)
git config --unset user.name
git config --unset user.email
# 全局配置。一台服务器上可以创建多台本地仓库,当前机器所有git仓库都生效
git config --global user.name "cxf"
git config --global user.email "1969612859@qq.com"
# 查看日志
# git log
git log --pretty=oneline
添加/取消文件
# 添加单个文件到暂存区(索引)
git add xxx文件
# 添加多个文件到暂存区(索引)
git add xxx文件1 xxx文件2 xxx文件3
# 取消暂存区单个文件
git reset xxx文件1
# 取消暂存区多个文件
git reset xxx文件1 xxx文件2 xxx文件3
git commit -m "xxx信息"
查看 .git文件
tree .git/
cat .git/refs/heads/master
存储的就是索引
修改文件
# 查看状态
git status
# 比对前后内容差异
git diff xxx文件
diff --git a/ReadMe b/ReadMe(a代表改变前,b代表改变后)
— a/ReadMe(–代表之前)
+++ b/ReadMe(++代表之后)
@@ -1 +1,2 @@(-1:改变前的第一行,+1改变后的第一行开始,直到第二行结束)
hello git(原来的内容)
+hello word(修改后新增的内容)
版本回退
回退的是版本库的内容
- soft:回退版本库
- mixed:回退版本库,暂存区
- hard:回退版本库,暂存区和工作区
工作区 | 暂存区 | 版本库 | 本质是回退的版本库的内容 |
---|---|---|---|
git world | git world | git | git --soft |
git world | git | git | git --mixed(默认) |
git | git | git | git --hard(慎用) |
可以根据版本ID进行回退
# 根据版本号回退
git reset --hard 版本ID
# 回退到当前版本
git reset --hard HEAD
# 回退到当前版本的上一个版本
git reset --hard HEAD^
# 回退到当前版本的上两个版本
git reset --hard HEAD^^
当回退之后版本号也就会跟着消失,如果回退错了想回退到回退之前版本可以使用 reflog
git reflog
我们再回退到已经回退的 hello world 版本
撤销修改
背景:开发三四天代码,但一直没有执行 add 操作。此时我们如果要回退的话,就需要将新增的代码进行删除。
前提是:
commit
之后没有push
git diff xxx文件
此时我们知道了绿色的字体就是我们新增的代码,但如果工程量很大的时候一行一行的删除代码会出BUG而且效率低下。
因此我们如果没有 add 操作可以使用 checkout 操作进行撤销更改
git checkout -- xxx文件
工作区自动回退到最近一次文件的修改
如果不加上 – 则会使切换分支或者检出特定的提交(也就是将某次commit的状态检出到工作区,即从head指向某个分支最近的一次commit,再从commit回到index,再从index恢复到工作区)
工作区 | 暂存区 | 版本库 | 解决方式 |
---|---|---|---|
xxx code | 1.不推荐手动撤销 2.推荐checkout | ||
xxx code | xxx code | git reset | |
xxx code | xxx code | xxx code | git reset |
删除文件
删除需要3步
# 删除文件
rm file3
# 添加到暂存区
git add file3
# 提交到版本库
git commit -m "del file3"
有一个优化的两步版本
git rm xxx
git commit -m "xxx"
Git分支管理
HEAD 可以指向其它分支
# 创建新分支
git branch xxx
# 查看本地仓库分支(*标记当前所在分支)
git branch(tree .git/refs/heads)
# 查看本地和远程仓库全部分支
git branch -a
# 切换分支
git checkout xxx
# 合并:在分支上完成一些修改之后再切换到主分支执行合并分支(master作为主分支,dev作为其它分支,那么就应该切换到master在进行合并dev分支)
git merge xxx
# dev分支被合并之后就可以删掉(如果当前在dev分支的话处于占用状态就无法删除)
git branch -d dev
每次合并之后主分支master将用dev分支提交的ID
合并冲突
# 创建并切换分支
git checkout -b dev1
# 查看分支
git branch
# 保存操作(.代表当前全部文件由于只修改了ReadMe,所以支队ReadMe有效果)
git add .
git commit -m "md ReadMe:bbb"
git checkout master
git merge dev1
然后就会出现以下错误
这个时候我们要手动处理,全保留或者删除部分。这里保存dev1分支内容
查看一下状态
我们就正常的进行 add和commit 操作之后我们看一下版本号发现最后一次提交的版本号就是我们的master版本号
# 查看分支信息
git log --graph --abbrev-commit
合并模式
在之前合并dev分支之后,历史记录也会跟着消失。此时我们就无法知道此时的代码到底是 merge 进来的还是 master 自己生成的。
# 合并分支
git merge dev2
# 合并分支(这确保了要合并的分支在提交历史中清晰可辨)
git merge --no-ff -m "merge dev2" dev2
# 查看历史纪录
git log --graph --abbrev-commit
BUG分支
背景:如果在 开发分支 上修改BUG,如果修出了更大的BUG则会对线上环境造成更大的影响,因此更好的方法是 新建分支进行修改BUG
# 在dev2分支上进行开发(需要修改dev2的BUG)
git branch -b dev2
# 将dev2工作区的内容剪切到stash中
git stash
# 切换到master主分支进行分支创建
git checkout master
# 在master分支上创建并选择fix_bug分支
git checkout -b fix_bug
# 切换到master主分支
git checkout master
# master合并fix_bug
git merge --no-ff -m "merge fix_bug" fix_bug
# master的BUG修复完毕再切换到dev2分支进行开发
git checkout dev2
# 查看stash存储的内容
git stash list
# 将stash空间里的代码恢复到dev2分支上
git stash pop
# dev2代码开发完成之后再进行提交
git add .
git commit -m "md ReadMe:Done"
# 将dev2新功能合并到master分支上【此时会出现问题,因为master分支上已经修复好了bug而dev2上的bug未修复又开发了新功能】
# 较好地解决方法就是:dev2先合并master分支,这样不会破坏主分支;在master合并dev2分支,这次合并分支就不会出现冲突
git merge --no-ff -m "merge master" master
# 切换到master分支
git checkout master
# 合并dev2分支
git merge --no-ff -m "merge dev2" dev2
# 删除不用的分支
git branch -d fev2 fix_bug
强制删除分支
# 删除分支【当commit提交之后就无法删除】
git branch -d xxx分支
# 强制删除分支【当commit提交之后依旧可以删除】
git branch -D xxx分支
Git远程操作
克隆远程仓库
HTTPS
# HTTPS 克隆下载
git clone https://gitee.com/chenxfwtbu/remote-gitcode.git
# 显示每个远程仓库和其地址
git remote -v
origin: 是远程仓库的默认名称。用于远程和本地仓库之间的推送或拉取,通过该名称就可以获取远程仓库地址
master: 是Git本地仓库默认分支的名称。master分支是最主要的分支,其它分支从master分支上派生。可以在master分支上合并,提交等操作以便管理员管理更新代码
SSH
配置 .ssh 目录下的私钥和公钥【非对称加密】
# rsa算法生成私钥【公钥保存在id_rsa.pub文件中】
ssh-keygen -t rsa -C "自己Gitee的邮箱地址"
# rsa生成一个4096位的密钥对
ssh-keygen -t rsa -b 4096 -C "自己Gitee的邮箱地址"
# ed25519算法生成私钥【公钥保存在id_ed25519.pub中】
ssh-keygen -t ed25519 -C "自己Gitee的邮箱地址"
如果对安全性没有别要求的话使用默认的
rsa算法
非对称加密也行,但ed25519
算法可以更快的速度生成密钥对,咱用更少的存储空间并且提供和rsa算法相当的安全性,因此ed25519也用的越来越多
然后再复制粘贴生成的公钥到Gitee码云
在执行clone操作
# SSH 克隆仓库
git clone git@gitee.com:chenxfwtbu/remote-gitcode.git
向远程仓库推送
# 先查看本地仓库配置项
git config -l
# 先配置用户名和邮箱
git config user.name "chenxfwtbu"
git config user.email "1969612859@qq.com"
# 推送
git push 远程仓库名称 本地分支名称:远程分支名称
# 如果远程和本地仓库的主分支都一样的话可以省略掉 :master
git push origin master
拉取远程仓库
git pull 远程仓库名 远程分支名:本地分支名
# 如果远程和本地分支名一样的话可以省略
git pull origin master
pull:相当于拉取+合并
忽略特殊文件
在日常开发过程中有些文件不想或者不应该上传的远端【保存了数据库密码的文件】。可以在 Git工作区 目录下创建一个 .gitignore 文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
# 如果需要强制让某些文件添加需要加上 -f 参数(但一般不破坏.gitignore规则)
git add -f b.so
# 也可以把排除的文件名前加一个 !
# 当配置文件很多行的时候,可以查看被排出的原因【第三行的*.so将c.so排除在外】
git check-ignore -v d c.so
配置命令别名
# 将命令缩短进行简写
git config alias.缩写 "命令"
标签管理
标签 tag
,可以简单理解为对某一次 commit
的一个表示,相当于起了个别名。
项目发布某个版本的时候,针对最后一次
commit
起一个v1.0
这样的标签来识别里程碑的意义。相较于难记的commit id
,tag
可以很好的让使用者快速回退到某个版本【域名和IP地址的关系】
操作标签
# 为最后一次commit打标签
git tag 标签
# 查看全部标签
git tag
# 为指定的一次提交打标签
git tag 标签 commit id
# 注释标签
git tag -a v0.8 -m "import tag:XXX"
# 查看注释标签
git show 标签名
# 修改标签(不能直接修改,而是删除重建)
git tag -d 标签名
会将最后一次提交的commit id记录在标签v1.0的文件中
为指定的提交打标签
推送标签
在最开始,Gitee上没有标签,需要我们手动推送才可以
# 推送指定标签
git push 远程仓库名 标签名
# 推送全部标签
git push 远程仓库名 --tags
远程仓库中的标签删除建议在网页上操作
本地标签删除操作如下
# 删除指定标签
git tag -d 标签名
# 将删除的标签推送到远程
git push 远程仓库名 :标签名
多人协作
完成准备工作
# 拉取远程全部内容【之前是拉取远程的master主分支内容】
git pull
Ubuntu下开发者1
# 创建本地分支并和远程分支关联
git checkout -b 本地分支名称 远程仓库名/远程分支名
# 查看建立的连接
git branch -vv
# 开发者1aaa
vim file.txt
# 添加
git add .
# 提交
git commit -m "md fiile.txt:aaa"
# 推送(由于已经建立关联,也可以直接git push)
git push origin dev:dev
Win下开发者2
# 创建本地分支
git checkout -b dev
# 本地分支关联远程分支
git branch --set-upstream-to=origin/dev dev
# 开发者2bbb
vim file.txt
# 添加
git add .
# 提交
git commit -m "md filex.txt:bbb"
# 推送
git push origin dev:dev
发现抱错。原因:win下载的时候dev分支和远程origin/dev分支中,file.txt有差异导致的。因此我们需要 pull
一下:将远程分支的内容拉下来解决本地冲突之后再推送给远程
# 拉取远程全部内容而不是部分分支内容
git pull
# 手动修改一下file.txt文件即可
# 添加
git add .
# 提交
git commit -m "merge dev"
查看一下远程仓库,发现已经dev上两个开发者已经完成了代码的修改和发布
将内容合并进master
此时对于开发者1和2的功能还没有合并到master主分支。需要继续以下流程:
- PR合并申请单
- 管理员审批
- merge
开发者1和2谁merge都可以,这里我们就以开发者1来merge做模拟
# dev和master分支获取最新的远程仓库代码
git pull
# 为了防止遗漏,切换到master分支继续拉取一下
git checkout master
git pull
# 然后再切换到dev分支
git checkout dev
# dev分支合并master分支(git merge --no-ff -m "merge master" master报错原因:快进模式和非快进模式合并会无法合并)
git merge master
# 切换到master分支
git checkout master
# 合并dev分支
git merge dev
# 删除dev分支
git branch -d dev
# 推送
git push
最后总结一下流程
- 用
git push 远程仓库名 分支名
推送自己的修改 - 如果推送失败,则因为远程分支比本地更新,需要先用
git pull
试图合并 - 如果合并有冲突,则解决冲突并在本地提交
- 没有冲突或者解决冲突后,再用
git push 远程仓库名 分支名
推送就能成功 - 功能开发完毕,将分支合并到
master
分支最后删除分支
案例2
这一套非常方便,不会有冲突。因此大多数一个功能一个分支
开发者1
# 本地创建分支
git checkout -b feature-1
# 开发function1
vim function1
git add .
git commit -m "add function1"
# 这里不关联,因为远程没有创建对应分支
git push origin feature-1
# 查看远程分支信息
git branch -a
开发者2
# 本地创建分支
git checkout -b feature-2
# 开发function1
vim function2
git add .
git commit -m "add function2"
# 这里不关联,因为远程没有创建对应分支
git push origin feature-2
# 查看远程分支信息
git branch -a
案例3
开发者1
# 获取feature-2分支
git pull
# 本地创建feature-2分支(上文中用的 --set-upstream-to=origin/dev关联的)
git checkout -b feature-2 origin/feature-2
git pull
1.拉取分支内的内容
2.拉取的仓库的内容
开发者2
# 先建立远程和本地分支的链接
git branch --set-upstream-to=origin/feature-2 feature-2
# 开发
# 添加
git add .
# 提交
git commit -m "md func2"
# 切换到master分支
git checkout master
# 拉取远程仓库
git pull
# 切换到feature-1
git checkout feature-1
# 合并master分支(为了预防冲突,不直接在master分支上合并)
git merge master
如果没有冲突就会跳出这个页面(ctr+x离开)
本地的feature-1分支没有关联远程分支
# 将本地分支链接远程分支(也可以直接推送对应分支信息就可以自动生成)
git push origin feature-1
我们最后远程仓库删除分支之后但是本地 git branch -a
依旧能够看到的解决办法
# 获取远程仓库信息
git remote show origin
# 修建仓库分支
git remote prune origin
相关文章:

日常开发中Git命令指北
Git基本操作 创建化仓库 mkdir 目录 cd 目录 git init配置本地仓库 # 配置用户名,邮箱 git config user.name "cxf" git config user.email "1969612859qq.com" # 查看本地配置(小写的 L) git config -l # 重置配置&a…...

API 测试 | 了解 API 接口概念|电商平台 API 接口测试指南
什么是 API? API 是一个缩写,它代表了一个 pplication P AGC 软件覆盖整个房间。API 是用于构建软件应用程序的一组例程,协议和工具。API 指定一个软件程序应如何与其他软件程序进行交互。 例行程序:执行特定任务的程序。例程也称…...

【计算机组成原理】24王道考研笔记——第三章 存储系统
第三章 存储系统 一、存储系统概述 现代计算机的结构: 1.存储器的层次结构 2.存储器的分类 按层次: 按介质: 按存储方式: 按信息的可更改性: 按信息的可保存性: 3.存储器的性能指标 二、主存储器 1.基本…...

学习C语言的好处:
基础编程语言:C语言是其他编程语言的基础,学习C语言可为后续学习打下坚实基础,广泛应用于嵌入式系统、操作系统、网络协议等。 简单易学:C语言语法简单易懂,适合初学者。只需文本编辑器和编译器,即可开始编…...

基于k8s的devOps自动化运维平台架构设计(中英文版本)
▲ 点击上方"DevOps和k8s全栈技术"关注公众号 In the rapidly evolving landscape of software development and IT operations, DevOps has emerged as a transformative approach to bridge the gap between development and operations teams. One of the key ena…...

P450进阶款无人机室内定位功能研测
在以往的Prometheus 450(P450)无人机上,我们搭载的是Intel Realsense T265定位模块,使用USB连接方式挂载到机载计算机allspark上,通过机载上SDK驱动T265运行并输出SLAM信息,以此来实现室内定位功能。 为进…...

深度学习,计算机视觉任务
目录 计算机视觉任务 1.K近邻算法 2.得分函数 3.损失函数的作用 4.向前传播整体流程 5.反向传播计算方法 计算机视觉任务 机器学习的流程: 数据获取 特征工程 建立模型 评估与应用 计算机视觉: 图像表示:计算机眼中的图像&#…...

使用 Docker 部署 canal 服务实现MySQL和ES实时同步
文章目录 0. 环境介绍0. 前置步骤1. 安装Kibana和Elasticsearch2. 安装Canal和Canal Adapter2.1 修改数据库配置2.1.1 修改配置2.1.2 验证mysql binlog配置2.1.3 查看日志文件2.1.4 用JDBC代码插入数据库 2.2 安装Canal Server2.3 安装Canal Adapter修改两处配置文件配置文件取…...

const易错详解
const对比 常量指针 int b; (1)const int *a &b;//常量指针(2)int const *a &b; //常量指针常量指针:指向的变量值不能被修改 
网络安全—黑客技术【自学】
一、黑客是什么 原是指热心于计算机技术,水平高超的电脑专家,尤其是程序设计人员。但后来,黑客一词已被用于泛指那些专门利用电脑网络搞破坏或者恶作剧的家伙。 二、学习黑客技术的原因 其实,网络信息空间安全已经成为海陆空之…...

作为数据产品经理的一天
数据产品经理作为这两年大数据行业的热门职业,经常有小伙伴会问我数据产品经理是做什么的,给大家简单讲下作为数据产品经理的一天是怎么度过得,算是一篇记录文吧,看完或许大家对这个职业的了解会更深入一些。 01 早上10点&#…...

Rust 编程小技巧摘选(7)
Rust 编程小技巧(7) 1. 结构体 Display trait 结构体的两种形式,对应的成员取法不同; 前者用 self.成员变量名 self.x, self.y;后者用 self.成员索引号 self.0, self.1, self.2, ...... use std::fmt::Display; use std::fmt::Result; us…...

爬虫程序中使用爬虫ip的优势
作为一名爬虫技术员,我发现在爬虫程序中使用代理IP可以提升爬取效率和匿名性。今天,我就来详细讲解一下代理IP在爬虫程序中的工作原理及应用。 首先,我们来了解一下代理IP在爬虫程序中的工作原理。当我们使用爬虫程序进行数据采集时…...

json-server的入门
由于前端开发的时候,需要向后端请求数据,有的时候后端还没有准备好,所以需要使用一些简单的静态数据,但是我们更加希望能够模拟请求以及请求回来的过程,这个时候就需要使用json-server Json-Server的介绍 json-server…...

uniapp调查问卷评价功能
我本来用的是uniapp官方提供的组件uni-rate组件,但修改成我想要的样式有点麻烦,于是我就自己手写一个,比用组件简单一点; dom结构 <text class"formTit must">请您对本次活动进行评价</text> <view cl…...

Centos Linux带进度条复制(同步)文件和文件夹
centos linux 内建文件复制/备份命令 rsync 目的:我想从一个磁盘复制一堆文件到另一个磁盘,不希望改变文件的属性(尤其是所有者、还有创建时间、修改时间),最好还得能给我显示进度条。文件太多了,好几百GB…...

从数据仓库到数据结构:数据架构的演变之路
在上个世纪,从电子商务巨头到医疗服务机构和政府部门,数据已成为每家组织的生命线。有效地收集和管理这些数据可以为组织提供宝贵的洞察力,以帮助决策,然而这是一项艰巨的任务。 尽管数据很重要,但CIOinsight声称&…...

kafka-2.12使用记录
kafka-2.12使用记录 安装kafka 2.12版本 下载安装包 根据你的系统下载rpm /deb /zip包等等, 这里我使用的是rpm包 安装命令 rpm -ivh kafka-2.12-1.nfs.x86_64.rpm启动内置Zookeeper 以下命令要写在同一行上 /opt/kafka-2.12/bin/zookeeper-server-start.sh /opt/kafka-2…...

C++笔记之将定时器加入向量并设置定时器的ID为i
C笔记之将定时器加入向量并设置定时器的ID为i code review! 文章目录 C笔记之将定时器加入向量并设置定时器的ID为i关于代码中的void operator()() 运行 代码 #include <chrono> #include <iostream> #include <thread> #include <vector>// 定义定时…...

将一组元素四舍五入到指定精度(小数位数)numpy.around()
【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将一组元素四舍五入 到指定精度(小数位数) numpy.around() [太阳]选择题 关于以下代码说法错误的一项是? import numpy as np anp.array([21.3,9.67,8.5, -1.13, -2.67]) print(【显示】a为…...

tinyint这个值在MySQL中的值有哪些
在MySQL中,TINYINT是一种整数数据类型,用于存储小范围的整数值。它占用1个字节的存储空间,可以表示的值范围是从-128到127(有符号)或者从0到255(无符号)。 以下是在MySQL中使用TINYINT数据类型…...

JVM 内存结构
1、方法区(线程共享) 存储静态变量(静态方法、变量、代码块)、常量池、类信息 2、堆信息(线程共享) 存储实例对象,例如 new 出来的对象信息 A a1 new A() 3、虚拟机栈(线程隔离) 每个线程的都有…...

基于百度语音识别API智能语音识别和字幕推荐系统——深度学习算法应用(含全部工程源码)+测试数据集
目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 翻译3. 格式转换4. 音频切割5. 语音识别6. 文本切割7. main函数 系统测试工程源代码下载其它资料下载 前言 本项目基于百度语音识别API,结合了语音识别、视频转换音频识别以及语句停顿…...

数字万用表测量基础知识--使用DMM测量电流
概览 DMM(即数字万用表)是一种电气测试和测量仪器,可测量直流和交流信号的电压、电流和电阻。本文介绍如何正确使用和理解数字万用表(DMM)。 使用DMM测量电流 另一个常见的测量功能是直流和交流电流测量。电压是通过与电路并联进行测量&am…...

【BASH】回顾与知识点梳理(二十)
【BASH】回顾与知识点梳理 二十 二十. 十六至十九章知识点总结及练习20.1 总结20.2 练习 该系列目录 --> 【BASH】回顾与知识点梳理(目录) 二十. 十六至十九章知识点总结及练习 20.1 总结 shell script 是利用 shell 的功能所写的一个『程序 (prog…...

Arduino驱动SGP40空气质量传感器(气体传感器篇)
目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 SGP40空气质量传感器是业内知名的瑞士公司Sensirion推出的新一代SGP40数字VOC传感器芯片。基于Sensirion的CMOSens技术,SGP40在单个芯片上提供了完整的传感器系统,包括温控微加热板和室内空气质量…...

识别和应对内存抖动
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、案例分析3.1 使用memory-profiler3.2 使用 cp…...

3.3用于共享数据保护的替代工具
用于共享数据保护的替代工具 虽然互斥元是最通用的机制,但提到保护共享数据时,它们并不是唯一的选择;还有别的替代品,可以在特定情况下提供更恰当的保护。 一个特别极端(但却相当常见)的情况,…...

探索数据之美:初步学习 Python 柱状图绘制
文章目录 一 基础柱状图1.1 创建简单柱状图1.2 反转x和y轴1.3 数值标签在右侧1.4 演示结果 二 基础时间线柱状图2.1 创建时间线2.2 时间线主题设置取值表2.3 演示结果 三 GDP动态柱状图绘制3.1 需求分析3.2 数据文件内容3.3 列表排序方法3.4 参考代码3.5 运行结果 一 基础柱状图…...

647. 回文子串
boolean默认类型是false class Solution {public int countSubstrings(String s) {if(s null) return 0;int result 0;int length s.length();boolean[][] dp new boolean[length][length];for(int j0;j<length;j){for(int i0;i<j;i){if(s.charAt(i) s.charAt(j)){i…...