Linux&git入门&设计模式(常考点)

Git

学习资源:Git教程 - 廖雪峰的官方网站

摸清 Git 的门路,就靠这 22 张图

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 commitgit add时的状态

git rm a.txt 暂存区删除,如果commit就真的删了

git log 看日志,按q退出
git remote add ogrigin 首次添加远程仓库

git remote set-url ogrigin 重写设置远程仓库

git clone 直接clone远程仓库的东西
git branch dev 创建分支dev

git 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);   //当对象发生修改时,会通知所有的观察者,并进行方法回调
    }
}
相关推荐
海蓝可知天湛2 小时前
Ubuntu24.10禁用该源...+vmware无法复制黏贴“天坑闭环”——从 DNS 诡异解析到 Ubuntu EOL 引发的 apt 404排除折腾记
linux·服务器·安全·ubuntu·aigc·bug
vvw&2 小时前
如何在 Ubuntu 24.04 上安装和使用 AdGuard
linux·运维·服务器·ubuntu·adguard
遇见火星3 小时前
Linux 网络配置实战:RHEL/CentOS 7+ 永久静态路由配置与优先级调整全攻略
linux·网络·centos·静态路由·centos 7
安审若无4 小时前
linux怎么检查磁盘是否有坏道
linux·运维·服务器
HalvmånEver4 小时前
Linux的第二章 : 基础的指令(二)
linux·运维·服务器·开发语言·学习
大梦南柯4 小时前
linux创建网站
linux·运维·服务器
刘永鑫Adam4 小时前
代码管理及Linux模拟工具Git for Windows安装使用教程
linux·运维·服务器·git
孙同学_4 小时前
【Linux篇】信号从哪来?到哪去?—— Linux信号的产生方式与保存机制
linux·运维·服务器
唐古乌梁海4 小时前
【linux】crontab 命令详解,linux定时任务
linux·运维·服务器