Git使用 简述 
Git 只关心文件数据的整体是否发生变化 ,而大多数其他系统则只关心文件内容的具体差异。 
保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将结果作为数据唯一标识和索引 。 
Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及 a-f)组成。所有保存在 Git 数据库中的内容都用此哈希值作索引 ,而不是靠文件名。 
任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。 
Git 基本流程:
在工作目录中修改某些文件。 
对修改后的文件进行快照,然后保存到暂存区域。 
提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录。 
 
 
 
基本操作 
查看配置信息 
 
获取帮助 
 
$ git help  <verb> $ git <verb> --help  $ man git-<verb> 
对现有的某个项目开始用 Git 管理,只需到此项目所在的目录初始化: 
 
如果当前目录下有几个文件想要纳入版本控制,先用git add命令告诉Git开始对这些文件进行跟踪,然后提交 
 
$ git add *.c 	 $ git add README $ git commit -m 'initial project version'  
克隆仓库 
 
$ git clone  [url] $ git clone  git://github.com/schacon/grit.git 
检查当前文件状态:(工作目录的所有文件都不外乎两种状态:已跟踪或未跟踪。) 
 
$ git status On branch master nothing to commit, working directory clean 
git add :根据目标文件的状态不同,此命令的效果也不同。可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。
忽略某些文件
有些文件无需纳入 Git 管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。
 
文件 .gitignore 的格式规范如下:
 
*.a !lib.a /TODO build/ doc/*.txt doc/**/*.txt 
查看尚未暂存的文件更新了哪些部分,不加参数直接输入 
 
查看已经暂存起来的文件和上次提交时的快照之间的差异 
 
提交更新(先git status看是否都暂存了) 
 
$ git commit -m "Story 182: Fix benchmarks for speed"   
在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤. 
 
移除文件 
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。最后提交的时候,该文件就不再纳入版本管理了。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可:
 
$ git rm  --cached readme.txt 
后面可以列出文件或者目录的名字,也可以使用 glob 模式。比方说: 
 
注意到星号 * 之前的反斜杠 \,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜杠。)。此命令删除所有 log/ 目录下扩展名为 .log 的文件。类似的比如:
会递归删除当前目录及其子目录中所有 ~ 结尾的文件。
移动文件 $ 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