git 指令

Git 指令

Git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
列出所有本地分支
git branch
删除分支
git branch -d [branch-name]
例如: git branch -d dev-peppa-fixGFbug
删除远程分支
git push origin -d dev-peppa-fixGFbug
新建一个分支,但依然停留在当前分支
git branch [branch-name]
切换到指定分支,并更新工作区
git checkout [branch-name]

拉代码
git pull

恢复暂存区的指定文件到工作区
git checkout [file]
恢复暂存区的所有文件到工作区
git checkout .

提交工作区自上次commit之后的变化,直接到仓库区
git commit -a
提交暂存区到仓库区
git commit -m [message]
添加指定文件到暂存区
git add [file1] [file2] ...

上传本地指定分支到远程仓库
git push [remote] [branch]

显示有变更的文件
git status :命令显示工作目录和暂存区的状态。它让我们可以查看哪些更改已提交暂存区,哪些尚未提交暂存区,以及 Git 未跟踪哪些文件。

显示当前分支的版本历史
git log
重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard [commit]

提交流程
git commit -a git pull git push
如果git pull 失败 有人和我同时修改了某个文件
git pull origin feature-ep-new --rebase(解决冲突)
git rebase --continue
git commit -a -m
git push


撤销错误操作
git reflog 查看历史变更记录
git reset --hard 40a9jj(hash)

查看log
git log --pretty=oneline --all --graph --abbrev-commit

https://www.cnblogs.com/ellen-mylife/p/12794245.html

https://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

https://blog.csdn.net/dingyi4815313/article/details/114068189

Fatal: Not possible to fast-forward, aborting - 简书](https://www.jianshu.com/p/5f4772dc60c2)

Git status 查看仓库状态——迹忆客

Git 删除本地或远程分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
场景1 无干扰提交文件
git diff
//查看这次我都改动了什么,也就是工作区和暂存区的区别
git commit -a -m 'this is a submit'
//从工作区到暂存区到本地仓库
git pull
//远端如果有修改也fetch merge 了
git push

使用场景2 查看一下当前状态,
git branch
git diff
git status
git log
git diff --cached 或 git diff --staged 查看暂存区和上一次commit的区别
git diff HEAD 查看已缓存的与未缓存的与上一次commit所有改动:
//以上查看的都是本地记录的当前的一些情况
git branch -a
git pull git log
//会把其他分支的修改记录也显示,但是不影响当前分支当前工作区本地仓库内容

使用场景3 自己分支commit成功,但是push远端产生冲突
git pull 不能正确fetch + merge
git pull origin feature-ep-new --rebase
// 这时候本地工作区是合并的内容 本地暂存区和仓库呢
// 需要再add commit 才能push还是直接push
// 仓库也是合并的内容了,应该可以直接push了
git push

使用场景4 只想commit一部分文件,且要解决远程冲突
git add a.cpp
git commit -m 'change a'
git commit -a -m 'change all'
git checkout -b newbranch // 这时这个branch应该保存了全部改动

git checkout oribranch
git reflog //查到只改a的commit id
git reset --hard hashid //此时应该只有a改了,其他还是原样
git pull //合并冲突
git push

自己再用的时候把newbranch merge到当前branch


使用场景5 更新并且看看当前branch更新了啥
git pull //拉取自己branch远程的更新和其他branch更新的信息
//其他branch的更新会从git log上显示,但是不会更新本地自己的branch
git log
git diff hashID1 hashID2 //查看两次提交更新了什么

场景六 git diff
git diff //不加参数即默认比较工作区与暂存区
git diff hashID1 hashID2 //查看两次提交更新了什么
git diff HEAD//工作区与最新本地commit的(HEAD)区别
git diff --cached 或 git diff --staged
//显示暂存区(已add但未commit文件)和最后一次commit(HEAD)之间的所有不相同文件的增删改
git diff <分支名1> <分支名2> //比较两个分支上最后 commit 的内容的差别

场景七 checkout 部分文件
git checkout hashID file
git checkout BestBuild_2023-11-08-16 ./filter.cpp
看diff没有区别 但是需要commit 然后push

git–本地分支与远程分支_Andyato0520的博客-CSDN博客

1
2
拉代码
git clone --branch <branchname> --depth=1 romete.git
1
2
3
4
5
6
7
merge 分支,将主分支 dev-video merge到自己的分支dev-video-attlit上:
git checkout dev-video
git pull
git checkout dev-video-attlit
git pull
git merge dev-video
git push
1
2
3
4
5
6
7
8
9
10
11
12
从当前分支master 拉出新分支 dev
$git checkout master
$git pull

$git checkout -b dev 新建分支,此时分支已经clone了master的内容
$git push origin dev 推送到远端
$git pull 想从远端dev拉代码到本地dev
$git branch --set-upstream-to=origin/dev (关联远端?
$git pull

单纯新建分支
git branch dev

git从已有分支拉新分支开发_git 拉取新分支_苦咖啡-bit的博客-CSDN博客

https://www.runoob.com/git/git-branch.html

git 拉取远程指定分支 pull本地不存在的分支 - 哈姆PP - 博客园

1
2
3
反正就是解决不了冲突或者不在分支上
git checkout master
git reset --hard origin/master
1
2
3
4
5
删除git分支 
1 git branch --delete dev-video-attlit 删除本地分支
如果没有完全merge 需要强制删除 git branch -D dev-video-attlit
2 git push origin --delete dev-video-attlit 删除远程分支
3 git branch --delete --remotes dev-video-attllit 删除之间的联系
1
2
3
4
5
6
7
8
9
关于tag
tag是git版本库的一个标记,指向某个commit id标记的 快照记录指针
tag 默认打在最近一次commit上
新建tag
git tag v1.6
指定commit id打tag
git tag v0.9 f52c633(hash
根据某个commit创建本地分支(同样也可以根据tag创建新分支
git checkout 12345678 -b newBranch

Git中tag的用法及作用简介 - 之鹿喵 - 博客园

Git: git tag 使用小结(给发布版本打标记,切换并修改某个历史版本) - 夜行过客 - 博客园

Git配合GPG签名

1
2
3
4
5
6
7
当配置好GPG之后 每次commit
git commit -a -S -m "My commit msg"
如果不想在每次提交时都键入-S标志,则可以告诉 Git 自动签名您的提交:
git config --global commit.gpgsign true
如果忘记了签名并且已经commit
git rebase --exec "git commit --amend --no-edit -n -S" -i hashID
一步步补签再push

https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E5%86%99%E5%8E%86%E5%8F%B2

git 配合beyond compare

mac 安装位置如下

1
git config --global mergetool.bc4.cmd '"/Applications/Beyond Compare.app/Contents/MacOS/bcomp" "$LOCAL" "$REMOTE"'

https://blog.csdn.net/hjp9221/article/details/123561864

c++程序编译过程

c++ 程序编译过程

总的来说分成四个阶段:预处理 编译 汇编 链接

预处理

  1. 预处理器(cpp)将所有的#define删除,并且展开所有的宏定义(例如#define PI 3.14 这句在预处理阶段,后期的所有PI都会被替换成3.14)。
  2. 处理所有的条件预编译指令,比如#if、#ifdef、#elif、#else、#endif等。
  3. 处理#include预编译指令,将被包含的文件直接插入到预编译指令的位置。
  4. 删除所有的注释。
  5. 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
  6. 保留所有的#pragma编译器指令,因为编译器需要使用它们。
  7. 使用gcc -E hello.c -o hello.i命令来进行预处理, 预处理得到的另一个程序通常是以.i作为文件扩展名。

读取源代码并对其中的以#开头的指令和特殊符号进行处理。包括宏定义,条件编译,头文件,特殊符号。将.cpp 转化成 .i

编译优化

首先 通过词法分析和语法分析,确认所有的指令都符合语法规则。其次将其翻译成等价的中间代码表示或汇编代码。template和inline函数在此阶段处理。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的,和硬件有关。将 .i 转化成.s

全局变量,静态全局变量,类的静态数据成员,都在编译时分配内存空间,完成初始化。

而静态局部变量则是在第一次使用到的时候分配内存并且初始化。

汇编

将汇编代码转换成二进制机器码

通常一个目标文件中至少有两个段,代码段和数据段. 将 .s 转化成.o

链接

链接程序的主要工作就是将有关的目标文件彼此相连接,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。主要分动态链接(.so)和静态链接(.a) .将 .o 转化成.out

后缀名 描述
.c/.C/.cc/.cp/.cpp/.cxx/.c++ 源代码文件,函数和变量的定义/实现
.h 头文件,函数和变量的声明
.ii 编译预处理产生的文件
.s 编译产生的汇编语言文件
.o (.obj in Windows) 编译产生的中间目标文件
.a 打包目标文件的库文件
.so 编译产生的动态库文件
.out (.exe in Windows) 链接目标文件产生的可执行文件

VC++6.0中Compile和Build的区别

“compile”是“编译”的意思,“build”是“链接”的意思。
compile 的作用是对你的代码进行语法检查,将你的文本程序语言转化成计算机可以运行的“01010….”形式的二进制文件。
build 的作用是将你在程序中调用到的类库融合到你的程序中,比如你用到了printf()函数,那么内部实现该函数的类库代码就会添加到你的程序中。
compile过程生成“.obj”文件或”.o”文件,这个和编译器有关,vc++中是“.obj”文件。
build过程生成“.exe”文件。这个可以直接运行
理论上来说应该先点”complile”,再点”build”。不过在vc++中直接点“build”它会自动先给你compile再build

参考

https://blog.csdn.net/u011718663/article/details/118163962

https://blog.csdn.net/hexkang/article/details/126402730

https://www.cnblogs.com/sxy370921/p/11726583.html

C/C++的编译过程 | 分阶段的汇编指令

C++中全局变量,静态变量,静态局部变量 的初始化和内存分配问题_For Nine的博客-CSDN博客

mac 连接网盘

Mac 连接到服务器并在代码中访问

在go中选择 connect to severe

输入服务器地址 例如ftp://10.100.116.21 smb://

选择connect按钮

根据输入的连接类型和地址 输入相应的账户密码即可连接

ftp与smb的不同

Smb 可以提供用户登入 SAMBA 主机时的身份认证,以提供不同身份者的个别数据, 所以输入的账户密码可能克ftp不同,且访问到的文件夹和ftp也不同

访问时

/Users/../../Volumes/10.100.116.21/

或者直接相对路径一路../../

找不到时

在 Finder 里Finder Setting 里 show Connected servers 勾选上

c++ 散乱学习之关键字

c++ 中基础语法

public 和 private

分为成员变量成员函数的和继承。

对于变量和函数来说:

public是类的成员函数,类的实例变量都可访问;private是类的实例变量不能访问,但是优元函数,变量可以访问。

对于继承来说:

派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员。(意思就是无法直接修改基类的private变量)

派生类的实例变量,可以访问基类的public成员,但是无法访问protected、private成员。

在我们的class attentionlight里,所有变量都是private的,不需要外部修改访问。细节实现逻辑函数都是private,不需要暴露。new 函数 set函数 transform函数是public的。外部接口调用。

static

https://blog.csdn.net/hhg337372083/article/details/89213878

static修饰变量

只初始化一次,在运行前就初始化了。生命周期是程序运行结束才释放的。

被 static 修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要 new 出一个类来,

类中static 变量独立于类的任意一个对象,其值修改被类的所有对象看到

static数据成员必须在类定义的外部定义,通常放在包含类的非内联成员函数定义的文件中。

但是也有例外,const static 数据成员可以在类的定义体中进行初始化,因为const定义时必须初始化。

static修饰函数

static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用

被 static 修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要 new 出一个类来

“ 为什么 ”static成员函数由于不与任何对象关联,因此它不具备this指针,因此,它无法访问属于类对象的非静态数据成员,也无法访问
非静态成员函数。也就是说,类的静态成员函数,只能调用该类的其它静态成员函数和静态数据成员。 但是在我们的工程里面有 static New呢

http://legendtkl.com/2014/09/30/cplusplus-static-and-virtual/

const

  1. 限定变量为不可修改。

  2. 限定成员函数不可以修改任何数据成员。

  3. const与指针:

    const char *p 表示 指向的内容不能改变 ; char * const p,就是将P声明为常指针,它的地址不能改变,是固定的,但是它的内容可以改变。

https://blog.csdn.net/shihuboke/article/details/79286669

virtual

感觉是方便子类进行多态的

override

https://blog.csdn.net/i_chaoren/article/details/77281785

防止子类在继承时,没有重写覆盖父类函数。仅在成员函数声明之后使用时才是区分上下文的且具有特殊含义;否则,它不是保留的关键字。使用 override 有助于防止代码中出现意外的继承行为。

typename

install asitop

install asitop 但是找不到

pip3 install asitop

安装成功了,但是显示

1
2
3
Installing collected packages: asitop

WARNING: The script asitop is installed in '/Users/PeppaZhu/Library/Python/3.9/bin' which is not on PATH.

然后无法运行asitop which whereis都找不到

需要添加环境变量

1
echo -e 'export PATH="$PATH:/Users/PeppaZhu/Library/Python/3.9/bin"' >> $HOME/.bash_profile

然后就可以了

然后下次打开咋又不行了呢

需要source ~/.bash_profile 使得环境变量生效

YUV storage

令人迷惑的YUV存储模式

奇怪的知识增加了

除YUV之外,经常提到的还有 YPbPr 和 YCbCr。YPbPr 指模拟分量信号(或接口),P(Parallel)表示并行,b 下标表示蓝,r 下标表示红。YCbCr 指的是数字分量信号(或接口),C(Chroma)表示色度。YCbCr 还可指色彩空间,YCbCr 色彩空间是 YUV 色彩空间的缩放和偏移版本。

YUV采样方式

主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。这些采样方式,不压缩 Y 分量,对 UV 分量的压缩程度不同。

YUV存储方式

存储模式分成三大类:

packed:将 Y、U、V 分量交织存放在一起,和 RGB 的存放方式类似。内存中排列形式类似:YVYUYVYUYVYUYVYU…。在具体的存储模式命名中,packed 格式不带后缀 P。

planar:将 Y、U、V 的三个分量分别存放在不同的矩阵(平面)中。内存中排列形式类似:YYYYYY…,UUUUUU…,VVVVVV…。在具体的存储模式命名中,planar 格式带后缀 P。

semi-planar:将 Y、U、V 三个分量放在两个矩阵(平面)中。Y 占用一个平面,UV 共用一个平面。内存中排列形式类似:YYYYYY…,UVUVUV…。在具体的存储模式命名中,semi-planar 格式带后缀 SP。

存储方式加上采样方式

https://developer.aliyun.com/article/782082

其中有些常用的

semi-planar 存储模式 YUV420SP

NV12:

1
2
3
4
5
6
7
Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
U V U V
U V U V

NV21:

1
2
3
4
5
6
7
Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
V U V U
V U V U

planar 存储模式 YUV420P

YU12/IYUV/I420:

1
2
3
4
5
6
7
8
9
10
Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
U U
U U
---
V V
V V

YV12:

1
2
3
4
5
6
7
8
9
10
Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
V V
V V
---
U U
U U

一段读取YUV420数据的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class VideoCaptureYUV:
def __init__(self, filename, size):

​ self.width, self.height = size

​ self.Y_len = self.width * self.height

​ self.UV_len = self.width * self.height // 4

​ self.f = open(filename, 'rb')

​ self.Y_shape = (self.height, self.width)

​ self.UV_shape = (self.height//2, self.width//2)



​ def read_raw(self):

​ raw = self.f.read(self.Y_len)

​ Y = np.frombuffer(raw, dtype=np.uint8)

​ Y = Y.reshape(self.Y_shape)



​ raw = self.f.read(self.UV_len)

​ u = np.frombuffer(raw, dtype=np.uint8)

​ u = u.reshape(self.UV_shape)





​ raw = self.f.read(self.UV_len)

​ v = np.frombuffer(raw, dtype=np.uint8)

​ v = v.reshape(self.UV_shape)

​ return Y,u,v



​ def read(self):

​ Y,u,v = self.read_raw()

​ img = np.concatenate((Y.reshape(-1), u.reshape(-1), v.reshape(-1)))

​ img = img.reshape((self.height * 3 // 2, self.width)).astype('uint8') # YUV 的存储格式为:I420(YYYY UUVV)

​ \#print(yuv.shape)

​ bgr = cv2.cvtColor(img, cv2.COLOR_YUV2BGR_I420)

​ return bgr

ffmpeg record

深海巨坑ffmpeg的使用记录

服务器上安装

apt install ffmpeg

将多帧图像合成视频

ffmpeg -r 30 -i output_video/%05d.jpg -vcodec libx264 -vf zscale=matrix=709:r=full output_video_fullr.mp4

-vf zscale=matrix=709:r=limited负责转换色域,否则默认转出来是BT.601之类的SD标准。显式指定limited 色域很多种,limited显得饱和度高一些,full色域大,同样数据显得饱和度低一些

这个链接 https://fireattack.github.io/blog/2018/07/03/ffmpeg-commands.html

编码质量控制: -c:v libx264 -preset veryslow -crf 0

将yuv视频分png

ffmpeg -s 1080x720 -pix_fmt yuv420p -i dst_1080x720_30Hz_P420.yuv -vf scale=in_range=full:out_range=full output_ori/%05d.png
-vf scale=in_range=full:out_range=full 来控制色彩
这个链接 https://www.bilibili.com/read/cv6601959/

截取视频片段

按照时间截取

ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:00:00 -to 00:00:05 cutout.mp4 -y

按照帧截取

ffmpeg -i input.mp4 -vf”select=between(n,20,200)” -y -acodec copy cutout.mp4

将YUV转成MP4

ffmpeg -s 640x480 -pix_fmt yuv420p -i output.yuv out3.mp4

将MP4转YUV

ffmpeg -i input.mp4 -s 640x480 -pix_fmt yuv420p output.yuv

视频分帧

ffmpeg -i backlit.mp4 -r 30 backlit/%05d.png

如果改成jpg会有严重压缩

如果转化成png还有压缩的话,可以先将mp4转成yuv, yuv单帧的质量也就是图片单帧能达到的最高质量。然后将yuv视频转化成图像。

将视频拼接

ffmpeg -i peppa_v3_fullr.mp4 -i peppa_v5_fullr_.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" compair_peppa_v3v5.mp4

这个链接 https://blog.csdn.net/Gary__123456/article/details/88742705

转封装

ffmpeg -i xx.mov c:v copy xx.mp4

视频resize

ffmpeg -i testbanding.mp4 -s 1280:720 -aspect “16:9” testbanding_1280x720.mp4

一张图片转视频

ffmpeg -r 10 -f image2 -loop 1 -i 1.jpg -s 1080x1920 -pix_fmt yuvj420p -t 4 -vcodec libx264 1.mp4