常用命令整理一(git、adb、vim、cmd、sh)

常用命令整理一(git、adb、vim、cmd、sh)

    • 1、git篇
      • (1)安装git
      • (2)配置
      • (3)使用
      • (4)基础概念
      • (5)gerrit相关
      • (6)git 指令遇到的一些问题
    • 2、adb篇
      • (1)安装并配置adb环境变量
      • (2)usb连接手机开启调试
      • (3)常用命令
    • 3、vim篇
    • 4、cmd篇
      • (1)常用cmd命令
      • (2)bat命令
    • 5、sh篇

1、git篇

(1)安装git

# 查看git版本
git --version

(2)配置

# --system
# --global:针对当前用户
# --local:针对某个仓库
git config --global user.name "your_username" # --global 选项对系统上所有仓库生效,去掉该参数只对当前仓库有效
git config --global user.email "your_email"
git config --global --list # 查看当前用户配置
git config --list --show-origin # 查看所有配置以及它们所在文件
git config user.name

# 创建 ssh-key
cd ~
ssh-keygen
# 然后复制/Users/usename/.ssh下的id_rsa.pub的内容到gitlab

(3)使用

# git初始化本地目录
git init git-demo
cd git-demo
echo "learn git" > README.md
git add README.md
git commit -m 'init repo and add README.md'
# 连接远程版本库 git remote add 远程仓库名 url
git remote add origin [email protected]:christian-tl/git-demo.git
git push origin master # git push 远程仓库简写 分支名
# 使用git 基本流程 && 基本开发流程
git clone [email protected]:gitlab-org/gitlab.git # clone via SSH, 自动将其添加为远程仓库并默认以 “origin” 为简写
git pull # 远程新建分支后要先拉到本地, 自动抓取后合并该远程分支到当前分支,相当于执行了git fectch & git merge
git branch -a # 查看远程分支
git checkout -b develop origin/develop # 基于远程develop分支建立本地develop分支
git checkout 分支名 # 拉取远程分支到本地并切换为当前分支
git checkout commit_id file_name # 将某个文件修改到与commit_id一样的状态,并add所做的修改
# 查看工作区和暂存区状态
git status # git status -s 查看简短信息
git status dir_name # 查看某个文件夹的修改情况

# 开发中... 新建一个分支
git branch feature # 基于develop分支建立本地特性分支feature
git checkout feature # 切换分支
git add your_file # 将文件添加到暂存区
git commit -m "here is your comment"  # 将暂存区内容添加到仓库中

# 开发完成...合并分支
git checkout develop # 切换到develop分支
git merge feature # 合并feature的修改
git branch -d feature # 删除分支
git push # 把本地develop分支的修改推送到远程develop
# 将本地分支的更新推送到远程仓库
git push origin develop # git push 仓库名 分支名
# log 相关
git log # 查看提交历史
git log -p -2 # 显示最近两次提交的详细差异信息
git log --stat # 查看每次提交的简略统计信息
git log master..origin/master # 显示远程有而本地没有的commit信息
git log --grep <your_content> # 通过commit message查找对应的commit
# 以graph 形式在一行中显示提交信息
git log --graph --oneline
git log file_name # 查看某个文件的提交历史

git commit --amend # 修改上一次的提交和注释
# git clean 用来从工作目录中删除没有tracked过的文件
git clean -n # 查看哪些文件会被clean目录删除,只查看不执行clean操作
git clean -f # 删除当前目录下没有被tracked的文件,不会删除.gitignore文件里面指定的文件夹和文件
git clean -f <path> # 指定路径
git clean -df # 删除文件和文件夹
git clean -xf # 删除所有未被tracked的文件,计时在.gitignore里

# stash 相关
git stash # 暂存当前修改
git stash save "save message" # 将暂存区的内容临时保存下来并添加注释
git stash list # 查看临时保存的内容
git stash apply # 应用修改到当前分支,不删除stash list
git stash pop # 应用并在stash list中删除
git stash pop 1 # 恢复临时保存的内容,可指定恢复哪一个
git stash drop # 删除最新的保存
git stash clear # 删除所有的保存
# 子模块相关
git submodule add https://github.com/xxx # 添加子模块
# 克隆含有子模块的项目
git submodule init # 首先初始化本地配置文件
git submodule update # 然后更新子模块
git submodule update --init # 以上两步可以合并成这一步
git clone --recurse-submodules https://github.com/xxx # 自动初始化并更新仓库中的每一个子模块, 包括可能存在的嵌套子模块
git submodule update --init --recursive # 如果init之后又添加了新的子模块,需要重新拉取新子模块
git submodule update --remote # 获取远端submodule
# diff相关
git diff 不加参数默认比较工作区和暂存区
git diff --cached [<path>...]比较暂存区与最新本地版本库(本地库中最近一次commit的内容)
git diff HEAD [<path>...]比较工作区与最新本地版本库。如果HEAD指向的是master分支,那么HEAD还可以换成master
git diff commit-id [<path>...]比较工作区与指定commit-id的差异      
git diff --cached [<commit-id>] [<path>...]比较暂存区与指定commit-id的差异
git diff [<commit-id>] [<commit-id>]比较两个commit-id之间的差异

git diff --stat master origin/master # 统计文件的改动
git diff origin/master # 比较当前本地分支与远程指定分支的差异

# 获取patch以及应用patch
git diff > changes.patch
git apply changes.patch

git diff --cached --binary > change.patch # 将暂存区的修改存成patch,可以存储图像等二进制文件
# branch 相关
git branch --contains <commmit_id> # 通过commit id 查找分支
git branch -all | grep <your_content> # 搜索分支
git branch -vv # 查看当前项目拉的是哪一个分支
git branch -a # 查看所有分支,包括远程分支
git branch -r # 查看远程分支
git branch # 查看本地所有分支 
git show-branch # 可以查看当前分支的第一次提交(如果该分支是使用git checkout -b 或 git branch 新建的),以及是基于哪个分支的哪次提交新建的
git branch <branchname> # 新建本地分支,并指向当前分支的头指针。只新建分支但不切换分支
git branch -d <branchname> # 删除本地分支
git branch -d -r <branchname> # 删除远程分支,删除后还需推送到服务器
git branch -m <oldbranch> <newbranch> # 重命名本地分支
git branch --show-current # 查看当前分支
#***
# 重命名远程分支:
# 1、删除远程待修改分支
# 2、push本地新分支到远程服务器
#***
git push origin:<branchname>  # 删除后推送至服务器
git branch <branchname> commit_id # 新建分支并指向这个提交
git checkout dev # 切换分支
git checkout -b feature # 新建并切换分支
git switch -c <branchname> # 若当前为头指针分离形式,可以用该命令创建一个新分支

# git rebase 使用场景:用在分支合并且当前分支落后时避免出现自动merge产生的分叉行为
# 即将feature分支的基替换成当前的master分支

# 合并分支解决冲突
git checkout feature
git rebase master # 在feature分支上执行,即以master为基础,将feature分支的修改新增到master分支上,并生成新的版本
# 产生冲突并解决冲突后 add
git add .
git rebase --continue # 冲突解决后继续rebase操作
git checkout master
git merge feature # 此时可以合并分支了

# 当本地提交push时落后远程分支,可以使用 git rebase去除分叉
git pull --rebase # 效果一样

# git rebase 还可以将多个commit合并成一个
git rebase -i master~3 # rebase 最后三个提交
# git rebase -i HEAD~3
# 会启动vim 编辑器,保留第一个pick,将其余pick改成squash并保存
# 自动启动vim编辑器,可以修改合并后的commit,默认为三行之前的三个提交的message
# 合并成功,原来最后的三个提交合并成了一个

git rebase -i # 补充提交

参考: 彻底搞懂 Git-Rebase
Git 修改已提交 commit 的信息

git reset == git reset HEAD # HEAD表示当前版本,用于重置暂存区的文件与上一次提交保持一致,工作区文件内容保存不变(即回撤未commit的add操作)
git reset --soft HEAD~ # 将上一个commit回滚到 commit 之前的状态,即已经add还未commit的状态
git reset --hard HEAD~ # 删除前一个提交,记录将被删除,同时工作区的内容也会回到上上个提交的状态
git reset --hard ORIG_HEAD # 如果reset错了,可以用该命令回滚到reset之前的状态
git revert HEAD # 取消上一个提交, 会删除该提交的内容同时生成一条新的提交记录
git revert -n commitID # 可以指定撤销的commit,需要再次commit完成撤销该commit的修改
git commit -m "revert the commit commitID "
# 注意 git revert代码丢失问题
# 场景:dev分支合并A分支,然后revert掉合并A分支的提交,二次合并时会认为之前revert的时间点更新,因此丢掉了A分支的代码
# 解决方案:直接revert上一个revert
git revert --no-commit revert_version_of_mine
git commit -a -m 'revert revert'
git push

git cat-file -p 
git revert -m 1 HEAD # 用于取消merge
# -m 1 表示保留当前分支的更改
# -m 2 表示保留合并进来的那个分支的更改

参考:
[1]【git revert】报错commit is a merge but no -m option was given

# 从远程获取代码并合并本地版本
git pull
git pull origin master:brantest # 远程主机master分支和本地brantest分支合并
git pull origin master # 和当前分支合并

# 更新本地的远程分支
git fetch origin

# 放弃本地修改,但是不恢复新增和删除的文件
git checkout .

# 显示所有远程仓库
git remote -v 
git remote #  显示远程仓库的简写,会打印出 origin
git remote add pb https://github.com/paulboone/ticgit # 添加新的远程仓库并指定简写

# 拣选提交, 当你仅需其他分支的某一个提交时使用cherry-pick,若需要合并其他分支的所有提交采用merge
git cherry-pick commitID # git cherry-pick 可以只选几个提交合并,merge是将所有的提交合并
git cherry-pick -m 1 <commitHash> # 对于merge的提交需要指定采取哪个分支的变动,一般1表示接受变动的分支

# 将当前分支和compared 分支比较,将属于当前分支不属于compared分支的commit提炼成patch,每个commit会形成一个patch文件
git format-patch compared_branch_name -o out_dir
# 将当前分支的某个commit做成patch并应用到另一个分支上
git format-patch -1 commit_id -o out_dir
git checkout branch_name
git am out_dir/xxx.path

# 建立里程碑
git tag

# 这将这将更新名称为remote_repo 的远程repo上的分支remote_branch_name 并切换到该分支
git fetch remote_repo remote_branch_name && git checkout FETCH_HEAD 
// mac 上安装lfs
brew install git-lfs
git lfs install
git lfs pull
# git中一些选项解释:

-d
--delete:删除

-D
--delete --force的快捷键

-f
--force:强制

-m
--move:移动或重命名

-M
--move --force的快捷键

-r
--remote:远程

-a
--all:所有

(4)基础概念

  • 几个重要概念:工作区、暂存区、版本库、Git对象
  • 项目目录:执行 git init 或者 git clone 之后会生成一个目录。所有的开发都在该目录下进行。
  • Git目录:项目目录下有个名为 .git 的隐藏目录,是项目存储所有历史和元信息的目录
  • 工作目录:是项目目录下除了Git目录以外其他所有的文件和目录,用于临时保存文件的地方。可以编辑工作目录下的文件直到下次 commit
  • 工作区:工作目录。
  • 暂存区:.git/index 目录
  • 版本库:本地仓库

(5)gerrit相关

  • gerrit 的代码push 一般要经过代码审查,因此常采用 git push origin HEAD:refs/for/master的方式
git push origin HEAD:refs/for/master # 提交代码审查
# 根据审查意见在本地修改代码
git commit --amend # 修改上一次提交的commit
git push origin HEAD:refs/for/master # 再次提交审查会生成patch,后续可继续修改代码

参考:
[1]Git原理及使用
[2]Git权威指南
[3]Start using Git on the command line
[4]2.5 Git 基础 - 远程仓库的使用
[5]真正理解 git fetch, git pull 以及 FETCH_HEAD

(6)git 指令遇到的一些问题

  • revert 的内容再次merge时消失
    • 参考:解决Git Revert操作后再次Merge代码被冲掉的问题
    • 如果feature分支的提交已经合入了develop,再revert掉,下次再merge feature分支的时候 是没办法将feature的提交还原回来的,因为git 会认为merge的操作比revert早,这时候需要用revert 去 revert掉之前的那个 revert的commit
  • 关于merge的奇奇怪怪的结果
    • 参考: Git 分支 - 分支的新建与合并
    • fast-forward 合并: 这种合并最简单,当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移)。比如你从develop分支拉出一个feature分支,然后在feature分支上新增了一些提交,而develop分支上没有变动,这时候develop分支合并feature分支的方式就是 fast-forward
    • 如果develop和feature分支都分别有新增的提交,Git 会使用两个分支的末端所指的commit以及这两个分支的公共祖先commit,做一个简单的三方合并。并会创建一个新的合并提交。因为合并提交的commit有不止一个父提交,所以整个commit tree 是分叉的。
      • 关于冲突:如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们,会产生冲突,需要先解决冲突才能继续合并
        常用命令整理一(git、adb、vim、cmd、sh)_第1张图片
  • 关于rebase的奇奇怪怪的问题
    • 参考:git rebase vs git merge详解 , git rebase
    • git merge --no-ff 用于保持历史图(默认-ff模式),git rebase 为线性模式
    • git rebase 最好用于私人未push的分支,如果分支已经push到远程仓库,需要使用git push --force 来push到远程分支(慎用!)
    • git rebase --i 可以用于整理历史commit
  • 关于子模块的那些事情
    • 在主工程目录执行 git clean -xdf 只会清理主工程当前目录下所有没有 track 过的文件,不会删除子模块目录下的文件,如需清理子模块需要进入子模块目录下执行git clean -xdf
  • unstaged changes怎么也删不掉的问题
    • mac拉了一个仓库,某个文件夹下有.gitattributes文件,设置换行符为CRLF。结果就是这些文件被修改了,但是原先git diff并没有结果。后来换了个mac 就出现了unstaged changes,而且无法被reset掉。最后尝试 git rm --cached -r . 以及git reset --hard
    • git reset 用于tracked文件,git clean用于untracked文件
    • git rm --cached 会从index里删除文件,但是本地保留文件。

2、adb篇

Android Debug Bridge,Android调试桥接器,简称ADB。

(1)安装并配置adb环境变量

(2)usb连接手机开启调试

adb devices # 查看设备是否连接

(3)常用命令

adb install xxx.apk # 在手机上安装app
adb install -t xxx.apk # 安装测试包
adb shell pm list packages # 查看设备已安装的程序包
adb uninstall com.xxx.xxx # 卸载指定程序

adb push 本地文件路径 /sdcard/xxx # 拷贝电脑文件到手机
adb pull /sdcard/xxx 本地路径 # 将手机文件拷贝到电脑
adb -s <udid> push xxxx /sdcard/xxx # 存在多个设备时指定设备进行拷贝, 可以通过 adb devices命令获取
  • 获取屏幕分辨率:adb shell wm size
  • adb shell --> getprop --> getprop | grep 关键字
  • adb devices
  • getprop | grep product.board 芯片
  • adb shell getprop ro.product.model 查看机型
  • ro.mediatek.platform]: [MT6765]
  • ro.vivo.product.platform
  • ro.board.platform
  • ro.boot.hardware - 芯片
  • adb shell getprop
  • adb shell cat /proc/cpuinfo 查看手机cpu核数
  • cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq 查看cpu频率
  • adb shell dumpsys | grep GLES 查看gpu型号(需要在git bash里执行,powershell里会报错)
  • adb shell getprop ro.product.cpu.abi 查看手机是64位还是32位操作系统(cpu架构是32位的还是64位的可通过cpu型号的详细信息查看)

参考:
[1]查询手机配置网站devicespecifications
[2]查询手机配置网站gsmarena
[3]Android ADB 命令行
[4]Android 使用ADB命令安装、卸载软件

3、vim篇

  • :q! 不保存强制退出

  • :wq 保存并退出

  • 跳转到行

    普通模式下,gg 跳转到第一行;G跳转到尾行

    命令模式下,:0或:1跳转到第一行;:$跳转到尾行

    命令行模式下,:n跳转到第n行

  • 显示行号:命令行模式下 :set nu 或:set number

  • 跳转到列

    • 普通模式下,0 或 | 跳转到行首
    • 普通模式下,$ 跳转到行尾

4、cmd篇

Windows 命令提示符(即cmd)是Windows 系统的一种命令行操作工具。

(1)常用cmd命令

  • 批量输出后缀为mp4的文件名(可以输出到txt, doc, xls)
  dir /b *.mp4 >name.xls
  • 批量修改后缀
  ren *.bmp *.jpg
  • windows下查看md5值:
  certutil -hashfile 文件绝对路径 MD5
  • 生成文件树
  tree > list.txt

(2)bat命令

bat文件是dos下的批处理文件

:: 这是代码注释
:: bat文件可以用记事本编写并修改保存文件的后缀名为.bat,若要显示中文,注意修改编码方式为ANSI
:: 或者也可以指定代码页为UTF-8
chcp 65001

:: rem 是注释命令,可以显示但不执行,且回显不受echo off的关闭回显影响
rem 关闭回显。默认打开回显,会依次显示所执行的命令
@echo off

rem pause使显示器停下,否则会一闪而过
pause

5、sh篇

sh命令是shell命令语言解释器。

  • 根据url批量下载视频
# getVideo.sh
# 输入为带有视频url的csv

file=$1
OLD_IFS="$IFS"
IFS=","
while read line
do    
    arr=($line)
    if [ ! -f "./${arr[5]}/${arr[0]}_${arr[5]}.mp4" ]; then
        echo ${arr[1]}
        wget -cO - ${arr[1]}   > "./${arr[5]}/${arr[0]}_${arr[5]}.mp4"
    fi
done < $file
IFS="$OLD_IFS"
  • 判断目录是否存在
if [ ! -d testdir ]; then
	mkdir testdir
else
	echo dir exist
fi

# 可外部传参, $# 为参数个数
if [ ! $# -eq 1]; then
	echo param error!
	exit 1
fi

dirname=$1
echo "the dir name is $dirname"
if [ ! -d $dirname ]; then
	mkdir $dirname
else
	echo dir exist
fi
  • 判断文件是否存在
  # -f 参数判断 $file 是否存在
  if [ ! -f "$file" ]; then
    touch "$file"
  fi
  • 生成文件树
tree -a

命令行	效果
tree -d	只显示文件夹
tree -D	显示文件的最后修改时间
tree -L n	n表示显示项目的层级,n=3即只显示项目的三层结构
tree -I pattern	pattern表示想要过滤的目录,例如 tree -I “node_modules”可以过滤掉node_modules这个文件夹
  • 查看cpu的核数
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

# 查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
  • 修改文件权限

    • 文件权限用户类型:文件所有者(u)、群组用户(g)、其他用户(o)
    • 文件类型:7=4+2+1(读写运行,rwx)、5=4+1(读和运行)、4=4(只读)
    • chmod 777 filename
    • chmod ug+w,o-w filename.txt :设置ug可写,o不可写
    • ls -l filename:查看文件权限
    • ls -ld 文件夹名称:查看文件夹权限
  • 查看进程

  ps -ef
  ps aux # 查看后台进程
  jobs -l # 查看当前终端后台程序
  ctrl + z # 将前台执行的命令放到后台,并且暂停
  fg %jobnumber  # 通过jobs查询到后台正在执行的命令,然后将其调至前台继续执行
  bg %jobnumber # 通过jobs查询到后台暂停的命令,然后将后台暂停的命令变成继续执行
  ctrl + c # 前台进程的终止
  • 查看端口占用情况
lsof -i:8000 # 查看服务器8000端口占用情况,需要root用户权限
netstat -ntulp | grep 80 // 查看所有80端口使用情况

### 关于协议和端口
# 数据通过IP地址发送到设备,再通过端口号发送给指定的服务或程序。因此,程序会指定传输协议以及监听指定的端口号,比如程序A使用TCP协议,监听23001端口

HTTP协议依靠TCP协议来传输数据(TCP是传输层协议,HTTP是应用层协议,很多应用层协议是以TCP协议为基础的)。HTTP使用TCP的方式分为短连接和长连接,短连接下浏览器先发起一个TCP连接,拿到网页的HTML源码后关闭连接,浏览器分析网页源码并针对每一个外部资源分别发起TCP连接;长连接下浏览器先发起一个TCP连接抓取页面,并等待浏览器分析HTML源码,再用该TCP连接去抓取外部资源(建立TCP连接有时间成本和CPU成本,因此短连接的方式更加高效)。

HTTPS协议是"HTTP over SSL"。也就是对HTTP进行了加密更加安全可靠。【聊聊 HTTPS 和 SSL/TLS 协议】

  • linux命令which,whereis,locate,find的区别:https://zhuanlan.zhihu.com/p/35727707
  which: 在$PATH路径中查找可执行文件,默认返回第一个匹配路径,-a 返回所有匹配结果
  whereis:查找范围比which大、快
  locate:索引查找
  find:直接搜索整个文件目录,默认从根目录开始
  • 查看线程数
  pstree -p 进程id | wc -l
  top -H -p 进程id
  • 当前目录下文件数
  ls -l ./3  | grep "^-" | wc -l # 统计文件个数,不包括目录
  ls -lR| grep "^-" | wc -l # 统计文件个数,包括子目录
  ls -lR | grep "^d" | wc -l # 统计文件夹个数,包括子目录
  
  # wc -l:统计输出信息的行数
  • 后台运行
 nohup bash getVideo.sh data.CSV >> log.out 2>&1 &
  • 查看使用磁盘空间
  df -h  # 显示目前所有文件系统的可用空间及使用情形
  du -sh * # 查看当前目录下文件和文件夹使用空间大小
  du -sh # 查看当前目录总大小
 du -h –-max-depth=1 # 查看当前目录下文件和文件夹使用空间大小,类似于du -sh *
  du -h . |grep G |sort -nr # 查找大文件
  • 其他
unzip -o file.zip -d file/ # 解压
unzstd yourfilename.zst # 解压zst
dos2unix filename.sh # dos文件转unix文件,一般在windows编写的代码传到linux服务器时需要先转换文件格式

  • 环境变量设置

    • export:未用export定义的变量只对当前shell生效,但是执行脚本时会在子shell中运行,对于子shell而言没有该变量的定义;而export定义的变量对所有的子shell生效
    • source:未用source执行的脚本会在子shell中执行,而用source执行的脚本,会在当前shell下执行
    • 注:在shell中执行一个脚本其实是在一个子shell环境里运行的,脚本执行完后该子shell自动退出;执行脚本中用export定义的环境变量才会被复制到该子shell中(因此如果在同一行定义一个变量并执行一个脚本,该变量是在脚本所执行的子shell中生效的);如果单独一行不用export定义变量,该变量只对该shell有效,对子shell无效。
  • linux下运行文件为什么要加./

    • 原因是可执行文件的目录没有包含在环境变量PATH中,linux系统只会搜索PATH变量。而windows下却可以是因为系统会搜索PATH变量和当前目录。
    • https://www.cnblogs.com/fortunel/p/8663669.html
    • https://www.zhihu.com/question/24369805
    • https://www.cnblogs.com/lfri/p/12722981.html

参考:
[1]LINUX 暂停、继续进程

你可能感兴趣的:(工具学习,git,vim)