Git资源

Posted by Zhenda on Mon, Jan 8, 2024
Total Views:

[toc]

官方文档

https://git-scm.com/book/zh/v2

git 重要概念

  • commit
    • 以 commit 节点为根基, 记录历史, 当前 commit 为 HEAD
  • branch
    • 分支实际上是可移动的指针, 代表一系列commit
    • 用于并行开发
    • 创建删除非常轻量
  • 代码仓库
    • 远程仓库
      • 部署在服务器中,供用户访问
    • 本地仓库
      • 信息都存放在 .git文件夹 里面, .git文件夹 所在的文件夹就是仓库

git 远程仓库平台

大体流程

流程图

  • 工作区
  • 本地仓库
  • 远程仓库

git 使用方法

基础使用

使用前提: 安装 -> 配置 -> 远程仓库 -> 本地仓库

安装

配置个人信息

1
2
3
4
5
6
# 查看 git 信息
git config -l
# 编辑个人信息来显示提交记录
git config --global user.name "Your Name"
git config --global user.email "Your Email"
git config --global core.autocrlf false

远程仓库

最好使用英文,方便国际化仓库

主要 md 文件

  • README.md 介绍项目
  • CHANGELOG.md 更新日志
  • CODE_OF_CONDUCT.md 代码准则
  • CONTRIBUTING.md 贡献指南
.gitignore

作用: 设置忽略跟踪的文件或文件夹

.gitignore文件编辑的规则:

1
2
3
4
5
6
7
8
# 忽略.log 结尾的文件
*.log
# 忽略.vscode文件夹
.vscode/
# 多级目录下的 config
**/config
# 只忽略根目录下的 fd
/fd/

命令

1
2
3
4
# 查看是否被忽略
git check-ignore -v 文件
# 删除远程仓库
git rm-r -cached 文件名

本地仓库

获得本地仓库

1
2
3
4
5
6
# 克隆
git clone 远程的 ssh
# 初始化
git init
git remote add origin sshxxx
git push --set-upstream origin main

使用流程: pull dev -> new分支 -> 编辑 -> add -> commit -> push

branch

一个功能: 一个branch, 多个commit

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 默认分支命名:
main  # 分支保护, 稳定可发布的分支
dev
origin/xxx-bbb # 远程分支的默认名称是 origin

# 自定义分支名:
feature/xxx-bbb
debug/xxx-bbb
refactor/xxx-bbb
docs/xxx-bbb

backup/xxx-bbb
tmp/xxx-bbb

pull request: 开发分支发起对主分支的合并请求

远程和本地关联

1
2
3
4
5
6
7
8
# 查看关联
git remote -v
# 关联
git remote add origin 远程的 ssh
# 取消关联
git remote rm origin
# 直接设置
git remote set-url origin xxx

切换自己的分支写代码

1
2
3
git checkout dev
git pull
git checkout -b xxx/xxx_branch

commit

1
2
3
git add demo.py
git commit -m "add: demo.py"
git push

进阶使用

1
2
# 本地feature1分支, 同步 远程dev分支 的最新更改
git pull --rebase origin dev

git diff

1
2
3
4
5
6
7
8
9
# 比较文件内容
git diff
git diff commitidxxx -- ./path1/path2/xxx.py

# 查看commit

# e y 上下 , q 退出
git log --stat
git show commmitid

撤销

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11

# 撤销工作区的文件
git checkout xxx.py
# 撤销指定文件的add状态
git reset xxx.py
# 撤销add -> 0
git reset
# 撤销 commit -> add
git reset --soft id
# 撤销 commit -> 0
git reset --hard id

开发了一半

1
2
3
4
5
git stash && git stash drop
git stash save 'xxx'
git stash pop
git stash list
git stash clear

指定文件

1
2
3
4
5
6
7
8
# 拉去指定文件
git checkout 分支名 文件名
# 查看指定文件提交历史
git reflog 文件名
# 回退旧版本
git checkout commitid 文件名
# 回到最新版
git checkout HEAD 

tag

tag 很稳定

通常对main分支的commit, 创建 tag

命名规则: v1.0.0-20230525

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 查所有
git tag
# 查详情
git show tag 名
# 增加
git tag -a 版本名 -m''
# 删除
git tag -d 版本名

# 切换, 和分支一样
git checkout tag 名

# 远程仓库交互
git pull --tags
git push --tags

保持完美提交的方法

提交格式

功能(作用域):描述

功能:

功能名称含义
refactor重构
fix改功能
revert撤销提交
feat新功能
test测试
docs文档
cici流水线
xx!表示不兼容

个人使用

  • add: xxx
  • delete: xxx
  • update

相关命令

1
2
3
4
5
6
7
8

# git rebase 整理 本地commit
git rebase -i commitid
git rebase -i HEAD~3

git rebase --continue
git rebase --abort
git rebase --skip
 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
pick 2a923b73 fix: conf
pick b5b06654 remove: entrypoint.sh

# Rebase 5aa07cc4..b5b06654 onto 5aa07cc4 (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
#                    commit's log message, unless -C is used, in which case
#                    keep only this commit's message; -c is same as -C but
#                    opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified); use -c <commit> to reword the commit message
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
1
2
3
4
5
6
7
8
9
# 修改上次commit
git commit --amend -m ""

# 撤销提交记录
git reset --hard xxx
git push -f

# 空提交, 为了触发自动化动作
git commit -m "retrigger checks" --allow-empty

cherry-pick 合并特定commit

1
2
3
4
5
6
7
8
9
git checkout main
git cherry-pick commitidxxxx
# 有冲突
git add xxx
git cherry-pick --continue 
# 取消 operation
git cherry-pick --abort
# skip patch
git cherry-pick --skip

其他

子模块

使用场景: 一个仓库内嵌套另一个仓库,需要维护好总的仓库

作用: 管理好嵌套结构

标志文件: .gitmodules

命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 一次性 clone 包括子仓库的主仓库
git clone --recurse sshxxxx
# 查看状态
git submodule status
# 详细状态
git submodule summary
# 添加
git submodule add sshxxx <not existed path>
# 删除
git submodule remove <path>
# 批量更新
git submodule update --remote
#
git submodule init
# 对子模块批量操作
git submodule foreach 命令
# 对子模块批量操作
git submodule update --remote --rebase

ci/cd

  • 概念
    • 自动测试/自动部署
  • 实现原理
    • 使用命令自动化执行任务
  • 流程
    • 工具
      • travis ci
      • github
        • actions
          • 自动推送
      • gitee
      • gitlab
    • 配置文件
    • 触发条件
      • 提交代码
      • 定时
  • ci
    • 开发和代码前通过测试用例
    • yaml
      • stages
      • beforescript
        • stage
        • script
          • test1
          • test2
        • tags
        • artifacts
          • when
            • on_success
            • always
          • paths
        • allow_failure
        • retry
          • 2
        • only
  • cd
    • 推送部署
      • 服务器
      • 第三方平台
    • 回滚

使用ssh, 免密码访问

  1. 创建密钥
1
2
3
4
5
# 生成 ssh
ssh-keygen -t rsa -C '你的邮箱地址'

# 测试连接
ssh -T git@github.com
  1. 添加 ssh 公钥 (pub) 到代码仓库 github 或 其他平台

SSH 默认使用端口 22, 如果网络阻止访问, 可以改为 443

~/.ssh/config

1
2
3
Host github.com
    Hostname ssh.github.com
    Port 443

Git Large File Storage

https://git-lfs.com/

 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
Examples
--------

To get started with Git LFS, the following commands can be used.

. Setup Git LFS on your system. You only have to do this once per user
account:
+

git lfs install

. Choose the type of files you want to track, for examples all ISO
images, with git lfs track:
+

git lfs track "*.iso"

. The above stores this information in gitattributes(5) files, so that
file needs to be added to the repository:
+

git add .gitattributes

. Commit, push and work with the files normally:
+

git add file.iso
git commit -m "Add disk image"
git push

参与开源项目

  • 提交 issue
  • 提交代码
    • fork
    • 在分支编写代码
    • pull request
  • 检查代码
    • review pr
  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
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184

-   基础

    -   下载 git软件
    -   ssh
        -   作用
            -   免密码 pull push 代码
        -   安装后,配置密钥
            -   ssh-keygen -t rsa -C '你的邮箱地址'
                -   生成 ssh
        -   在网站创建远程仓库
            -   添加 ssh 公钥 (pub)
            -   仓库名后缀
    -   创建远程仓库

        -   命名规则
            -   小写字符,中横线
        -   开源协议类型
            -   ![开源协议](../imgs/licenses.jpg)

    -   创建本地仓库

        ```bash
        # 克隆,初始化二选一
        # 克隆
        git clone 远程的 ssh
        # 初始化
        git remote add origin sshxxx
        git push --set-upstream origin main
        ```


-   进阶
    -   多个远程仓库关联
        -   fork
            -   获取别人远程仓库,创建一个副本仓库
            -   命令
                -   建立联系
                    -   查
                        -   git remote -v
                    -   增
                        -   git remote add upstream xxxx
                            -   添加上游仓库
                    -   改
                        -   git remote set_url upstream xxxx
                    -   删
                        -   git remote remove upstream
                -   拉代码
                    -   git fetch upstream
                    -   git pull upstream dev
                -   推代码
        -   pull request
            -   发给别人远程仓库进行代码合并

    -   增删改查
            -   git reflog 分支名
                -   按照分支查询
                    -   越往下 越老版本
        -   撤回
            -   git reset
                -   版本号
                -   HEAD~1
            -   git reset --hard
                -   版本号
                -   origin/分支名
        -   增删改
            -   本地仓库
                -   看修改内容
                    -   git status
                        -   查看暂存区
                    -   查看区别
                        -   比较分支
                            -   git diff 分支 1 分支 2 文件路径
                            -   git diff 要比较的分支
                            -   git diff branch1 branch2 --stat
                        -   比较 commit
                            -   git diff commitid1 commitid2
                        -   git diff
                            -   工作区和暂存区区别
                        -   git diff --cached
                            -   本地仓库和暂存区区别
                -   编辑
                    -   新建
                        -   git add
                            -   .
                                -   所有文件
                            -   文件名
                    -   删除文件
                        -   保留工作区的文件
                            -   git rm -r --cached .
                                -   远程仓库上传错了,就用这个删除
                            -   git rm --cached 文件
                        -   git rm -f 文件名
                    -   撤销
                        -   撤销工作区操作
                            -   git checkout -- .
                                -   工作区不要了
                            -   git checkout -- 文件名
                        -   撤销暂存区 add
                            -   git reset
                        -   撤销 commit 到 add
                            -   git reset --soft id
                        -   撤销 commit 到 0
                            -   git reset --hard id
                -   本地提交
                    -   撤销远程提交
                        -   git revert id1 id2
                    -   git commit --amend -m“”
                        -   commit 写错了,重新提交
                    -   提交已经 git add 的文件, 不用再次 git add
                        -   git commit -am ''
            -   上传操作
                -   拉去最新远程代码
                    -   git pull --rebase origin 远程分支
                    -   git pull origin 远程分支
                        -   处理冲突
                            -   编辑代码重新提交 或 git rebase --skip
                        -   -u 表示默认远程分支
                    -   上传
                        -   git push origin 远程分支
                        -   git push --force
                            -   强制推送 reset 后的代码
                    *   git config --global push.default simple
                        -   设置默认
    -   分支
        -   概念
            -   master
                -   对外发布的版本,是主分支
            -   dev
                -   在测试版写,写好了放到 master
            -   其他分支
                -   按照功能或问题来创建分支
        -   每一次开发,创建一个分支,合入后删除分支
        -   需要远程共享代码时
            -   远程仓库和本地仓库的分支一致
            -   查看
                -   git remote prune origin
                    -   删除不存在的远程分支
                    -   git branch
                        -   查看本地所有分支
                        -   退出
                            -   q
                    -   git branch -r
                        -   查看远程分支
                    -   git branch -vv
                        -   查看分支的映射关系
                        -   git branch -u origin/xxx xxx
                            -   绑定本地分支和远程分支
                    -   git branch -a
                        -   查看本地和远程分支
            -   创建
                -   创建本地分支
                    -   git checkout -b 分支名
                        -   创建并切换分支
                    -   git branch 分支名
                        -   在这个分支基础上创建分支
                    -   有一个本地分支
                        -   git push -u origin 分支名
                            -   创建并绑定
                    -   有一个远程分支
                        -   git fetch
                        -   2 选 1
                            -   git checkout 同名的分支名
                            -   git checkout -b 本地分支 origin/远程分支
                                -   创建本地分支并拉取
                -   本地远程分支关联
                    -   git branch --set-upstream-to=origin/main main
            -   删
                -   删除本地分支
                    -   git branch -d 分支名
                -   删除远程分支
                    -   git push origin -d 分支名
            -   改
                -   切换分支
                    -   git checkout 想切换的分支
            -   合并
                -   git pull
                -   git merge 本地或远程分支名
                    -   保持最新代码!!!!!!!!!
                    -   需要保持一个版本差异
                    -   远程分支
                        -   origin/dev
                -   git rebase
            

文件类型

git平台中, 常见的软件安装包

文件名示例平台(系统)架构 / 适配设备说明推荐
.dmgmacOSx64:Intel / arm64:M1/M2/M3Mac 安装包,双击安装即可
.dmg.blockmap自动更新O
.rpmLinuxx64, arm64, armv7l适用于 Fedora / RedHat 系 .rpm
.debDebian/Ubuntu 系统使用的 .deb
.pacmanArch Linux / Manjaro 专用 .pacman
.AppImage通用 Linux 可执行包,免安装O
.Setup.exeWindowsx64, x86, arm64, win7安装包
.blockmap支持自动更新O
.7z绿色版压缩包(无需安装,解压即用)O

文件压缩

为什么会压缩?

图片、音频和视频文件往往包含大量的数据。如果不进行压缩,存储和传输这些文件将变得非常困难 压缩可以减少文件大小,使得音频更容易存储(节省大量空间)和传输(提高传输效率)

不同文件的压缩

对于文本文件,无损压缩是常见的,因为任何数据的丢失都可能导致信息意义的改变。 而对于多媒体文件,有时可以使用有损压缩,因为人眼或人耳可能不会察觉到细微的质量损失,从而可以在可接受的范围内大幅减少文件大小。

压缩分类

压缩类型定义优点缺点适用场景
有损压缩压缩过程中会丢失一些数据,但通常对最终用户体验影响不大文件大小显著减小无法完全恢复原始数据,可能有一定质量损失图片(如JPEG)、音频(如MP3)、视频(如H.264)
无损压缩压缩过程中不丢失任何数据,可以完全恢复原始文件文件大小有所减小,且无质量损失压缩率相对较低,文件大小减小不明显文本文件(如ZIP)、某些图片格式(如PNG)、音频(如FLAC)
不压缩文件未经压缩,保留所有原始数据无质量损失,数据完整文件大小较大,占用更多存储空间和带宽专业音频处理(如PCM)、某些图片格式(如BMP)

文本

文本格式文件扩展名描述用途兼容性
plain text.txt纯文本,无格式信息文本编辑、数据存储极高,所有文本编辑器
Rich Text Format.rtf富文本格式,包含格式信息文本编辑、跨平台文档交换高,多数文本编辑器
Microsoft Word.doc/.docxWord文档格式,包含格式和对象文档编辑、排版高,Microsoft Word及兼容软件
OpenDocument Text.odt开放文档格式,包含格式和对象文档编辑、排版较高,OpenOffice、LibreOffice等
Portable Document Format.pdf用于文档交换的格式,保留格式和布局文档展示、打印极高,Adobe Reader及多数浏览器
Markdown.md轻量级标记语言,转换为HTML文档编写、博客较高,Markdown编辑器及部分文本编辑器
LaTeX.tex排版系统,用于学术文档学术写作、复杂排版较高,LaTeX编辑器
HyperText Markup Language.html/.htm超文本标记语言,关注数据的表现形式, 用于网页网页制作、显示高,所有网页浏览器
XML.xml可扩展标记语言,关注数据的结构和内容用于数据存储和传输

图片

格式特点是否支持透明度是否支持动画压缩方式文件大小适用场景
JPEG/JPG广泛使用,支持高质量压缩有损照片、复杂图像
WebP现代格式,支持高质量压缩和透明度有损/无损网页图片、动图
PNG支持无损压缩和透明度无损中等图标、需要透明背景的图像
BMP位图格式,不压缩或简单压缩无损高质量图像存储(较少使用)
SVG矢量图形,基于 XML 描述无损图标、Logo、可缩放图形
GIF支持简单动画和有限颜色是(仅1位透明)无损动图、简单图形
ICO用于图标文件,支持多分辨率无损网站图标、桌面图标
TIFF/TIF高质量图像存储,常用于印刷无损专业图像处理、印刷

音频

格式特点压缩方式音质文件大小兼容性是否含有字幕
MP3广泛流行,高压缩比有损否(需外部LRC文件)
AACMP3的继任者,音质更好, 兼容性有待提高有损较小中至高否(需外部文件)
OGG开放源代码,音质良好有损中至高是(可包含字幕)
WAV微软开发,支持多种编码无损/有损否(需外部文件)
WMA微软开发,支持版权保护无损/有损中至高否(需外部文件)
AIFF苹果开发,类似WAV无损/有损否(需外部文件)
ALAC苹果无损格式,音质无损无损中等否(需外部文件)
FLAC无损压缩,音质无损无损中等否(需外部文件)
M4A苹果推广, 基于MP4容器,常用AAC编码无损/有损较小中至高是(可包含字幕)
PCM专业音频处理、原始音频数据存储无压缩最高最大专用设备否(需外部文件)

字幕

  • 字幕分离
格式特点兼容性支持嵌入元数据(如标题、作者等)
WebVTT (.vtt)用于网页视频的字幕文件,支持时间同步、样式和元数据高(现代浏览器)
ASS (.ass)高级字幕格式,支持复杂样式、字体、颜色、位置等
SSA (.ssa)ASS 的早期版本,功能类似,但兼容性稍差
SMI (.smi)SAMI 字幕格式,主要用于 Windows Media Player,支持样式
JSON (.json)基于 JSON 的字幕格式,适合程序化处理,结构灵活
STL (.stl)用于广播字幕的文件格式,包含丰富的元数据和样式信息专业设备兼容
TTML (.ttml)结构化字幕文件,用于多种媒体,支持丰富的样式和元数据较广泛兼容
SRT (.srt)简单文本格式,包含时间轴和字幕内容,不支持样式和元数据
LRC (.lrc)歌词字幕格式,常用于音乐播放器,结构简单
SUB (.sub)MicroDVD 字幕格式,通常与视频文件配合使用,支持帧计时
SBV (.sbv)YouTube 使用的字幕格式,类似于 SRT,结构简单
MPL2 (.mpl)简单字幕文件,用于某些媒体播放器,使用帧计时
TXT (.txt)非正式的简单字幕文件,通常用于测试或临时用途
  • 字幕嵌入

MP3 文件可以通过 ID3v2 标签嵌入歌词信息。

支持两种类型的歌词:

  • USLT(Unsynchronized Lyrics):非同步歌词,仅包含歌词文本。广泛支持
  • SYLT(Synchronized Lyrics):同步歌词,包含时间戳信息,实现歌词与音乐同步显示. 支持较少

视频

格式特点压缩方式视频质量文件大小兼容性是否含有字幕
MP4广泛使用,支持多种编码有损较小
WMV .wmv微软开发,适合流媒体有损中至高
WebM开源格式,专为网页优化有损中至高
MPEG数字电视、DVD有损中等中等广泛否(需外部文件)
FLVAdobe开发,常用于网络视频有损否(需外部文件)
AVCHD专为高清视频设计,常用在摄像机有损中等否(需外部文件)
3GP专为移动设备优化有损否(需外部文件)
MKV MKA开放标准,支持多音轨和字幕无损/有损中等
MOV .mov苹果开发,高质量视频无损/有损
AVI .avi微软开发,兼容性强无损/有损否(需外部文件)