工具汇总

持续更新

Posted on Oct.24, 2019


Linux

  • Tmux-终端复用
    https://www.cnblogs.com/kevingrace/p/6496899.html https://www.cnblogs.com/lizhang4/p/7325086.html
  • tmux new -s sessionname ; ctrl b + ①% or " ; ②o ; ③ctrl+方向键 ④x
  • ctrl+b x 是关闭当前面板。 会话session → 窗口window → 面板pane, 不要误操作了
  • 恢复会话: tmux at [-t 会话名] 列出所有会话: tmux ls 关闭会话: tmux kill-session -t 会话名
  • nohup
  • nohup [command] & 挂在后台运行也是ok的 日志信息
  • 日志信息进阶:nohup python3 -u src/main.py --cuda >./training.log 2>&1 &
    -u 参数 解决python执行有缓存输出的问题~
    查看log:训练日志可能很长,使用cat比较费时,可以使用tail -n 5 training.log,来查看最后5行。更方便与watch搭配
  • gpustat-基于nvidia-smi https://github.com/wookayin/gpustat
  • nvidia-smi 指标中P0~P10表示频率, nvidia-smi dmon则可以看更详尽的指标
  • watch --color -n1 gpustat --color
  • lsblk查看设备 mount进行挂载 就可以操作外接U盘、硬盘了
  • awk 示例: awk '{print $5}' $fileName : 一行一行的读取指定的文件, 以空格作为分隔符,打印第五个字段
  • awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
  • 命令大全 https://www.runoob.com/linux/linux-command-manual.html
  • Linux Tools Quick Tutorial
  • linux基础
    linux工具进阶
    工具参考篇
  • 统计文件个数
  • find [path] -type f/d | wc -l
  • ls -l [path] | grep "^-/d" | wc -l
  • python: len(os.listdir(path))
  • 只查看一级目录统计的空间占用
  • du -h -d1
  • -d1 表示只进入下一级目录
  • 查看目录树
  • 文件树
  • find . -print 2>/dev/null|awk '!/\.$/ {for (i=1;i < NF;i++){d=length($i);if ( d < 5 && i != 1 )d=5;printf("%"d"s","|")}
    print "---"$NF}' FS='/'
  • 目录树
  • find . -type d -print 2>/dev/null|awk '!/\.$/ {for (i=1;i < NF;i++){d=length($i);if ( d < 5 && i != 1 )d=5;
    printf("%"d"s","|")}print "---"$NF}' FS='/'

远程文件传输

scp sftp ftp
  • FileZilla
  • 支持ftp、sftp的非常顺手的工具,可以记住众多的站点,并且支持默认的打开目录
  • 站点管理器 > 高级 > 默认远程目录
  • scp
  •     后台进行:scp命令 + ctrl z + bg命令
      
        断开终端,之后再重新打开终端,执行jobs命令查看不到任务。
        原因分析:
        jobs是查看当前后台作业(进程),是获取本次bash进程下子进程的后台作业。
        当本次终端退出后,后台作业变成孤儿进程,孤儿进程有系统父进程接管。
        当再次连接终端时,原作业与当前终端,不存在关系父子关系,故看不到进程。
        但是原作业,会在系统中一致运行,直到完成或被停止。
        这就是为什么终端退出后,jobs看不到的原因了。
      
  • scp [-r如果是目录] localfile [remote_username@命令执行后只输入密码or用户名加密码]remote_ip:remote_folder(or remote_file如果指定文件名)
  • 从远程复制到本地的scp命令与上面雷同,只需后面2个参数互换顺序就行了
  • 本地多个文件用空格,远程多个文件用引号加空格。remote_ip:"remote_file1 remote_file2"
  • 小knowledge: scp进行传输时对网络带宽的利用是贪心的。而当网络出现波动时,就会导致TCP连接熄火(stalled)。解决方案:Add “-l 8192″ option 就会限制在8192 Kbit/s,视网络状况而定。
  • 小tips: 用scp时不要先连上ssh,那样你进入远程的机器,"本地"和"远程"的角度就颠倒了。晕。
  • 小tips: 脚本自动输入密码登录服务器
  • 针对于ssh或scp命令,可能有人会回答是建立信任关系,关于建立ssh信任关系的方法请自行百度Google,只需要两行简单的命令即可搞定. 但这并不是常规的解决方案,如果是ftp连接就没辙了,况且,你不可能为了执行某些命令去给每个你要连接的主机都手动建立ssh信任. 我们可以想象下,更优雅的方式应该是在脚本里自己配置密码,当屏幕交互需要输入时自动输入进去,要达到这样的效果就需要用到expect.
    1、安装expect
    
    2、script:
    #! /usr/bin/expect -f
    
    set passward "123456"
    set timeout -1
    spawn scp [-r如果是目录] localfile [remote_username@命令执行后只输入密码or用户名加密码]remote_ip:remote_folder
    expect {
            "(yes/no)?" {
                send "yes\r"
                expect "passward:"
                send "$passward\r"
            }
            "*password:" {
                send "$passward\r"
            }
    }
    expect eof
    
    3、expect scptest.sh
    
    4、expect脚本我们都知道,首先spawn我们要执行的命令,然后就给出一堆expect的屏幕输出,
    如果输出match了我们的expect的东西,我们就会send一个命令上去,模拟用户输入。
    但是expect中等待命令的输出信息是有一个timeout的设定的,默认是10秒。这个特性是防止那些执行死机的命令的。
    一旦到了这个timeout,还是没有屏幕输出的话,expect脚本中下面的代码就会执行。
    关于建立信任连接:
    
    一、实现原理
    使用一种被称为"公私钥"认证的方式来进行ssh登录。"公私钥"认证方式简单的解释是:
    首先在客户端上创建一对公私钥(公钥文件:~/.ssh/id_rsa.pub;私钥文件:~/.ssh/id_rsa),
    然后把公钥放到服务器上(~/.ssh/authorized_keys),自己保留好私钥。当ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配。如果匹配成功就可以登录了。
    
    step 1 : A机生成证书 ssh-keygen -t rsa
    step 2 : 查看~/.ssh 私钥id_rsa 公钥id_rsa.pub
    step 3 : A对B建立信任,将id_rsa.pub拷贝到B机的~/.ssh/authorized_keys里,>是覆盖,>>是追加。cat id_rsa.pub >> authorized_keys
    step 4 : 成功,A信任B,把公钥交给B。 A一般为服务器,可以从B免密登录
    
    二.
    注意,不是root用户,.ssh都在~/.ssh

    Latex

    • Latex表格 http://www.tablesgenerator.com/latex_tables# 正确用法:在Excel里画好,导入进去自动生成latex
    • 论文压缩篇幅 https://blog.csdn.net/u011089523/article/details/83578005 https://blog.csdn.net/gokeyhps/article/details/46984497
    • Arxiv 看到比较好的模板或公式,可以到Arxiv source里下载看该文章的源Latex文件

    tar打包

    Tips:
    压缩是拖慢速度的环节,尤其当小文件很多时。很多情况我们并不需要压缩,只打包则快很多。我们在乎时间,不在乎占存时,不要使用-z。

    tar压缩

    • tar [选项] 文件或目录
    • 解压tar -xf name.tar ———— x: extract, f: file
      压缩tar -czf name.gz dir/ ———— c: create, z: gzip, f: file
      检查tar -tf name.tar ———— t: list
      对压缩包分割split -b 4000M -d(表示后缀是数字) -a 1(表示后缀1位数字,默认为两位) xx.gz xx.gz.
      分割后的压缩包解压cat xx.gz.* | tar -xfv 检查图片数目tar -tf name.gz | grep png | wc -l
      检查压缩包顺序tar -tf name.gz | head
      只压缩文件,不要父目录tar -czvf name.gz test/*/*
      批量解压ls *.tar.gz | xargs -n1 tar xzvf
      由于linux系统中的大多压缩程序只能对一个文件进行压缩,所以想要压缩一堆文件,就必须先进行打包,
      把他们打包成一个tar类型的文件包裹,然后再对这个tar文件进行压缩。所以不管打包、解包、压缩、解压的命令都是以tar开头的,
      而到底是打包、解包、压缩、还是解压?是由tar命令的选项决定的。
      z就是用gzip这种方式压缩,所以czf就是把一堆文件创建成gzip形式的压缩文件。gz是gzip的简写。
            

    overleaf

    • 国内服务 cn.overleaf.com
    • 自动查错 下划红色波浪线的部分可能有拼写错误。虽然overleaf的拼写检查功能不完善。

    draw.io

    • 作图 和overleaf搭配是写论文的神器。并且GoogleDrive云端存储,跨平台友好。

    ImageMagick and epstool

    EPS文件格式又被称为带有预视图象的PS格式, 在Mac和PC环境下的图形和版面设计中广泛使用。
    • epstool eps处理以及转换到其他格式
    • brew install epstool
    • ImageMagick 创建,编辑,撰写,或转换位图图像, 在Apache 2.0许可下分发的免费软件
    • brew install ImageMagick
      convert image.png image.eps
      # For other image formats, the command is similar.
    • 安装和使用详细介绍
    • sudo convert ModelFramework.png -resize 1952x816 ModelFramework.eps
      更方便的只指定宽高其中一个:sudo convert ModelFramework.png -resize 1952x-1 ModelFramework.eps

    Pytorch/Tensorflow

    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/

    Docker

    • Docker Hello World https://www.runoob.com/docker/docker-hello-world.html
    • Docker从入门到实践 https://yeasy.gitbooks.io/docker_practice/content/

    Pip/Conda

    • conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
      conda config --set show_channel_urls yes
    • pip/pip3 install xx -i url
    • 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
      阿里云 http://mirrors.aliyun.com/pypi/simple/
      中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
      豆瓣(douban) http://pypi.douban.com/simple/
      中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
      有些linux服务器处于内网,并且没有公网ip,故要想与外网进行http/https通信只能通过nat或者加proxy的方式。
      这样的服务器可能就没法访问anaconda、pypi的官方源以及国内的清华源、科大源。
      解决方法只有 ①打听公司内网的源,②export http/https_proxy代理。
      
      在/etc/bashrc或者/etc/profile中添加如下环境变量:
      export http_proxy=http://1.1.1.1:8082
      export https_proxy=http://1.1.1.1:8082
      env | grep -i proxy 可以查看代理的情况。
    • 清华TUNA协会很不错
    • 当我们安装的包在conda中没有,需要用pip安装的情形&须知
    • 1、在anaconda下用pip装包的原因:尽管在anaconda下我们可以很方便的使用conda install来安装我们需要的依赖,但是anaconda本身只提供部分包,远没有pip提供的包多,有时conda无法安装我们需要的包,我们需要用pip将其装到conda环境里。
      
      2、用pip装包时候需要哪些注意事项?
      
          2.1 首先,我们需要判断目前我们用的pip指令,会把包装到哪里,通常情况下,pip不像conda一样,他不知道环境,我们首先要确保我们用的是本环境的pip,这样pip install时,包才会创建到本环境中,不然包会创建到base环境,供各个不同的其他conda环境共享,此时可能会产生版本冲突问题(不同环境中可能对同一个包的版本要求不同)
          which -a pip (如base环境的pip可能在/root/anaconda3/bin/pip;而其他conda环境的pip,可能在/root/anaconda3/envs/my_env/bin/pip)
          2.2 经试验,anaconda4.8版本,在conda create新的环境时,已经默认在新环境装了pip,此时source activate进入该环境后,用pip命令安装的包,默认会装在本环境中,不必担心pip一个包后后会将其他环境的包改变版本的情况)
      3、安装特定版本的包
        conda用“=”,pip用“==”
        conda install numpy=1.93
        pip  install numpy==1.93
            

    SSH

    • 避免SSH长时间不操作而卡死
    • SSH日常使用过程中经常出现的一个问题是:过长时间没有数据传输后SSH呈现卡死的状态 这是因为长时间没有数据传输的情况下,网络中间节点可能会强行断开连接 而SSH终端与服务器并不知情,于是此时操作就会出现卡死的现象。
      设置SSH服务器或客户端的心跳包功能即可
      客户端:编辑/etc/ssh/ssh_config,增加一行配置
      ServerAliveInterval 60

      服务端:编辑/etc/ssh/sshd_config,增加一行配置
      ClientAliveInterval 60

      还可添加ServerAliveCountMax 3 表示服务器发出请求后客户端未响应次数达到一定值就自动断开,正常情况下,客户端会正常响应.
    • ssh -v
    • 用ssh -v去连有问题的服务器,这时会有比较详细的调试信息在屏幕上输出,可以帮助判断是哪一步出了问题。

    shell

    • shell script编程
    • 注1 :变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
    • 注2 :推荐给所有变量加上花括号,这是个好的编程习惯。${ }会比较精确的界定变量名称的范围。lastname='hou' name=${lastname}'dewang'
    • ${}搭配→Linux Shell截取字符串
    • 注3 :使用变量的时候才加美元符($)
    • 注4 :字符串可以用单引号,双引号,也可不用引号。但单引号有限制,双引号里则有①可以有变量②可以出现转义字符的优点
    • 注5 :建议使用$(). 反引号``和$()的作用相同,用于命令替换(command substitution),即完成引用命令的执行,将其结果替换出来,与变量替换${}差不多。反引号是一个老的用法,$()是新的用法
    • 注6 :LogFile="./output.txt"可以搭配>>$LogFile输出日志。
    • 注7 :if条件判断的[ ... ]一定要前后留出空格,不然是bad pattern.
    • 注8 :数学计算
    • ctrl + a/e 分别代表把光标移动到最前和最后
    • ctrl + u/k 分别代表光标处往前和往后处全删除
    • !惊叹号的用法 !
    • history → !number 使用历史命令

    SMB服务

    • SMB(Server Message Block)是一种用于在计算机之间共享文件、打印机和其他资源的网络协议。随着时间的推移,SMB协议也经历了多次更新和改进。
    • 关于SMB1.0(1984年)/2.0(2006年)/3.0(2012年),总结来说现在建议优先用3.0,也称SMB direct。1.0过时了且有安全问题,3.0相较2.0提供了更高的性能和更好的安全性。
    • 配置方式
    • link
    • 相关:配置OpenSSH
    • link

    fg/bg/job指令

    进程相关指令
    • ctrl+c 终止前台进程;
    • ctrl+z 挂起前台进程,并置于后台;
    • kill %jobnumberkill pid 终止前台进程;
    • kill -stop PID 挂起后台进程;
    • & 加在一个命令的最后,可以把这个命令放到后台执行;
    • jobs 显示的是当前shell环境中所起的后台正在运行或被挂起的任务信息;
    • 参数:-l选项可显示所有任务的PID
    • fg 将后台中的命令调至前台继续运行
    • fg %jobnumber将选中的命令调出
    • bg 将一个在后台暂停的命令,变成继续执行 (在后台执行)
    • bg %jobnumber将选中的命令调出
      bg默认的当前任务是1号,即 bg 等同于 bg %1
    • nohup 该命令可以在你退出帐户/关闭终端之后继续运行相应的进程

    Chrome

    • 插件 Octotree
    • 高级设置 chrome://flags/
    • 加速下载:Parallel downloading → Enable
      其他主流浏览器类似:edge://flags/

    Gdown

    • v4.3.0 Mitigate PermissionError after many accesses to a particular file. releases
    • pip install --upgrade --no-cache-dir gdown

    vim

    • 命令 https://www.runoob.com/linux/linux-vim.html
    • :set nu 行号对于调试还是很重要的

    crontab

    • 定时执行程序
    • crontab -e 编辑
    • crontab -l 查看
    •   0  *   * * *   top -b | head -n 20 >>/data/devonn/watchcpu.log 2>&1 每小时查看一下top,有点特殊的是需要使用-b参数,才能让top的输出传到另一个文件
        0  *   * * *   nvidia-smi >>/data/devonn/watchgpu.log 2>&1 每小时查看一下nvidia-smi
        /var/spool/cron/crontabs/ 查看每个用户的定时任务,然后如果是定时记录log,注意别冲突了,写成同一个路径的文件。
       

    visio

    • 自动对齐 ctrl多选 ;开始→排列 ;开始→位置
    • 画水平直线 压住shift再拉长度。 这个会经常用到
    • 手动调整 视图→视觉帮助→对齐(取消) ;视图→网格(勾选)
    • 输出保存png 文件→另存为可移植网络图形(*.png)

    HDFS

    Hadoop is the framework that has the storage and the processing unit. The storage unit of Hadoop is called HDFS - Hadoop Distributed File System. The processing unit is called MapReduce.
    • 命令基本格式 hdfs dfs -cmd < args >
    • hadoop fs VS hadoop dfs VS hdfs dfs
    • three commands which appears same but have minute differences.
      hadoop fs < args >
      FS relates to a generic file system which can point to any file systems like local, HDFS etc. So this can be used when you are dealing with different file systems such as Local FS, (S)FTP, S3, and others.
      hadoop dfs < args >
      dfs is very specific to HDFS. would work for operation relates to HDFS. This has been deprecated and we should use hdfs dfs instead.
      hdfs dfs < args >
      same as 2nd i.e would work for all the operations related to HDFS and is the recommended command instead of hadoop dfs.
    • hadoop shell命令 参考1 参考2

    Jenkins

    • 进度条
    • 进度条通常是空的,在建立进度时填充蓝色。 进度条填写的时间是根据估计的工作持续时间。这个估计通常是基于最后几次成功建成的平均持续时间。 如果没有以前的工作数据进行时间估计,进度条将显示一条带状蓝色的动画。 当构建执行器“可能卡住”(“卡住”定义为建造时间比估计长十倍。如果没有估计,任何长于24小时的建设被认为是卡住的。)时, 红色属性被设置,即它比预计完成的时间要长得多。

    ffmpeg

    • ffmpeg所有的参数都是作用于紧跟其后的文件,因此参数的顺序相当重要。
    • # input seeking
      ffmpeg -ss 00:1:05 -i gemfield.mp4 -frames:v 1 out.jpg
      # output seeking
      ffmpeg -i gemfield.mp4 -ss 00:1:05 -frames:v 1 out1.jpg
      上述两种就是有区别的。
      ffmpeg -r 15 -i input output
      ffmpeg -i input -r 15 output
      假设原本是30fps,第一种会使其输出文件的时长分别为原来的两倍,第二种时长不变,但码流理论上为输入文件的一半左右。
            
    • 关于码控
    • 雷霄骅的-从零开始-博客
    • 官方文档
    • tutorial
    • 常用参数
    • 常用命令小笔记
    • 示例:批量下采样 for %a in ("*.y4m") do ffmpeg -i "%a" -vf scale=iw/4:ih/4 -sws_flags bicubic "E:\...path...\%~na_bicubic_l.y4m"
    • 注: 对yuv文件进行操作时要-s指明分辨率,因为它没有被封装,ffmpeg读不到这些信息
    • 使用ffmpeg视频编解码 H.265指南
    • 见Passing Options docs
      ffmpeg -i rawvideo.y4m -c:v libx265 -x265-params bframes=0:no-deblock=1:no-sao=1:qp=37 qp37.mp4
      不过编解码组不怎么用ffmpeg,而是用更好用的HM(HEVC Test Model),修改cfg文件就好了。
      这两个是HEVC的两种编码配置,你用的HM的话,在cfg文件夹里面应该有各种编码配置。如果用的x265,需要自己通过命令行去配置各种参数。
    • 抽帧
    • 从某一帧开始ffmpeg -start_number 500 -i
    • -vf select='eq(pict_type\,I) 抽I帧
    • -vf select='not(mod(n\,25)) 隔25帧抽
    • 抽帧记得使用-vsync 0
    • 查看帧类型
    • ffprobe -v quiet -show_frames 151_264.mp4|grep "pict_type"
    • 查看I帧编号
    • ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv 151_264.mp4 | grep -n I | cut -d ':' -f 1 > frame_indices.txt
    • ffplay -video_size 640x480 file.yuv
    • ffmpeg抽帧 IBP帧,场景转换帧,均匀抽帧,特定时间抽帧

    vscode

    • 带参数调试 Debug->Open Configurations(打开配置) 在对应的代码块中添加args,注意参数之间需要用字符串分割开,用空格是不行的"--model","EDVR"
    • 整段缩进 Ctrl+[ ]
    • 养成太长换行习惯 \
    • 打开多个文件夹 将文件夹添加到工作区

    pycharm

    • pycharm技巧
    • 写 Python 代码时,你会严格遵守 pep8 规范么?
      还是要遵守的,不然代码传到 github 或者知乎上被人怼就不好了。
      但是如果靠肉眼去检查和注意的话,太累,靠 PyCharm 来做这事就好,
      Command+Option+L,一键 pep8 走起。
    • 指定anaconda环境 File->Settings->Projector Interpretor,在Projector Interpretor中Add,选择Virtualenv或Conda Environment,Existing Environment,选择E:\Anaconda3\envs\py36torch\python.exe,再点击OK。
    • 整段缩进 tab,shift+tab
    • pycharm默认具有自动保存功能的。习惯ctrl+S,可以更改设置。
    • 注释 成段的注释or取消注释,可以先框选,然后Command + /(Mac)或Ctrl + /(Windows)
    • 其他:
      Ctrl + D 复制上一行;

    调试

    写程序最痛苦的事情莫过于调试,程序往往会以你意想不到的流程来运行,你期待执行的语句其实根本没有执行,这时候,就需要调试了。
    • 如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有:VS Code,Pycharm
    • Debug心得
      |Step Over|Step Into|Step Out|Resume Program到下个断点|Run to Cursor到光标|
    • 虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器。
    • print()——打印,最大坏处是将来还要删掉它,不然运行结果会包含很多垃圾信息
    • assert——断言,程序中如果到处充斥着assert,和print()相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert
    • logging——不会抛出错误,而且可以输出到文件
    • import logging
      logging.basicConfig(filename='./LOG/training.log', level=logging.INFO)
      logging.info("info message")
        
    • 这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。
    • 总结相比print,具备如下优点:
    • 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
    • print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;
    • python logging日志模块以及多进程日志(important)
    • 简书
      logging遇到多进程
      python中由于某种历史原因,多线程的性能基本可以无视。所以一般情况下python要实现并行操作或者并行计算的时候都是使用多进程。但是 python 中logging 并不支持多进程,所以会遇到不少麻烦。
      logging 模块是线程安全的,但不能保证多进程安全。
            

    github开源项目

    github项目徽章

    Git

      Git有三个分区:工作目录(working directory)、索引(index)、Git仓库(git repository)。当你修改文件,执行git add,再执行git commit时,Git的底层数据变化如下图。
    • 图解Git
    • Learn Git Branching
    • Git飞行规则(Flight Rules)
    • 最简workflow
    • 首先Connecting to GitHub/GitLab with SSH
      参照
            
      0.查看是否登录
      git config --list
      1.登录
      git config --global user.name "github用户名"
      git config --global user.email "邮箱地址"
      2.准备提交的本地项目
      git init "path"
      git add . (提交所有)  or  git add +文件名 (提交单个文件)
      如果是仅修改,可以用git commit -a,跳过add。如果想分多次commit,可以用git stage。
      git commit -m "First commit"
      3.绑定远程仓库
      git remote add origin git@github.com:dwhou/xxx.git
      'origin'只是个别名
      4.推到master分支
      git push -u origin master
      
      三个建议:
      0. 建议git commit前,看看git diff HEAD,了解当前工作区和最新commit的区别。
      1. 建议git commit前先试试能不能通过编译(记得所有的依赖库都pull到最新)。
      2. 建议git push前先看看diff,git diff HEAD^1是当前工作区和上次commit的区别(如果刚commit马上查看,当前工作区相当于就是HEAD,等同于git diff HEAD^1 HEAD,所以一般简写),HEAD~2是上2次,依次类推。SourceTree软件里默认是git diff SHA^1 SHA。
      git diff a b, diff显示的结果表示 后一个(b) 相对于 前一个(a)的修改。省略后一个时,后一个默认是workspace。
      
      补充建议:
      3. 一般git push会提示merge request的网址。建议在PR或MR的GitLab页面再一次检查下change(就是git diff)。
      关于git diff:(图片引用自[1]
      
      
      实际完整命令是:
      git push -u origin <本地分支名称>:<远程分支名称>
      但本地、远端相同名称时可以省略掉 “<本地分支名称>:”,也就是我们常见的形式。然后如果是用“ :<远程分支名称>” 则表示删除远端分支,因为这相当于把空的东西push到远端嘛。git pull类似。
      -u或--set-upstream选项用于将本地分支与远程分支关联起来。将本地(远程)分支设置为远程(本地)分支的上游分支。这样,你在后续只需执行git push/pull即可将更改推送/拉取到关联的分支。
      
      仅添加文件、文件夹到已有仓库某路径下
      0. above ; 1. above ;
      +  git clone git@github.com:dwHou/xx.git
      2. above ; 3. above; 4. above.
      
      Git Commit + Pull + Push三步大法
      
      1、git clone 与 git pull 相同点
      相同点:都是从远程服务器拉取代码到本地
      
      2、git clone 与 git pull 不同点
      git clone
      git clone --depth=1 -b master xxxxxx.git
      当仓库过大时,只克隆某个指定分支的最近一次commit。depth=1表示只克隆最近一次commit,-b指定分支。最终减小下载文件的数目。
      
      2-1、重新拉取其他分支:
      $ git remote set-branches origin 'remote_branch_name'
      $ git fetch --depth 1 origin remote_branch_name
      $ git checkout remote_branch_name
      git remote 命令,用来管理追踪的远程分支,git ls-remote origin可以列出所有远程分支。
      
      2-2、重新拉取全部历史:
      $ git fetch --unshallow
      
      3、放弃所有本地更改,用远程分支覆盖
      git fetch --all
      git reset --hard 'remote'/'branch_name' 或者 commit SHA 比如 origin/master或cf26392a...1d5b6
      (推荐用后者,SHA)
      git pull
      建议放弃本地更改都用该方法,而不是git stash,后者感觉老是弄出冲突。
      4、git可视化命令,查看仓库的所有历史提交记录
      git log --graph --oneline --all
      
      git pull
      在本地有版本库的情况下,从远程库获取最新commit 数据(如果有的话),并merge(合并)到本地。
      
      人生不如意之事十之八九,合并分支往往也不是一帆风顺的。当merge存在冲突时,需要解决冲突:
      详细参考廖雪峰的文章
      具体是git status查看哪些文件冲突,然后打开文件后将看到Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。一些IDE或其插件,会有快捷的选择不同分支内容的点击项,方便快速解决冲突。
      
      
      git pull = git fetch + git merge
      
      3、使用场景
      通常情况下,远程操作的第一步,是使用git clone从远程主机克隆一个版本库到本地。
      
      本地修改代码后,每次从本地仓库push到远程仓库之前都要先进行git pull操作,保证push到远程仓库时没有版本冲突。
      
      push前务必使用diff或者sourcetree的可视化界面查看修改。
      
      4、关于分支
      https://www.orchome.com/8160
      可以使用git branch -vv 看到本地和远程分支的对应关系。并随时用checkout切换分支。
      
      5、关于用户权限
      有时候从个人账户切回公司账户,仍然报错:邮箱不符合规范
      https://blog.csdn.net/weixin_44296929/article/details/116984606
      https://cloud.tencent.com/developer/article/1352623  (这个方法只是改一下log,欺骗眼睛,没有实际用处。)
      所以最好还是养成习惯每次使用前检查账户。
      
      6、强制同步远程分支
      有时候git被弄乱了,希望强制同步为远程分支。可以:
      mv -v .git .git_old &&            # Remove old Git files
      git init &&                       # Initialise new repository
      git remote add origin "${url}" && # Link to old repository
      git fetch &&                      # Get old history
      git reset origin/master --hard # Force update to old history
            
      对git提交进行签名可以使用GPG:
      提交签名
      如果有仓库不需要GPG的,可以vim .git/config
      添加如下几行:
      [commit]
          # https://help.github.com/articles/signing-commits-using-gpg/
          gpgsign = false
      

    Git内部原理

      经常有人说Git简单,Pull&Commit&Push,又经常有人说Git复杂难懂。最经常听到的抱怨是Git的命令容易混淆。
      如果你不懂一个东西的内部原理,有时它会变得十分混乱。
      https://www.bilibili.com/video/BV1RJ411X7kh
      1.Git是如何存储信息的?
    
      

    Sourcetree使用

          提供了美观的UI,不过我们使用的时候还是可以在菜单栏里选择终端,再使用命令行。毕竟软件会有bug。
      

    EffectiveMac

    • Mac
    • 锁屏
    • brew install tree
    • Mac经常误开启了多桌面,可以触控板4指上滑,去关闭
    • 设置文件夹图标: nice tips
    • 自带pdf阅读器:窗口 —— 合并全部窗口,就可以置于各个标签页了,看起来更整洁。