# 查看git版本
git --version
# --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
# 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:所有
git init
或者 git clone
之后会生成一个目录。所有的开发都在该目录下进行。.git
的隐藏目录,是项目存储所有历史和元信息的目录commit
。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
git clean -xdf
只会清理主工程当前目录下所有没有 track 过的文件,不会删除子模块目录下的文件,如需清理子模块需要进入子模块目录下执行git clean -xdf
git rm --cached -r .
以及git reset --hard
。git reset
用于tracked文件,git clean
用于untracked文件git rm --cached
会从index里删除文件,但是本地保留文件。Android Debug Bridge,Android调试桥接器,简称ADB。
adb devices # 查看设备是否连接
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命令获取
参考:
[1]查询手机配置网站devicespecifications
[2]查询手机配置网站gsmarena
[3]Android ADB 命令行
[4]Android 使用ADB命令安装、卸载软件
:q! 不保存强制退出
:wq 保存并退出
跳转到行
普通模式下,gg 跳转到第一行;G跳转到尾行
命令模式下,:0或:1跳转到第一行;:$跳转到尾行
命令行模式下,:n跳转到第n行
显示行号:命令行模式下 :set nu 或:set number
跳转到列
Windows 命令提示符(即cmd)是Windows 系统的一种命令行操作工具。
dir /b *.mp4 >name.xls
ren *.bmp *.jpg
certutil -hashfile 文件绝对路径 MD5
tree > list.txt
bat文件是dos下的批处理文件
:: 这是代码注释
:: bat文件可以用记事本编写并修改保存文件的后缀名为.bat,若要显示中文,注意修改编码方式为ANSI
:: 或者也可以指定代码页为UTF-8
chcp 65001
:: rem 是注释命令,可以显示但不执行,且回显不受echo off的关闭回显影响
rem 关闭回显。默认打开回显,会依次显示所执行的命令
@echo off
rem pause使显示器停下,否则会一闪而过
pause
sh命令是shell命令语言解释器。
# 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个数 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
修改文件权限
查看进程
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 协议】
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服务器时需要先转换文件格式
环境变量设置
linux下运行文件为什么要加./
参考:
[1]LINUX 暂停、继续进程