Git
git init 初始化仓库
git clone 克隆仓库
git config user.name 查看用户名
git config user.email 查看邮箱
git add 添加到暂存区
git commit -m "成功添加2个文件" 添加到本地仓库
git status 查看当前仓库以及文件的状态
git diff 查看文件具体是怎么修改的
git reset 回退到上个版本
--hard已提交状态,--soft未提交状态 +前7位git checkout -- a.txt 让这个文件回到最近一次
git commit或git add时的状态git rm a.txt 暂存区删除,如果commit就真的删了
git log 看日志,按q退出
git remote add ogrigin 首次添加远程仓库git remote set-url ogrigin 重写设置远程仓库
git clone 直接clone远程仓库的东西
git branch dev 创建分支devgit checkout dev 切换到分支dev
git branch 查看当前分支
git merge dev dev合并到当前分支上
git branch -d dev 删除dev分支
git switch -c feacher 切换到分支feacher(第二种写法)
git switch master 切换到master分支(第二种写法)
git merge --no-ff 保留合并分支历史
git stach 暂时存储状态
git stach list 查看存储列表
git stach apply stach@{0} 恢复指定的stach
git stash drop stash@{0} 删除编号为 0 的 stash
git cherry-pick 获取另一个分支上某次更改的代码
git push <远程仓库名称> <分支名>
git pull 拉取
git fetch origin 拉取分支列表
git checkout -b dev origin/dev 创建dev分支并与origin/dev绑定git branch -- set-upstream-to <branch-name> origin/<branch-name> 本地与远程分支绑定
git tag <tagname> 打标签
idea实操流程:先clone远程仓库代码,然后打开idea,基于master新建分支(比如feature)。
写完后push and commit (同名远程分支) ,如果冲突了可以merge(此刻会把你本地的代码也更新)。
如果merge冲突了会弹窗,则沟通后选择一个使用,再push。
如果远程master更新了先本地master更新(常说的先pull一下),再切换会自己的分支将master代码merge过来。(有冲突再解决)
面试题:
git熟练吗?
git是版本控制工具,通常分为工作区,本地仓库、暂存区、远程仓库
我们开发首先用git pull拉取远程仓库代码,然后开发完用git add将代码存到暂存区,git commit提交到本地仓库,git push推送到远程仓库。
如果想撤回commit的修改可以使用git reset 命令撤回,如果想撤回push的修改,那我们再git reset 后再git push --force强制修改即可回退。
rebase和merge的区别
Rebase(变基)是将一个分支上的提交逐个地应用到另一个分支上,使得提交历史变得更加线性。
Merge(合并)是将两个分支上的代码提交历史合并为一个新的提交。在执行merge时,Git会创建一个新的合并提交,合并后的历史会保留每个分支的提交记录
不过我们通常还是用merge,它的历史记录更加直观一些
git冲突了怎么解决
我们用git status查看冲突状态,然后修改冲突文件,再add commit即可
Linux
常用命令
- top 用来查看系统资源
ps -ef | grep java查看 Java 进程netstat-nap 查看网络连接- ping 测试网络连通性
- chmod 修改文件权限
- kill 终止进程
- df 查看磁盘空间
- mkdir 创建目录、rm 删除文件、cp 复制文件、mv 移动文件
- zip 压缩文件、unzip 解压文件等等这些。
文件操作
ls:列出目录内容。ls -l显示详细信息,ls -a显示隐藏文件。cd:更改当前目录。cd ..回到上级目录,cd ~回到用户的主目录。pwd:显示当前工作目录的完整路径。mkdir:创建新目录。find:在目录树中查找文件。find /directory/ -name filename。cat:查看文件内容|------------------|---------------|
| rm 文件名/目录名 | 删除文件/目录 |
| cp 文件名 目录名 | 复制文件到指定目录 |
| mv 文件名 目录名 | 移动文件到指定目录 |
| vim 或 vi 文件名 | 编辑文件 |
系统操作
ps:显示当前运行的进程。ps aux显示所有进程。top:实时显示进程动态。kill:终止进程。kill -9 PID强制终止。df:显示磁盘空间使用情况。df -h以易读格式显示
网络管理
ping:检查与远程服务器的连接。ifconfig:显示网络接口的配置信息。netstat:显示网络连接、路由表和网络接口信息
压缩和解压
tar:打包或解包.tar文件。tar cvf archive.tar files打包,tar xvf archive.tar解包。gzip/gunzip:压缩或解压.gz文件。zip/unzip:压缩或解压.zip文件
设计模式
单例:只有一个实例对象
饿汉式,在一开始类加载时就创建好了
java
public class Singleton {
private final static Singleton INSTANCE = new Singleton(); //用于引用全局唯一的单例对象,在一开始就创建好
private Singleton() {} //不允许随便new,需要对象直接找getInstance
public static Singleton getInstance(){ //获取全局唯一的单例对象
return INSTANCE;
}
}
懒汉式,在方法中进行的初始
java
public class Singleton {
private static volatile Singleton INSTANCE; //在一开始先不进行对象创建
private Singleton() {} //不用多说了吧
public static Singleton getInstance(){ //将对象的创建延后到需要时再进行
if(INSTANCE == null) { //如果实例为空,那么就进行创建,不为空说明已经创建过了,那么就直接返回
synchronized(Singleton.class)
{
// 第二次校验:防止多线程等待锁时,已有线程创建实例
if (INSTANCE == null) {
INSTANCE = new Singleton(); // volatile 禁止指令重排,避免拿到未初始化的实例
}
}
}
return INSTANCE;
}
}
简单工厂模式:通过工厂来获取不同的产品,但不满足开放封闭的设计原则,增添功能时要改源码
java
public class FruitFactory {
public static Fruit getFruit(String type) {
switch (type) {
case "苹果":
return new Apple();
case "橘子":
return new Orange();
default:
return null;
}
}
}
工厂方法模式:通过创建一个抽象工厂,每种对象单独继承它写一个工厂来返回对象,创建对象只需要调用对应工厂的方法即可
java
public abstract class FruitFactory<T extends Fruit> { //将水果工厂抽象为抽象类,添加泛型T由子类指定水果类型
public abstract T getFruit(); //不同的水果工厂,通过此方法生产不同的水果
}
java
public class AppleFactory extends FruitFactory<Apple> { //苹果工厂,直接返回Apple,一步到位
@Override
public Apple getFruit() {
return new Apple();
}
}
代理:代理类和被代理的类都实现同一个接口/抽象类,并在原有方法前后执行相关操作
java
public class Proxy extends Subject{ //为了保证和Subject操作方式一样,保证透明性,也得继承
Subject target; //被代理的对象(甚至可以多重代理)
public Proxy(Subject subject){
this.target = subject;
}
@Override
public void test() { //由代理去执行被代理对象的方法,并且我们还可以在前后添油加醋
System.out.println("代理前绕方法");
target.test();
System.out.println("代理后绕方法");
}
}
策略:给定几种选择,根据实际需求调用其中的一种
java
public interface Strategy { //策略接口,不同的策略实现也不同
Strategy SINGLE = Arrays::sort; //单线程排序方案
Strategy PARALLEL = Arrays::parallelSort; //并行排序方案
void sort(int[] array);
}
模板方法:具体要完成的方法定义,实现交由子类完成
java
public abstract class AbstractDiagnosis {
public void test(){
System.out.println("去医院看病了~");
//由于现在不知道该开什么处方,所以只能先定义一下行为,然后具体由子类实现
//大致的流程先定义好就行
this.prescribe();
this.medicine(); //开药同理
}
public abstract void prescribe(); //开处方操作根据具体病症决定了
public abstract void medicine(); //拿药也是根据具体的处方去拿
}
责任链:通过将任务一级一级不断向下传递,来对我们所需要的任务进行过滤和处理。
java
public abstract class Handler {
protected Handler successor; //这里我们就设计责任链以单链表形式存在,这里存放后继节点
public Handler connect(Handler successor){ //拼接后续节点
this.successor = successor;
return successor; //这里返回后继节点,方便我们一会链式调用
}
public void handle(){
this.doHandle(); //由不同的子类实现具体处理过程
Optional
.ofNullable(successor)
.ifPresent(Handler::handle); //责任链上如果还有后继节点,就继续向下传递
}
public abstract void doHandle();
}
观察者:对象发生改变时,观察者能够立即观察到并进行一些联动操作
java
public class Subject {
private final Set<Observer> observerSet = new HashSet<>();
public void observe(Observer observer) { //添加观察者
observerSet.add(observer);
}
public void modify() { //模拟对象进行修改
observerSet.forEach(Observer::update); //当对象发生修改时,会通知所有的观察者,并进行方法回调
}
}