Git使用

简述

  • Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。
  • 保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将结果作为数据唯一标识和索引
  • Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及 a-f)组成。所有保存在 Git 数据库中的内容都用此哈希值作索引,而不是靠文件名。
  • 任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
  • Git 基本流程:
    • 在工作目录中修改某些文件。
    • 对修改后的文件进行快照,然后保存到暂存区域。
    • 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录。

基本操作

  1. 查看配置信息
$ git config --list
  1. 获取帮助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
  1. 对现有的某个项目开始用 Git 管理,只需到此项目所在的目录初始化:
$ git init
  1. 如果当前目录下有几个文件想要纳入版本控制,先用git add命令告诉Git开始对这些文件进行跟踪,然后提交
$ git add *.c 	# 加文件名表示跟踪
$ git add README
$ git commit -m 'initial project version'
  1. 克隆仓库
$ git clone [url]
$ git clone git://github.com/schacon/grit.git
  1. 检查当前文件状态:(工作目录的所有文件都不外乎两种状态:已跟踪或未跟踪。)
$ git status
On branch master
nothing to commit, working directory clean

git add :根据目标文件的状态不同,此命令的效果也不同。可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。

  1. 忽略某些文件

    有些文件无需纳入 Git 管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。

$ cat .gitignore
*.[oa]
*~
  1. 文件 .gitignore 的格式规范如下:

    • 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。

    • 可以使用标准的 glob 模式匹配。

    • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。

    • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

#### 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in the doc/ directory
doc/**/*.txt
  1. 查看尚未暂存的文件更新了哪些部分,不加参数直接输入
$ git diff
  1. 查看已经暂存起来的文件和上次提交时的快照之间的差异
$ git diff --cached
  1. 提交更新(先git status看是否都暂存了)
$ git commit -m "Story 182: Fix benchmarks for speed" #说明
  1. 在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤.

移除文件

  1. 要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。最后提交的时候,该文件就不再纳入版本管理了。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f

  2. 另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可:

$ git rm --cached readme.txt
  1. 后面可以列出文件或者目录的名字,也可以使用 glob 模式。比方说:
$ git rm log/\*.log

注意到星号 * 之前的反斜杠 \,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜杠。)。此命令删除所有 log/ 目录下扩展名为 .log 的文件。类似的比如:

$ git rm \*~

会递归删除当前目录及其子目录中所有 ~ 结尾的文件。

移动文件

$ git mv file_from file_to

其实,运行 git mv 就相当于运行了下面三条命令:

$ mv README.txt README
$ git rm README.txt
$ git add README

常用命令总结

$ git config  查看 git config 的相关命令
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
$ gitk 图形化查看分支演变
$ git config merge.tool vimdiff 使用 git mergetool

$ git config --global user.name "Your Name" 配置所有Git仓库的用户名和email, 去掉--global 则只针对当前Git仓库
$ git config --global user.email "email@example.com"
$ git config --global user.name 查看全局配置的用户名和email
$ git config --global user.email

$ git init 把当前目录初始化为git仓库, 不想管理跟踪的文件, 可以在仓库根目录添加.gitignore文件, 在里面写对应规则

$ git clone <repo> 自动把本地master分支和远程master分支对应, 远程仓库默认名称origin
$ git status
$ git add <file>
$ git commit -m "description"
$ git remote add origin git@github.com:serenity/test.git 关联远程仓库 (先有本地仓库)
$ git remote 查看远程库信息
$ git remote -v 查看远程库详细信息
$ git remote rm origin 删除已关联的远程库 origin
$ git push -u origin <branch> 推送本地branch分支到远程, -u绑定本地分支与远程分支,首次推送时加,后续简写为git push/pull
$ git push origin dev 推送本地dev分支到远程库
$ git branch --set-upstream-to=origin/dev dev git pull提示no tracking information,说明本地dev分支和远程dev分支的链接关系没有创建

$ git reflog reference logs(引用日志),恢复本地错误操作
$ git reset --hard HEAD@{1} 回退到指定提交
$ git reset --hard <commit_id>
所有引起HEAD指针变动的操作,都会被记录在git reflog命令中。如以下操作:
* git checkout branchName:切换分支 。
* git commit:提交。
* git reset commit:重置。
* git checkout commit:签出某一个提交。
* git merge:合并操作。
* git rebase:变基。
* git pull:相当于 fetch + merge 。 merge 结果能够体现出时间线, rebase 会打乱时间线。
* git pull : Fast-forward:没有冲突,快速前进。合并分支时不会创建新的commit,所以看不出来曾经做过合并。
* git pull --rebase:相当于fetch + rebase。
* git clone:初始化ref 。

$ git merge dev 合并 dev 分支到当前分支 (当有冲突的时候, 需要先解决冲突)
$ git merge --no-ff -m "merge with no-ff" dev 合并 dev 分支到当前分支(--no-ff 以普通模式合并,强行关闭 Fast forward 合并策略,创建一个新的 commit)
$ git merge --abort 撤销本次merge

丢弃工作区 (Working Directory) 的修改
$ git restore <file> 建议使用
$ git checkout -- <file>

丢弃暂存区 (stage/index) 的修改
$ git restore --staged <file> 第一步: 把暂存区的修改撤销掉(unstage), 重新放回工作区
$ git restore <file> 第二步: 撤销工作区的修改

一个本地库关联多个远程库, 如同时关联 GitHub 和 Gitee
$ git remote add github git@github.com:serenity/test.git
$ git remote add gitee git@gitee.com:serenity/test.git

$ git branch 查看分支列表及当前分支
$ git branch -v 查看各个分支最后一个提交信息
$ git branch -r 查看远程分支
$ git branch -a 查看所有本地和远程分支
$ git branch dev 创建 dev 分支,本地新建的分支如果不推送到远程,对其他人就是不可见的
$ git branch -d dev 删除 dev 分支
$ git branch -D dev 强制删除 dev 分支
$ git branch --set-upstream-to=origin/dev dev 指定本地 dev 分支与远程 origin/dev 分支的链接

$ git switch dev / git checkout dev 切换到dev分支
$ git switch -c dev / git checkout -b dev 创建并切换到新的dev分支
$ git switch -c dev origin/dev / git checkout -b dev origin/dev创建并切换到新的dev分支,同时关联本地dev分支和远程dev分支

$ git diff commitID1 commitID2 commit 比较
$ git diff / git diff -- <文件名> 工作区和暂存区比较
$ git diff remotes/origin/master 工作区与远程分支比较
$ git diff --cached ⽐较暂存区和上⼀次commit后的修改
$ git reset HEAD 暂存区恢复成 HEAD
$ git checkout -- <文件名> 工作区恢复成暂存区文件
$ git push origin --delete <分支名> 删除远程分支
$ git rm -r -n --cached .vscode 展示此命令要删除的文件列表预览
$ git rm -r --cached .vscode 删除远程仓库和git仓库(暂存区和版本库)的文件(夹),本地目录下的文件(夹)不受影响

$ git log --graph 查看分支合并图
$ git log --graph --pretty=oneline --abbrev-commit
$ git log dev ^master 查看 dev 有,而 master 中没有的
$ git log master..dev 查看 dev 中比 master 中多提交了哪些内容

$ git stash 保存当前工作区和暂存区的修改状态(将目前还不想提交但已修改的内容保存至堆栈,后续可以在某个分支上恢复出堆栈中的内容
$ git stash list 查看保存现场的列表
$ git stash pop 恢复的同时把 stash 内容也删除
$ git stash apply 恢复现场, stash 内容并不删除
$ git stash drop 删除 stash 内容
$ git stash apply stash@{0} 多次 stash, 恢复的时候, 先用git stash list查看, 然后恢复指定的 stash

$ git cherry-pick <commit> 复制一个特定的提交到当前分支(当前分支的内容需要先 commit, 然后冲突的文件需要解决冲突, 然后 commit)
$ git rebase 把本地未push的分叉提交历史整理成直线(使得我们在查看历史提交的变化时更容易, 因为分叉的提交需要三方对比)

切换到对应的分支 branch 上, 查看或者操作对应的标签 tag
$ git tag 查看所有的标签
$ git tag <tagname> 打标签,默认标签是打在最新提交的commit上(绑定),如: git tag v1.0
$ git tag <tagname> <commit_id> 给对应的 commit_id 打标签
$ git tag -a <tagname> -m "标签说明信息" <commit_id> 创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -d <tagname> 删除一个本地标签
$ git push origin :refs/tags/<tagname> 删除一个远程标签
$ git show <tagname> 查看标签信息
$ git push origin <tagname> 推送一个本地标签到远程
$ git push origin --tags 一次性推送全部尚未推送到远程的本地标签
删除远程标签, 需要先删除本地标签, 然后在删除远程标签, 如:删除标签 v0.9
$ git tag -d v0.9
$ git push origin :refs/tags/v0.9

git config core.ignorecase false 配置本地仓库文件大小写敏感

Tmux:terminal multiplexer

会话, 窗口, 窗格

根据Tmux的定义,在开启Tmux服务器后,会创建一个会话,该会话会创建一个窗口,其中仅包含一个窗格。Tmux使用C/S模型构建,主要包括以下模块:

  • server 服务器:输入 tmux 命令时就开启了一个服务器,服务器由于管理多个会话。
  • session 会话:一个服务器可以包含多个会话,可以理解成是一个特定的终端组合,通常将同一任务下的工作放到一个会话中。
  • window 窗口:一个会话可以包含多个窗口,一个窗口就相当于普通终端的一个标签,通常在不同的窗口中完成不同的工作。
  • pane 窗格:一个窗口可以被分割成多个小的窗格。

基本使用

使用Tmux快捷键需加上命令前缀Ctrl+b。

Ctrl+b+d 暂时离开当前会话

常用命令

  • 信息查询:

    • tmux list-keys
    • tmux list-commands
    • tmux info
  • 会话控制:

    • tmux new -s session_name
    • tmux attach -t session_name
    • tmux switch -t session_name
    • tmux rename -t old-name new-name
    • tmux list-sessions / tmux ls
    • tmux detach
    • tmux kill-server 关闭所有 session
  • 窗口控制:

    • tmux new-window
    • tmux list-windows
    • tmux select-window -t :0-9
    • tmux rename-window
  • 窗格控制:

    • tmux split-window 水平划分
    • tmux split-window -h 垂直划分
    • tmux swap-pane -[UDLR] 在指定方向交换 pane
    • tmux select-pane -[UDLR] 在指定方向选择下一个 pane
  • 其他操作:

    • tmux clear-history 清空输出缓冲区

常用快捷键

基本操作

命令 说明
? 列出所有快捷键;按 q 返回
d 脱离当前会话,可暂时返回 Shell 界面
s 选择并切换会话;在同时开启了多个会话时使用
L 切换回上一次的会话
D 选择要脱离的会话;在同时开启了多个会话时使用
: 进入命令行模式;此时可输入支持的命令,例如 kill-server 关闭所有tmux会话
[ 复制模式,光标移动到复制内容位置,空格键开始,方向键选择复制,回车确认,q/Esc 退出
] 进入粘贴模式,粘贴之前复制的内容,按 q/Esc 退出
~ 列出提示信息缓存;其中包含了之前 tmux 返回的各种提示信息
t 显示当前的时间

窗口操作

命令 说明
c 创建新窗口
& 关闭当前窗口
[0-9] 数字键切换到指定窗口
p 切换至上一窗口
n 切换至下一窗口
l 前后窗口间互相切换
w 通过窗口列表切换窗口
, 重命名当前窗口,便于识别
. 修改当前窗口编号,相当于重新排序
f 在所有窗口中查找关键词,便于窗口多了切换

窗格操作

命令 说明
将当前面板上下分屏
% 将当前面板左右分屏
x 关闭当前分屏
! 将当前面板置于新窗口,即新建一个窗口,其中仅包含当前面板
q 显示面板编号
o 选择当前窗口中下一个面板
{ 向前置换当前面板
} 向后置换当前面板
z 最大化当前所在面板
方向键 移动光标选择对应面板
page up 向上滚动屏幕,q 退出
page down 向下滚动屏幕,q 退出
alt+o 逆时针旋转当前窗口的面板
ctrl+o 顺时针旋转当前窗口的面板
ctrl+方向键 以 1 个单元格为单位移动边缘以调整当前面板大小
alt+方向键 以 5 个单元格为单位移动边缘以调整当前面板大小

复制模式(copy-mode)

Tmux的使用类似于vim,在窗口中要自由的复制文本,可以进入复制模式,使用 prefix + [ 进入复制模式:

  • 按 space 开始复制,移动光标选择复制区域
  • 按 Enter 复制并退出 copy-mode。
  • 将光标移动到指定位置,按 prefix + ] 粘贴

如果启用鼠标,可以用鼠标选中要复制的文本,prefix + ] 粘贴。还可以按住 shift 键,然后再用鼠标选中要复制的文本,此时是系统正常的复制,需要鼠标右键选择复制才能复制文本。在 Mac OSX 上,该快捷功能键是 option.

其他技巧

同步窗格

在一个窗口下的多个窗格中同时同步执行一个命令操作。需开启 synchronize-panes 配置。进入命令模式 Ctrl-B: 然后输入以下指令开启或关闭窗口同步:

:setw synchronize-panes on  # 开启窗口同步

:setw synchronize-panes off # 关闭窗口同步

配置

/etc/tmux.conf 全局配置,~/.tmux.conf 用户配置。例如Tmux也可以像vim一样使用底行命令模式,我们重新配置其快捷键跟vim一样使用 :,在配置文件中添加如下内容:

# bind : to command-prompt like vim

\# this is the default in tmux already

bind : command-prompt

在命令行模式输入tmux 命令执行相关动作。

vim–write once, use anywhere

示例

:h option-list

普通模式是Vim的自然放松状态。从进入插入模式到返回普通模式为止,在此期间输入或删除的任何内容都被当成一次修改。在撤销时如果想拥有更细的粒度,则尽量减少插入模式停留时间。
<CR> <Esc>o

i I/a A($a)/o(A<CR>) O(ko)
x/2x/dw/daw/dap/diw/d2w/2dw/dw./db/dd/2dd/d0/d$/dt)
.  重复上次修改
>G  从当前行到末尾行统一增加缩进
r R/s S(^c$)/c C(c$) caw ciw c2” cc(S)
/ n/N */#
y/yiw/yt,/yy/p
v/viw/V/ctrl+v(块状选择) y/p/d/u
ctrl+h/w/u 编辑模式下删除前一个字符/单词 /当前行

w/W 移到下一个word/WORD开头
e/E 移到下一个word/WORD尾
b/B 移到上一个word/WORD开头
cw/cW
A word ends at a non-word character, such as a “.”, “-” or “)”.
A WORD ends strictly with a white-space. This may not be a word in normal sense.

行间搜索移动 f/F{char} t{char}
;/, 前进/回退

0/$/^ 行首/行尾/第一个非空白字符

gg/G/ctrl+o 文件首/尾/快速返回上一次停留位置
H/M/L 屏幕开头/中间/结尾
ctrl+u/f 不同模式下上下翻页
zz 将本行置为屏幕中央

.,$/% s/\<pattern\>/target/g c n
/pattern <CR> cw target <Esc> n .

使用ctrl+c/[ 代替esc
Ctrl+r 撤消以前的撤消命令,恢复以前的操作结果。
gi 快速跳转到最后一次编辑的地方并进入插入模式

:vs/sp filename
:e filename
:ls :b n :bpre :bnext :bfirst :blast :b buffer_name
<ctrl+w> w/h/j/k/l/H/L

:tabnew filename gt/gT

:reg name [a-z] 复制专用寄存器

”+ p 粘贴系统剪贴板内容

:e! 重新加载内容,不保存修改

vim宏 q{reg} 录制 q 停止 @{reg} 回放
全选 + :normal I” 批量操作

ctrl+n/p 补全单词
ctrl+ x ctrl +f 补全文件名
:ctrl+p 切换上一个命令
vim a.c b.c -O

:w !sudo tee % > /dev/null

num<Ctrl-a/x > 对数字执行增/减,若光标不在数字上,则正向查找并跳转
g~/gu/gU 反转大小写/转为小写/转为大写
>/< 增加缩进/减小缩进

插入-普通模式是普通模式的一个特例。在此模式中,可以执行一个普通模式命令,执行完后又返回到插入模式。要从插入模式切换到插入-普通模式,可以按 < C-o >

:h ex-cmd-index
:'<,'>normal .  对高亮选区中的每一行执行普通模式下的 . 命令
:%normal A;

终端快捷键
ctrl+h/w/u 删除前一个字符/单词 /当前行
ctrl+a/e 快速移动到开头/结尾
ctrl+f/b 前移/后移

macOS

brew search / info <packageName>
brew -v/-h/list/update/outdated/upgrade/cleanup -n/cleanup [包名]

w 查看谁正在登录当前mac

shutdown -r now 重启

zmodload 对可加载zsh模块执行特定操作

which -a cmd

tree | more

echo $SHELL
cat /etc/shells
chsh -s /bin/zsh 切换shell

sudo -i 判断root权限

open /bin 打开目录

open -a vscode file 使用某应用打开文件

open -e setting.json 文本编辑器打开文件(-t使用默认编辑器)

md5 /usr/bin/clang*

du -sh /usr/bin/clang*

sudo killall coreaudiod 重启声音控制器

smartctl -a disk0

ioreg -rn AppleSmartBattery | grep -i capacity

cmd + opt + shift + v 将剪贴板的内容粘贴为「纯文本格式」
cmd + opt + v 剪切/移动文件
cmd + opt + esc 强制退出应用
cmd + opt + d 快速显示或隐藏程序坞
ctrl + cmd + 空格 快速插入 Emoji 表情
shift + cmd + 3 保存当前窗口图片(到桌面)
ctrl + shift + cmd +3 复制当前窗口图片
shift + cmd + 4 保存选中区域图片(到桌面)
shift + cmd + 5 录制屏幕
ctrl + shift + cmd + 4 复制选中区域图片
cmd + shift + z 重做

App权限被写入名为TCC.db的数据库的access表中,这个数据库有两个:
~/Library/Application\ Support/com.apple.TCC/TCC.db:存储用户相关的权限,可以直接用root权限修改。一般不会出问题,也不需要手动添加
/Library/Application\ Support/com.apple.TCC/TCC.db:存储系统权限,需要关闭系统完整性保护(SIP)才能修改。绝大多数手动添加的情况都需要修改这个文件

禁用SIP(第二次操作时环境有问题需要 csrutil clear):
1、关机
2、长按电源键,直到显示进入恢复模式
3、选择实用工具-终端
4、执行命令 csrutil disable/enable
5、重新启动 sudo mount -uw /

sudo /usr/bin/sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "INSERT or REPLACE INTO access VALUES('kTCCServiceCamera','com.tencent.meeting',0,2,4,1,NULL,NULL,NULL,'UNUSED',NULL,0,1637381304);"

kTCCServiceMicrophone/kTCCServiceScreenCapture

sudo sqlite3 /Users/xiaoyu/Library/Application\ Support/com.apple.TCC/TCC.db

.help 可以展示sqlite3的一些命令指令
.databases 展示数据库
.table 当前数据库的表
.schema access 查看建表语句

CREATE TABLE IF NOT EXISTS "access" (
service TEXT NOT NULL,
client TEXT NOT NULL,
client_type INTEGER NOT NULL,
auth_value INTEGER NOT NULL,
auth_reason INTEGER NOT NULL,
auth_version INTEGER NOT NULL,
csreq BLOB,
policy_id INTEGER,
indirect_object_identifier_type INTEGER,
indirect_object_identifier TEXT NOT NULL DEFAULT 'UNUSED',
indirect_object_code_identity BLOB,
flags INTEGER,
last_modified INTEGER NOT NULL DEFAULT CAST(strftime('%s', 'now') AS INTEGER),
PRIMARY KEY (service, client, client_type, indirect_object_identifier),
FOREIGN KEY (policy_id) REFERENCES policies (id) ON DELETE CASCADE ON UPDATE CASCADE
);

homebrew 自家酿酒 (下载 source code 回来做 local compile)
brew 命令根据配方 formula,酿造出一桶(keg)酒,即 keg 指整个编译完成的套件资料夹,预设目录在 /usr/local/Cellar/,地窖。
「keg-only」表示这个套件只会存放在桶子里,不会跑出桶子外,即 brew 不会帮你做 symlink 到 /usr/local,避免原生系统内还有一套 llvm 而打架,所以提示消息说 llvm 套件是 keg-only。

echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.zshrc
echo 'export LDFLAGS="-L/opt/homebrew/opt/llvm/lib"' >> ~/.zshrc
echo 'export CPPFLAGS="-I/opt/homebrew/opt/llvm/include"' >> ~/.zshrc

Makefile关系到整个工程的编译规则。
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

CMake是一个跨平台的编译工具,并不直接构建出最终软件。通过与开发平台无关的脚本 CMakeLists.txt 来定制整个编译流程,输出各种各样的Makefile或者project文件。

Shell

cd -  在两个目录间来回切换
command > file 覆盖重定向
command >> file 追加重定向
command < file 输入重定向
cat << EOF > file 内联输入重定向
cd /opt ; ls 使用分号;连接多个命令
find . -name "*.c" | xargs wc -l
$ > rumenz.txt 快速清空一个文件
lsof -p $$ 查看当前进程打开的文件
curl -i www.baidu.com | head -n 1 检查网站是否可用
wget -m -p -E -k -K -np -v http://www.baidu.com
netstat -a/-r 显示详细网络状况/系统路由表
mtr [www.baidu.com](http://www.baidu.com) 检测到达xx网站所有节点的通信质量

shell脚本开头最好写出作者Author,时间Create time,版本号Release,描述Script Description
~ 家目录(虚拟目录)
! 执行上一次命令
$ 取内容符号
\+ - * / % 加减乘除取余
& 后台执行
\* 通配符,匹配所有
? 匹配一个字符
; 在一行中多条命令用分号隔开
| 上一条命令的输出是下一条命令的输入
\ 转义字符,\* 看成乘法
` 反引号,在命令中执行命令
'' 表示字符串,但是不解释变量
"" 表示字符串,解释变量

man -k 关键字 使用关键字搜索手册页
man 1 intro 指定内容区域搜索手册页
killall http* 通过进程名结束进程, 支持通配符

!! 唤回并重用历史列表中最近的命令
! + [编号] 唤回并重用历史列表中任意一条命令
set 显示一份完整的当前环境变量列表
$? 保存上个已执行命令的退出状态码,查看命令执行成功与否,0表示正常终止
$$ 当前进程

用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F "." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -20

Vscode
cmd-shift-p,toggle vim mode 关闭vim模式
c++开发配置
tasks用于在launch前执行编译任务,launch则是用来读取可执行文件。

GitHub
github1s.com
在线vscode:仓库详情界面按下“。”键
在线运行项目:项目地址前加上“[gitpod.io/#/”前缀](http://gitpod.io/#/”前缀)

Wireshark https抓包-macOS
在终端执行命令,打开新的 Chrome 浏览器
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --user-data-dir=/tmp/chrome --ssl-key-log-file=/tmp/.ssl-key.log
打开 Wireshark - Perferences - Protocols - TLS ,在 (Pre)-Master-Secret log filename 输入
/tmp/.ssl-key.log 然后就可以抓到 https 包了。

安装:rpm -ivh xxx.rpm
卸载:rpm -e xxx.rpm
升级:rpm -U xxx.rpm
查询安装包:rpm -q 包名
查询包信息: rpm -qpi 列出文件包描述信息
查询包文件: rpm -qpl 列出文件包包含的文件
查询匹配包 rpm -qa|grep -i 关键字(不区分大小写)
yum install
yum update
yum remove
yum search
yum deplist 查询依赖
yum info 查询包信息

gdb —args
-g 可执行程序与源码之间映射
set args 设置程序参数
list->l 查看源代码
run->r 启动
continue->c 继续运行
finish 结束当前函数,返回到函数上一层调用点
return 立即结束执行当前函数,并返回
break->b 添加永久断点
backtrace->bt 查看当前线程调用堆栈
where 查看我们所在的调用栈
frame->f 与backtrace结合使用,切换不同堆栈
info break->info b 查看设置的断点信息
disable 断点编号:禁用断点编号对应断点
enable 断点编号:重新开启断点编号
delete 断点编号:删除对应断点
print->p 查看变量值
ptype 输出变量类型
info threads 查看当前进程的所有线程的运行情况
thread 切换不同线程
info args 查看当前函数参数值
next->n 执行下一条命令(逻辑上
step->s 单步步入
until n 快速执行完中间的代码,并跳到第 n 行
quit->q 退出gdb