java

java

Spring Initializr中生成的mvnw是干吗的?

科技创新王叫兽 发表了文章 • 0 个评论 • 53 次浏览 • 2021-02-04 10:11 • 来自相关话题

来源于公众号-程序猿DD当我们使用Spring Initializr来创建Spring Boot工程的时候,有没有发现在工程根目录下有两个名为mvnw的文件:从命名、图标、扩展名来猜测,这两个文件的作用应该是一样的,只是cmd文件应该是用在windows下跑的... ...查看全部

来源于公众号-程序猿DD

当我们使用Spring Initializr来创建Spring Boot工程的时候,有没有发现在工程根目录下有两个名为mvnw的文件:

微信图片_20210203173520.jpg

从命名、图标、扩展名来猜测,这两个文件的作用应该是一样的,只是cmd文件应该是用在windows下跑的,而另外一个则是用于linux环境下跑的。

那么这个文件到底是用来做什么呢?下面我们一起尝试了解一下:

第一步:打开读一下

微信图片_20210203173526-1024x1531.png

因为内容较多,我这里就不放出来了。内容也非常易懂,只要你了解shell和maven,就能知道这个脚本主要做这几件事:

  1. 检测你是否有安装Maven,如果没有,就自动下载一个(这样才能完成后续的构建任务)

  2. 检查你是否有安装Java或者配置是否正确,这个无法自己完成,如果报错了,就要自己处理一下,比如JAVA_HOME没有,那就自己配置下。

  3. 检查否存在版本不兼容的情况,如果不兼容他会下载合适的版本来帮助你完成构建

更多检查的细节可以自行打开查看和学习

第二步:执行验证下

执行命令:mvnw install

微信图片_20210203173531.png等待构建完成,我们再看看:微信图片_20210203173534.png完美!轻松简单的完成了一个Spring Boot项目的构建!

关于高阶JAVA枚举你不知道的事!

科技创新赵炳东 发表了文章 • 0 个评论 • 115 次浏览 • 2021-02-03 17:12 • 来自相关话题

JAVA枚举,比你想象中功能还要强大!我经常发现自己在Java中使用枚举来表示某个对象的一组值。在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义。当我第一次了解枚举时,当时我认为它们只是一个为常量命名的工具,可以很容易地被静态常量... ...查看全部

微信截图_20210203171135.png

JAVA枚举,比你想象中功能还要强大!

我经常发现自己在Java中使用枚举来表示某个对象的一组值。

在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义。

当我第一次了解枚举时,当时我认为它们只是一个为常量命名的工具,可以很容易地被静态常量字符串ENUM_VAL_NAME所取代。

后来我发现我错了。事实证明,Java枚举具有相当高级的特性,可以使代码干净、不易出错,功能强大。

让我们一起来看看Java中的一些高级枚举特性,以及如何利用这些特性使代码更简单、更可读。

枚举是类!

在Java中,枚举是Object的一个子类。让我们看看所有枚举的基类,Enum<E>(为简洁起见进行了修改)。

public abstract class Enum<E extends Enum<E>>
    implements Constable, Comparable<E>, Serializable {
  private final String name;
  
  public final String name() {
      return name;
  }
  
  private final int ordinal;
  
  public final int ordinal() {
      return ordinal;
  }
  
  protected Enum(String name, int ordinal) {
      this.name = name;
      this.ordinal = ordinal;
  }
  
  public String toString() {
      return name;
  }
  
  public final boolean equals(Object other) {
      return this==other;
  }
  
  public final int hashCode() {
      return super.hashCode();
  }
  
  public final int compareTo(E o) {
      Enum<?> other = (Enum<?>)o;
      Enum<E> self = this;
      if (self.getClass() != other.getClass() && // optimization           self.getDeclaringClass() != other.getDeclaringClass())
          throw new ClassCastException();
      return self.ordinal - other.ordinal;
  }
}

我们可以看到,这基本上只是一个常规的抽象类,有两个字段,name和ordinal。

所以说枚举都是类,它们具有常规类的许多特性。

我们能够为枚举提供实例方法、构造函数和字段。我们可以重写toString(),但不能重写hashCode()或equals(Object other)。

接下来我们看下我们的枚举示例,Operation

enum Operation {
    ADD,
    SUBTRACT,
    MULTIPLY
  }

这个枚举表示一个Operation可以对两个值执行,并将生成一个结果。关于如何实现此功能,您最初的想法可能是使用switch语句,如下所示:

 public int apply(Operation operation, int arg1, int arg2) {
    switch(operation) {
      case ADD:
        return arg1 + arg2;
      case SUBTRACT:
        return arg1 - arg2;
      case MULTIPLY:
        return arg1 * arg2;
      default:
        throw new UnsupportedOperationException();
  }
}

当然,这样子会有一些问题。

第一个问题是,如果我们将一个新operation添加到我们的Operation中,编译器不会通知我们这个开关不能正确处理新操作。

更糟糕的是,如果一个懒惰的开发人员在另一个类中复制或重新编写这些代码,我们可能无法更新它。

第二个问题是默认情况default,每段程序里面都是必需的,尽管我们知道在正确的代码里它永远不会发生。

这是因为Java编译器知道上面的第一个问题,并且希望确保我们能够处理在不知情的情况下向Operation中添加了新枚举。

还好,Java8用函数式编程为我们提供了一个干净的解决方案。

函数枚举实现

因为枚举是类,所以我们可以创建一个枚举字段来保存执行操作的函数。

但是在我们找到解决方案之前,让我们先来看看一些重构。

首先,让我们把开关放在enum类中。

 enum Operation {
  ADD,
  SUBTRACT,
  MULTIPLY;
  
  public static int apply(Operation operation, int arg1, int arg2) {
    switch(operation) {
      case ADD:
        return arg1 + arg2;
      case SUBTRACT:
        return arg1 - arg2;
      case MULTIPLY:
        return arg1 * arg2;
      default:
        throw new UnsupportedOperationException();
    }
  }
}

我们可以这样做:Operation.apply(Operation.ADD, 2, 3);

因为我们现在从Operation中调用方法,所以我们可以将其更改为实例方法并使用this,而不是用Operation.apply()来实现,如下所示:

public int apply(int arg1, int arg2) {
  switch(this) {
    case ADD:
      return arg1 + arg2;
    case SUBTRACT:
      return arg1 - arg2;
    case MULTIPLY:
      return arg1 * arg2;
    default:
      throw new UnsupportedOperationException();
  }
}

像这样使用:Operation.ADD.apply(2, 3);

看起来变好了。现在让我们更进一步,通过使用函数式编程完全消除switch语句。

enum Operation {
              ADD((x, y) -> x + y),
              SUBTRACT((x, y) -> x - y),
              MULTIPLY((x, y) -> x * y);
  
              Operation(BiFunction<Integer, Integer, Integer> operation) {
                      this.operation = operation;
              }
  
              private final BiFunction<Integer, Integer, Integer> operation;
  
              public int apply(int x, int y) {
                      return operation.apply(x, y);
              }
  
  }

这里我做的是:

  • 添加了一个字段 BiFunction<Integer, Integer, Integer> operation

  • 用BiFunction创建了用于Operation的构造函数。

  • 调用枚举定义中的构造函数,并用lambda指定BiFunction<Integer, Integer, Integer>。

这个java.util.function.BiFunction operation字段是对采用两个参数的函数(方法)的引用。

在我们的例子中,两个参数都是int,返回值也是int。不幸的是,Java参数化类型不支持原语,所以我们必须使用Integer。

因为BiFunction是用@functioninterface注释的,所以我们可以使用Lambda表示法定义一个。

因为我们的函数接受两个参数,所以我们可以使用(x,y)来指定它们。

然后我们定义了一个单行方法,它使用 ->x+y 返回一个值。这相当于下面的方法,只是更简洁而已。

  class Adder implements BiFunction<Integer, Integer, Integer> {
          @Override           public Integer apply(Integer x, Integer y) {
                  return x + y;
    }
  }

我们的新Operation实现采用相同的方式:Operation.ADD.apply(2, 3);.

但是,这种实现更好,因为编译器会告诉我们何时添加了新Operation,这要求我们更新函数。如果没有这一点,如果我们在添加新Operation时还不记得更新switch语句,就有可能得到UnsupportedOperationException()。

关键要点

  • Enum枚举是Enum的扩展类。

  • Enum枚举可以有字段、构造函数和实例方法。

  • Enum枚举字段可以存储函数。与lambda配合使用,可以创建干净、安全的特定于枚举的函数实现,并在编译时强制执行它们(而不是使用switch)。

下面是这个示例的GitHub地址。(https://github.com/alex-power/java-enum-example)

本文参考:https://medium.com/javarevisited/advanced-java-enum-features-you-need-to-know-b516a191c7e2

(来源于公众号:程序猿DD)


2020年Java语言发展现状

IM即时通讯王叫兽 发表了文章 • 0 个评论 • 397 次浏览 • 2020-10-13 10:31 • 来自相关话题

作者 | Valeriia Karpenko译者 | 刘雅梦策划 | 陈思今年,Java 到达了一个不可思议的里程碑,达到了 25 岁的高龄。我们通过举办一个特别的在线 Java 日活动来庆祝它的诞生,在该活动中,许多专家演讲者分... ...查看全部
作者 | Valeriia Karpenko


译者 | 刘雅梦
策划 | 陈思

今年,Java 到达了一个不可思议的里程碑,达到了 25 岁的高龄。我们通过举办一个特别的在线 Java 日活动来庆祝它的诞生,在该活动中,许多专家演讲者分享了他们的经验,并就如何从这门语言中获得更多收益提供了技巧和窍门。

这引起了我们的思考,我们决定对数据进行深入研究,以彻底发现 Java 的普遍状态是什么,并帮助你回答一些亟待解决的问题。我们发现的某些内容可能是不足为奇的,但也有些见解是令人非常意想不到的。

随着 Java 15 在本周的发布,我们决定把它放在一起,向你展示 Java 的状态。这篇文章是根据不同来源的数据而创建的,其中包括我们的开发人员倡导者 Trisha Gee 的专家评论。

Java 开发者有多少,他们分布在哪里?

第一个问题是:“大多数的 Java 开发人员都在哪里,我们中有多少人是 Java 开发人员呢?”我们通过综合所能获取到的最准确的信息来回答这个问题,然后进行推断,得出一个我们认为非常合理的猜测。

市场研究和分析团队根据开发人员估算模型得出的最佳估计显示,当今世界上有大约 520 万专业 Java 开发人员,他们将 Java 作为主要语言。但是,如果我们将主要使用其他编程语言但同时也做一些 Java 工作的专业开发人员也包含在内的话,这个数字可能 接近 680 万。

至于这些 Java 开发人员都集中在什么地方,在亚洲居住的 Java 开发人员数量最多,那里大约有 250 万开发人员使用 Java 作为主要语言。北美和欧洲的数字远不及亚洲。你可能会问:“为什么呢?”好吧,起初我们有也有同样的想法,因此我们对这些区域进行了更深入的研究,以确切地了解这些数字的来源。


1.png哪个国家的 Java 开发者最多?

我们进一步研究了拥有最多 Java 开发人员的各个国家,然后调查了为什么这些国家在专业开发中特别喜欢 Java 而不是其他语言。

下图显示了每个国家使用 Java 作为主要语言的开发人员的百分比(用于收集此数据的调查对象最多可以选择 3 种主要语言)。中国韩国 的数值最高,分别约为 51%和 50%。数据来自 2020 年开发者生态系统状况调查

专家分析

Java 在前 6 个国家如此流行的原因可能包括 Java 是免费使用的、政府支持和开源。对于 中国、西班牙巴西 尤其是这样。它是在 中国和印度 进行 Android 移动开发的基础,并且雇佣海外人员用 Java 开发手机应用程序非常普遍,这可能是 印度 使用量达到峰值的原因。德国 的使用率也很高,这可以归因于 Java 在 德国 软件工程师中是最流行的语言,因为多种行业都使用 Java 来构建高度可扩展的应用程序。大多数企业服务都依靠 Java 来驱动应用程序支持日常业务的运行,例如工资单、库存管理、报表等。德国还有一个庞大的金融部门,在本国技术上大量使用 Java,例如交易机器人、零售银行系统以及金融业为了保持竞争所需要的其他应用程序。

我们本以为美国会有很高比例的 Java 用户,但是并没有,这也是很合理的。有大量的技术栈可供选择,而且很多技术公司通常处于这些技术栈的最前沿,因此那里的开发人员可能不需要 Java 的强大功能或稳定性,而是使用能让他们进行快速构建和测试等的语言。

2.pngJava 在开发行业中的位置

根据 2020 年开发者生态系统状况调查,有超过三分之一的专业开发人员将 Java 用作主要语言,而 Java 在专业开发人员当中仍然是仅次于 JavaScript 的第二大主要语言。

专家分析

看到 JavaScript 和 Java 处于领先地位,这并不奇怪,因为它们是成对的:使用 Java 的开发人员经常使用 JavaScript 编写前端和任意快速脚本。由于机器学习的普及,Python 可能排名第三。一般来说,我们希望 Web 成为开发人员生态系统的重要组成部分,因此 JavaScript、HTML 和 CSS 以及 PHP 将始终能拥有稳固的地位。SQL 也会一直存在,因为没有多少东西是不需要某种容量的数据库的。C++ 也是一种坚实的语言,因为它被用于许多嵌入式应用程序中,因此它不会很快在图表中消失。虽然 C# 似乎正在逐渐衰落,但我想如果 Java 比例高,C# 就会低,因为它们在功能上非常相似。至于为什么我认为 Java 在专业发展领域如此之高,原因与之前提到的德国类似。大多数企业的业务服务都依靠 Java 来运行。它不仅仅用于 IT 部门,几乎每个公司,无论是分销、制造还是银行业,都将 IT 服务作为其基础设施的一部分,而这些服务,如工资单或库存管理,通常都是在后端使用 Java 构建的。因此,Java 被这些公司的专业开发人员所大量使用。

3.png用 Java 开发的软件类型

快速浏览一下用 Java 开发的软件类型,应该可以了解它的使用统计信息。根据2020 年开发者生态系统状况调查的结果,Java 使用最流行的领域是 Web 服务,占 52%。

专家分析

看到 Java 在商业智能 / 数据科学 / 机器学习中如此流行,真令人惊讶,因为你可能认为这将是 Python 的领域。其他的就不足为奇了,因为 Web 服务的后端通常是 Java,而且使用 Java 编写业务应用程序也很有意义,因为它们也需要使用后端和数据库。

4.png使用 Java 的热门行业

既然我们知道了为什么这么多专业开发人员使用 Java,那么让我们具体看看 Java 应用于哪些行业。

根据 2020 年开发者生态系统状况调查,Java 程序 主要用于 IT 服务(42%)与金融和金融科技领域(44%),但这并不是说 Java 没有用于其他行业。

专家分析

金融和金融科技领域主要涉及金融交易所、零售银行系统、创建计算引擎以及开发本地定制工具和服务,以使公司在市场上具有竞争力。金融和金融科技几乎都是用 Java 建立的,所以在这里没有什么好惊讶的。IT 服务也是如此,因为许多针对非 IT 公司的薪资系统和库存管理服务都是基于 Java 构建的。其他行业也很有趣。由于 Android 的存在,移动开发的比例可能很高,因此 Java 正以这种方式被使用。大数据和数据分析也非常有趣,因为该行业是由 Python 主导的,但是后端可能会使用 Java 和 JVM 语言。当然构建软件开发工具也可以。JetBrains IDE 目前是用 Java 构建的。尽管其他行业有点神秘,但实际上,了解 Java 在这些行业中的使用方式将非常有趣。

5.pngJava 相关工具

Java 版本

Java 8 仍然是最受欢迎的版本。在使用 Java 作为主要语言的专业开发人员当中,有 75%的人使用 Java 8。基于开发人员在 2020 年开发者生态系统状况调查 中选择的几个版本,下图显示了 Java 版本的分布情况。

专家分析

有几个因素导致了 Java 8 的如此流行。首先,它拥有典型的 Java 开发人员所需要的所有语言,它具有 lambda 和流,并且它是一个很好的易于使用的版本。另外,人们一直不愿意迁移到 Java9。Java9 引入了一些重大的架构更改,人们担心这些更改会破坏他们用 Java 8 构建的应用程序。最重要的是,Oracle 还推出了每两年发布一次的版本,因此并不是所有版本都是长期受支持的,因此 Java 9、Java 10、Java 12 和 Java 13 仅受 6 个月的支持,这可能就是为什么它们都只有这么少用户的原因。Java 13 之所以如此之高,是因为当本调查公布时,它是最新的版本,因此你可以预期,该数字将在几个月后下降。

Java 11 发布于 2018 年,它是长期受支持的最新版本。许多企业仍未迁移到它,因为他们担心超过 Java 9(由于其架构的更改)会破坏一切,而且 Java 11 引入了新的许可和新的订阅,因此它带来了一个新的恐惧:更担心如果使用了错误的版本,以错误的方式使用它,Oracle 会对你进行罚款。许多开发人员没有升级到 Java 11 的最后一个主要因素是,它没有很多令人兴奋的新功能,因此该语言的功能并没有降低升级的风险。Java 17 将是下一个拥有长期支持的版本,并带有许多新功能,但是直接从 Java 8 升级到 Java 17 也会带来一些问题。

我的预测是,我认为下一个长期版本 Java 17 将比上一个 LTS(长期支持版本)Java 11 更受欢迎。不过,作为 Java 17 的准备,这一点我再强调也不为过,建议你先将代码库更新到 Java 11,然后再更新为 Java 17,以避免出现大问题。

6.png流行的应用服务器

在过去的 3 年中,Apache Tomcat 仍然是最受欢迎的应用服务器,而 JBoss EAP 和 WildFly 的使用量却减少了一半。给出的数据来自参加 2018 年 和 2020 年 开发者生态系统调查的所有以 Java 为主要语言的开发人员。

专家分析

Jetty 位居第二,但它确实低得令人惊讶。可能是某些正在使用 Spring Boot 和其他微服务框架的开发人员没有意识到他们到底在使用使用,他们可能在不知不觉中使用了 Tomcat 或 Jetty。

7.png排名前 5 的 Web 框架

在 2018 年,Spring Boot 与 Spring MVC 是一样流行的,到了 2020 年,它变得更加流行。给出的数据来自所有使用 Java 作为主要语言的开发人员。

专家分析

这基本上只是在证实 Spring 拥有市场。几乎可以肯定的是,仍然有人在使用 Struts 1,但它只是用于遗留应用程序。

8.png排名前 5 的分析器

2020 年开发者生态系统状况调查 显示,有 24%的用户使用 VisualVM,而一半的用户则没有使用。给出的数据来自所有使用 Java 作为主要语言的开发人员。

9.png

排名前 5 的 IDE/ 编辑器

2018 年 和 2020 年 的开发者生态系统调查显示,IntelliJ IDEA 的份额从 2018 年的 55%增加到 2020 年的 72%,而其他四个的使用率则有所下降。

专家分析

不过,即使我们对调查结果进行了加权,但我们并不否认这些信息可能会有些偏差,因为这是来自 JetBrains 开发者生态系统状态调查,而 JetBrains 的一个主要产品就是 IntelliJ IDEA。然而,这并不是说这并非完全不合理,就好像我们在其他调查中看到的一样,IntelliJ IDEA 通常是使用最多的 IDE 之一,并且通常拥有约 55-60%的用户份额。VS Code 正在增长,这不是从竞争的角度来看的,而是从缺乏对 IDE 的理解的角度来看的。VS Code 是一个代码编辑器,带有一些你可以在 IDE 中找到的特性,并且可以提供附加功能的扩展。因此,如果人们使用 VS Code 进行开发,则可能意味着开发人员不知道一个功能齐全的 IDE 能给他们什么。在 Web 领域,使用编辑器是可以理解的,因为 Web 开发人员通常使用动态语言,并且经常使用其他工具(例如浏览器插件)来满足他们的需求。但是在 Java 中,特别是在专业的 Java 中,你确实可以从一个与应用程序服务器集成的优秀工具中得到很多东西,你可以真正使用分析、重构等功能。

我们专家的最新消息

我发现有很多对本博客文章数据分析进行删减和编辑的版本,这是我无意间造成的混乱。我想澄清一下我对开发人员和 IDE 评论背后的意图。对我来说,如果开发人员不理解 IntelliJ IDEA 作为一个功能齐全的 IDE 给他们带来了什么,那对我来说就是一个失败,因为这六年来我的工作就是让开发人员了解 IDE(特别是 IntelliJ IDEA)能为你做什么。我强烈地认为,人们不应该因为不了解产品而责备用户或潜在用户。

我个人对 IDE 的观点来自拥有 20 多年 Java 开发经验的 Java 开发人员,他们开发过各种大大小小的 Java 项目。如果没有像 IntelliJ IDEA 这样的 IDE 提供大量的帮助,我无法想象如何创建一个复杂的企业应用程序。我也见过很多开发人员使用 VS Code,并且我完全了解代码编辑器所涵盖的用例。在你的工具箱中总有能容纳多于一种的工具,了解某个工具的优点将有助于我们为正确的工作选择合适的工具。

10.png讨论最多的 Java 工具和其他语言

在 IT 社区中会经常讨论 Java,其中的一个社区就是 Stack Overflow。我们从 “问答”部分 中获取了数据,以找出哪些标签与“ java”最相关。纵轴表示提到 Java 的次数,横轴表示标签出现的总次数。

专家分析

对于那些希望确保自己使用了正确的技术或正寻找适合自己的工具的用户来说,这个图表可能很有用。这些语言很有意思,但这可能是因为人们正在寻找 Java 与其他语言之间的比较。正则表达式是人们苦苦挣扎的一个利基领域,但它能上榜也就不足为奇了。

11.pngJava 社区的热门话题

Java 的讨论

我们分析了 Reddit 上“ java”子版块的帖子,并发现了 Java 用户在 Reddit 上讨论最多的主题。

专家分析

这些正是我期望看到的话题。例如,用 Java 编写代码的人总是会对这种语言是否仍然有需求感兴趣,毕竟,这种语言还在发展。我们刚刚庆祝了 Java 诞生 25 周年,因此人们希望检查它是否过时了,以及它是否仍然有效。特别是,如果他们刚从大学毕业,还不知道他们所学的语言是否能为他们提供工作机会。在容器中部署 Java 是一个非常热门的话题,包括我在内,这是每个人都想知道的东西,但几乎找不到任何相关信息。我对性能优化这个主题并不感到惊讶,尽管我认为这个主题有点多余,因为大多数应用程序实际上并不需要开发人员来进行优化,尽管许多开发人员认为这是一项重要的职业技能。使后端和前端协同工作也非常复杂,我可以想到有很多关于这方面的问题。

12.png

原文链接:

https://blog.jetbrains.com/idea/2020/09/a-picture-of-java-in-2020/



工作中99%能用到的git命令

IM即时通讯梅川酷子 发表了文章 • 0 个评论 • 108 次浏览 • 2020-06-29 11:48 • 来自相关话题

分支操作 git branch 创建分支 git checkout -b 创建并切换到新建的分支上 git checkout 切换分支 git branch 查看分支列表 git branch -v 查看所有分支的最后一次操作 git branch -vv ... ...查看全部

分支操作



git branch 创建分支

git checkout -b 创建并切换到新建的分支上

git checkout 切换分支

git branch 查看分支列表

git branch -v 查看所有分支的最后一次操作

git branch -vv 查看当前分支

git brabch -b 分支名 origin/分支名 创建远程分支到本地

git branch --merged 查看别的分支和当前分支合并过的分支

git branch --no-merged 查看未与当前分支合并的分支

git branch -d 分支名 删除本地分支

git branch -D 分支名 强行删除分支

git branch origin :分支名 删除远处仓库分支

git merge 分支名 合并分支到当前分支上





暂存操作



git stash 暂存当前修改

git stash apply 恢复最近的一次暂存

git stash pop 恢复暂存并删除暂存记录

git stash list 查看暂存列表

git stash drop 暂存名(例:stash@{0}) 移除某次暂存

git stash clear 清除暂存



回退操作





git reset --hard HEAD^ 回退到上一个版本

git reset --hard ahdhs1(commit_id) 回退到某个版本

git checkout -- file撤销修改的文件(如果文件加入到了暂存区,则回退到暂存区的,如果文件加入到了版本库,则还原至加入版本库之后的状态)

git reset HEAD file 撤回暂存区的文件修改到工作区



标签操作





git tag 标签名 添加标签(默认对当前版本)

git tag 标签名 commit_id 对某一提交记录打标签

git tag -a 标签名 -m '描述' 创建新标签并增加备注

git tag 列出所有标签列表

git show 标签名 查看标签信息

git tag -d 标签名 删除本地标签

git push origin 标签名 推送标签到远程仓库

git push origin --tags 推送所有标签到远程仓库

git push origin :refs/tags/标签名 从远程仓库中删除标签



常规操作





git push origin test 推送本地分支到远程仓库

git rm -r --cached 文件/文件夹名字 取消文件被版本控制

git reflog 获取执行过的命令

git log --graph 查看分支合并图

git merge --no-ff -m '合并描述' 分支名 不使用Fast forward方式合并,采用这种方式合并可以看到合并记录

git check-ignore -v 文件名 查看忽略规则

git add -f 文件名 强制将文件提交





git创建项目仓库



1、git init 初始化 2、git remote add origin url 关联远程仓库 3、git pull 4、git fetch 获取远程仓库中所有的分支到本地



忽略已加入到版本库中的文件

1、git update-index --assume-unchanged file 忽略单个文件 2、git rm -r --cached 文件/文件夹名字 (. 忽略全部文件)



取消忽略文件

git update-index --no-assume-unchanged file



拉取、上传免密码

git config --global credential.helper store





作者:playboy5566

链接:https://segmentfault.com/a/1190000023001428

来源:SegmentFault 思否

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


Spring Initializr中生成的mvnw是干吗的?

科技创新王叫兽 发表了文章 • 0 个评论 • 53 次浏览 • 2021-02-04 10:11 • 来自相关话题

来源于公众号-程序猿DD当我们使用Spring Initializr来创建Spring Boot工程的时候,有没有发现在工程根目录下有两个名为mvnw的文件:从命名、图标、扩展名来猜测,这两个文件的作用应该是一样的,只是cmd文件应该是用在windows下跑的... ...查看全部

来源于公众号-程序猿DD

当我们使用Spring Initializr来创建Spring Boot工程的时候,有没有发现在工程根目录下有两个名为mvnw的文件:

微信图片_20210203173520.jpg

从命名、图标、扩展名来猜测,这两个文件的作用应该是一样的,只是cmd文件应该是用在windows下跑的,而另外一个则是用于linux环境下跑的。

那么这个文件到底是用来做什么呢?下面我们一起尝试了解一下:

第一步:打开读一下

微信图片_20210203173526-1024x1531.png

因为内容较多,我这里就不放出来了。内容也非常易懂,只要你了解shell和maven,就能知道这个脚本主要做这几件事:

  1. 检测你是否有安装Maven,如果没有,就自动下载一个(这样才能完成后续的构建任务)

  2. 检查你是否有安装Java或者配置是否正确,这个无法自己完成,如果报错了,就要自己处理一下,比如JAVA_HOME没有,那就自己配置下。

  3. 检查否存在版本不兼容的情况,如果不兼容他会下载合适的版本来帮助你完成构建

更多检查的细节可以自行打开查看和学习

第二步:执行验证下

执行命令:mvnw install

微信图片_20210203173531.png等待构建完成,我们再看看:微信图片_20210203173534.png完美!轻松简单的完成了一个Spring Boot项目的构建!

关于高阶JAVA枚举你不知道的事!

科技创新赵炳东 发表了文章 • 0 个评论 • 115 次浏览 • 2021-02-03 17:12 • 来自相关话题

JAVA枚举,比你想象中功能还要强大!我经常发现自己在Java中使用枚举来表示某个对象的一组值。在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义。当我第一次了解枚举时,当时我认为它们只是一个为常量命名的工具,可以很容易地被静态常量... ...查看全部

微信截图_20210203171135.png

JAVA枚举,比你想象中功能还要强大!

我经常发现自己在Java中使用枚举来表示某个对象的一组值。

在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义。

当我第一次了解枚举时,当时我认为它们只是一个为常量命名的工具,可以很容易地被静态常量字符串ENUM_VAL_NAME所取代。

后来我发现我错了。事实证明,Java枚举具有相当高级的特性,可以使代码干净、不易出错,功能强大。

让我们一起来看看Java中的一些高级枚举特性,以及如何利用这些特性使代码更简单、更可读。

枚举是类!

在Java中,枚举是Object的一个子类。让我们看看所有枚举的基类,Enum<E>(为简洁起见进行了修改)。

public abstract class Enum<E extends Enum<E>>
    implements Constable, Comparable<E>, Serializable {
  private final String name;
  
  public final String name() {
      return name;
  }
  
  private final int ordinal;
  
  public final int ordinal() {
      return ordinal;
  }
  
  protected Enum(String name, int ordinal) {
      this.name = name;
      this.ordinal = ordinal;
  }
  
  public String toString() {
      return name;
  }
  
  public final boolean equals(Object other) {
      return this==other;
  }
  
  public final int hashCode() {
      return super.hashCode();
  }
  
  public final int compareTo(E o) {
      Enum<?> other = (Enum<?>)o;
      Enum<E> self = this;
      if (self.getClass() != other.getClass() && // optimization           self.getDeclaringClass() != other.getDeclaringClass())
          throw new ClassCastException();
      return self.ordinal - other.ordinal;
  }
}

我们可以看到,这基本上只是一个常规的抽象类,有两个字段,name和ordinal。

所以说枚举都是类,它们具有常规类的许多特性。

我们能够为枚举提供实例方法、构造函数和字段。我们可以重写toString(),但不能重写hashCode()或equals(Object other)。

接下来我们看下我们的枚举示例,Operation

enum Operation {
    ADD,
    SUBTRACT,
    MULTIPLY
  }

这个枚举表示一个Operation可以对两个值执行,并将生成一个结果。关于如何实现此功能,您最初的想法可能是使用switch语句,如下所示:

 public int apply(Operation operation, int arg1, int arg2) {
    switch(operation) {
      case ADD:
        return arg1 + arg2;
      case SUBTRACT:
        return arg1 - arg2;
      case MULTIPLY:
        return arg1 * arg2;
      default:
        throw new UnsupportedOperationException();
  }
}

当然,这样子会有一些问题。

第一个问题是,如果我们将一个新operation添加到我们的Operation中,编译器不会通知我们这个开关不能正确处理新操作。

更糟糕的是,如果一个懒惰的开发人员在另一个类中复制或重新编写这些代码,我们可能无法更新它。

第二个问题是默认情况default,每段程序里面都是必需的,尽管我们知道在正确的代码里它永远不会发生。

这是因为Java编译器知道上面的第一个问题,并且希望确保我们能够处理在不知情的情况下向Operation中添加了新枚举。

还好,Java8用函数式编程为我们提供了一个干净的解决方案。

函数枚举实现

因为枚举是类,所以我们可以创建一个枚举字段来保存执行操作的函数。

但是在我们找到解决方案之前,让我们先来看看一些重构。

首先,让我们把开关放在enum类中。

 enum Operation {
  ADD,
  SUBTRACT,
  MULTIPLY;
  
  public static int apply(Operation operation, int arg1, int arg2) {
    switch(operation) {
      case ADD:
        return arg1 + arg2;
      case SUBTRACT:
        return arg1 - arg2;
      case MULTIPLY:
        return arg1 * arg2;
      default:
        throw new UnsupportedOperationException();
    }
  }
}

我们可以这样做:Operation.apply(Operation.ADD, 2, 3);

因为我们现在从Operation中调用方法,所以我们可以将其更改为实例方法并使用this,而不是用Operation.apply()来实现,如下所示:

public int apply(int arg1, int arg2) {
  switch(this) {
    case ADD:
      return arg1 + arg2;
    case SUBTRACT:
      return arg1 - arg2;
    case MULTIPLY:
      return arg1 * arg2;
    default:
      throw new UnsupportedOperationException();
  }
}

像这样使用:Operation.ADD.apply(2, 3);

看起来变好了。现在让我们更进一步,通过使用函数式编程完全消除switch语句。

enum Operation {
              ADD((x, y) -> x + y),
              SUBTRACT((x, y) -> x - y),
              MULTIPLY((x, y) -> x * y);
  
              Operation(BiFunction<Integer, Integer, Integer> operation) {
                      this.operation = operation;
              }
  
              private final BiFunction<Integer, Integer, Integer> operation;
  
              public int apply(int x, int y) {
                      return operation.apply(x, y);
              }
  
  }

这里我做的是:

  • 添加了一个字段 BiFunction<Integer, Integer, Integer> operation

  • 用BiFunction创建了用于Operation的构造函数。

  • 调用枚举定义中的构造函数,并用lambda指定BiFunction<Integer, Integer, Integer>。

这个java.util.function.BiFunction operation字段是对采用两个参数的函数(方法)的引用。

在我们的例子中,两个参数都是int,返回值也是int。不幸的是,Java参数化类型不支持原语,所以我们必须使用Integer。

因为BiFunction是用@functioninterface注释的,所以我们可以使用Lambda表示法定义一个。

因为我们的函数接受两个参数,所以我们可以使用(x,y)来指定它们。

然后我们定义了一个单行方法,它使用 ->x+y 返回一个值。这相当于下面的方法,只是更简洁而已。

  class Adder implements BiFunction<Integer, Integer, Integer> {
          @Override           public Integer apply(Integer x, Integer y) {
                  return x + y;
    }
  }

我们的新Operation实现采用相同的方式:Operation.ADD.apply(2, 3);.

但是,这种实现更好,因为编译器会告诉我们何时添加了新Operation,这要求我们更新函数。如果没有这一点,如果我们在添加新Operation时还不记得更新switch语句,就有可能得到UnsupportedOperationException()。

关键要点

  • Enum枚举是Enum的扩展类。

  • Enum枚举可以有字段、构造函数和实例方法。

  • Enum枚举字段可以存储函数。与lambda配合使用,可以创建干净、安全的特定于枚举的函数实现,并在编译时强制执行它们(而不是使用switch)。

下面是这个示例的GitHub地址。(https://github.com/alex-power/java-enum-example)

本文参考:https://medium.com/javarevisited/advanced-java-enum-features-you-need-to-know-b516a191c7e2

(来源于公众号:程序猿DD)


2020年Java语言发展现状

IM即时通讯王叫兽 发表了文章 • 0 个评论 • 397 次浏览 • 2020-10-13 10:31 • 来自相关话题

作者 | Valeriia Karpenko译者 | 刘雅梦策划 | 陈思今年,Java 到达了一个不可思议的里程碑,达到了 25 岁的高龄。我们通过举办一个特别的在线 Java 日活动来庆祝它的诞生,在该活动中,许多专家演讲者分... ...查看全部
作者 | Valeriia Karpenko


译者 | 刘雅梦
策划 | 陈思

今年,Java 到达了一个不可思议的里程碑,达到了 25 岁的高龄。我们通过举办一个特别的在线 Java 日活动来庆祝它的诞生,在该活动中,许多专家演讲者分享了他们的经验,并就如何从这门语言中获得更多收益提供了技巧和窍门。

这引起了我们的思考,我们决定对数据进行深入研究,以彻底发现 Java 的普遍状态是什么,并帮助你回答一些亟待解决的问题。我们发现的某些内容可能是不足为奇的,但也有些见解是令人非常意想不到的。

随着 Java 15 在本周的发布,我们决定把它放在一起,向你展示 Java 的状态。这篇文章是根据不同来源的数据而创建的,其中包括我们的开发人员倡导者 Trisha Gee 的专家评论。

Java 开发者有多少,他们分布在哪里?

第一个问题是:“大多数的 Java 开发人员都在哪里,我们中有多少人是 Java 开发人员呢?”我们通过综合所能获取到的最准确的信息来回答这个问题,然后进行推断,得出一个我们认为非常合理的猜测。

市场研究和分析团队根据开发人员估算模型得出的最佳估计显示,当今世界上有大约 520 万专业 Java 开发人员,他们将 Java 作为主要语言。但是,如果我们将主要使用其他编程语言但同时也做一些 Java 工作的专业开发人员也包含在内的话,这个数字可能 接近 680 万。

至于这些 Java 开发人员都集中在什么地方,在亚洲居住的 Java 开发人员数量最多,那里大约有 250 万开发人员使用 Java 作为主要语言。北美和欧洲的数字远不及亚洲。你可能会问:“为什么呢?”好吧,起初我们有也有同样的想法,因此我们对这些区域进行了更深入的研究,以确切地了解这些数字的来源。


1.png哪个国家的 Java 开发者最多?

我们进一步研究了拥有最多 Java 开发人员的各个国家,然后调查了为什么这些国家在专业开发中特别喜欢 Java 而不是其他语言。

下图显示了每个国家使用 Java 作为主要语言的开发人员的百分比(用于收集此数据的调查对象最多可以选择 3 种主要语言)。中国韩国 的数值最高,分别约为 51%和 50%。数据来自 2020 年开发者生态系统状况调查

专家分析

Java 在前 6 个国家如此流行的原因可能包括 Java 是免费使用的、政府支持和开源。对于 中国、西班牙巴西 尤其是这样。它是在 中国和印度 进行 Android 移动开发的基础,并且雇佣海外人员用 Java 开发手机应用程序非常普遍,这可能是 印度 使用量达到峰值的原因。德国 的使用率也很高,这可以归因于 Java 在 德国 软件工程师中是最流行的语言,因为多种行业都使用 Java 来构建高度可扩展的应用程序。大多数企业服务都依靠 Java 来驱动应用程序支持日常业务的运行,例如工资单、库存管理、报表等。德国还有一个庞大的金融部门,在本国技术上大量使用 Java,例如交易机器人、零售银行系统以及金融业为了保持竞争所需要的其他应用程序。

我们本以为美国会有很高比例的 Java 用户,但是并没有,这也是很合理的。有大量的技术栈可供选择,而且很多技术公司通常处于这些技术栈的最前沿,因此那里的开发人员可能不需要 Java 的强大功能或稳定性,而是使用能让他们进行快速构建和测试等的语言。

2.pngJava 在开发行业中的位置

根据 2020 年开发者生态系统状况调查,有超过三分之一的专业开发人员将 Java 用作主要语言,而 Java 在专业开发人员当中仍然是仅次于 JavaScript 的第二大主要语言。

专家分析

看到 JavaScript 和 Java 处于领先地位,这并不奇怪,因为它们是成对的:使用 Java 的开发人员经常使用 JavaScript 编写前端和任意快速脚本。由于机器学习的普及,Python 可能排名第三。一般来说,我们希望 Web 成为开发人员生态系统的重要组成部分,因此 JavaScript、HTML 和 CSS 以及 PHP 将始终能拥有稳固的地位。SQL 也会一直存在,因为没有多少东西是不需要某种容量的数据库的。C++ 也是一种坚实的语言,因为它被用于许多嵌入式应用程序中,因此它不会很快在图表中消失。虽然 C# 似乎正在逐渐衰落,但我想如果 Java 比例高,C# 就会低,因为它们在功能上非常相似。至于为什么我认为 Java 在专业发展领域如此之高,原因与之前提到的德国类似。大多数企业的业务服务都依靠 Java 来运行。它不仅仅用于 IT 部门,几乎每个公司,无论是分销、制造还是银行业,都将 IT 服务作为其基础设施的一部分,而这些服务,如工资单或库存管理,通常都是在后端使用 Java 构建的。因此,Java 被这些公司的专业开发人员所大量使用。

3.png用 Java 开发的软件类型

快速浏览一下用 Java 开发的软件类型,应该可以了解它的使用统计信息。根据2020 年开发者生态系统状况调查的结果,Java 使用最流行的领域是 Web 服务,占 52%。

专家分析

看到 Java 在商业智能 / 数据科学 / 机器学习中如此流行,真令人惊讶,因为你可能认为这将是 Python 的领域。其他的就不足为奇了,因为 Web 服务的后端通常是 Java,而且使用 Java 编写业务应用程序也很有意义,因为它们也需要使用后端和数据库。

4.png使用 Java 的热门行业

既然我们知道了为什么这么多专业开发人员使用 Java,那么让我们具体看看 Java 应用于哪些行业。

根据 2020 年开发者生态系统状况调查,Java 程序 主要用于 IT 服务(42%)与金融和金融科技领域(44%),但这并不是说 Java 没有用于其他行业。

专家分析

金融和金融科技领域主要涉及金融交易所、零售银行系统、创建计算引擎以及开发本地定制工具和服务,以使公司在市场上具有竞争力。金融和金融科技几乎都是用 Java 建立的,所以在这里没有什么好惊讶的。IT 服务也是如此,因为许多针对非 IT 公司的薪资系统和库存管理服务都是基于 Java 构建的。其他行业也很有趣。由于 Android 的存在,移动开发的比例可能很高,因此 Java 正以这种方式被使用。大数据和数据分析也非常有趣,因为该行业是由 Python 主导的,但是后端可能会使用 Java 和 JVM 语言。当然构建软件开发工具也可以。JetBrains IDE 目前是用 Java 构建的。尽管其他行业有点神秘,但实际上,了解 Java 在这些行业中的使用方式将非常有趣。

5.pngJava 相关工具

Java 版本

Java 8 仍然是最受欢迎的版本。在使用 Java 作为主要语言的专业开发人员当中,有 75%的人使用 Java 8。基于开发人员在 2020 年开发者生态系统状况调查 中选择的几个版本,下图显示了 Java 版本的分布情况。

专家分析

有几个因素导致了 Java 8 的如此流行。首先,它拥有典型的 Java 开发人员所需要的所有语言,它具有 lambda 和流,并且它是一个很好的易于使用的版本。另外,人们一直不愿意迁移到 Java9。Java9 引入了一些重大的架构更改,人们担心这些更改会破坏他们用 Java 8 构建的应用程序。最重要的是,Oracle 还推出了每两年发布一次的版本,因此并不是所有版本都是长期受支持的,因此 Java 9、Java 10、Java 12 和 Java 13 仅受 6 个月的支持,这可能就是为什么它们都只有这么少用户的原因。Java 13 之所以如此之高,是因为当本调查公布时,它是最新的版本,因此你可以预期,该数字将在几个月后下降。

Java 11 发布于 2018 年,它是长期受支持的最新版本。许多企业仍未迁移到它,因为他们担心超过 Java 9(由于其架构的更改)会破坏一切,而且 Java 11 引入了新的许可和新的订阅,因此它带来了一个新的恐惧:更担心如果使用了错误的版本,以错误的方式使用它,Oracle 会对你进行罚款。许多开发人员没有升级到 Java 11 的最后一个主要因素是,它没有很多令人兴奋的新功能,因此该语言的功能并没有降低升级的风险。Java 17 将是下一个拥有长期支持的版本,并带有许多新功能,但是直接从 Java 8 升级到 Java 17 也会带来一些问题。

我的预测是,我认为下一个长期版本 Java 17 将比上一个 LTS(长期支持版本)Java 11 更受欢迎。不过,作为 Java 17 的准备,这一点我再强调也不为过,建议你先将代码库更新到 Java 11,然后再更新为 Java 17,以避免出现大问题。

6.png流行的应用服务器

在过去的 3 年中,Apache Tomcat 仍然是最受欢迎的应用服务器,而 JBoss EAP 和 WildFly 的使用量却减少了一半。给出的数据来自参加 2018 年 和 2020 年 开发者生态系统调查的所有以 Java 为主要语言的开发人员。

专家分析

Jetty 位居第二,但它确实低得令人惊讶。可能是某些正在使用 Spring Boot 和其他微服务框架的开发人员没有意识到他们到底在使用使用,他们可能在不知不觉中使用了 Tomcat 或 Jetty。

7.png排名前 5 的 Web 框架

在 2018 年,Spring Boot 与 Spring MVC 是一样流行的,到了 2020 年,它变得更加流行。给出的数据来自所有使用 Java 作为主要语言的开发人员。

专家分析

这基本上只是在证实 Spring 拥有市场。几乎可以肯定的是,仍然有人在使用 Struts 1,但它只是用于遗留应用程序。

8.png排名前 5 的分析器

2020 年开发者生态系统状况调查 显示,有 24%的用户使用 VisualVM,而一半的用户则没有使用。给出的数据来自所有使用 Java 作为主要语言的开发人员。

9.png

排名前 5 的 IDE/ 编辑器

2018 年 和 2020 年 的开发者生态系统调查显示,IntelliJ IDEA 的份额从 2018 年的 55%增加到 2020 年的 72%,而其他四个的使用率则有所下降。

专家分析

不过,即使我们对调查结果进行了加权,但我们并不否认这些信息可能会有些偏差,因为这是来自 JetBrains 开发者生态系统状态调查,而 JetBrains 的一个主要产品就是 IntelliJ IDEA。然而,这并不是说这并非完全不合理,就好像我们在其他调查中看到的一样,IntelliJ IDEA 通常是使用最多的 IDE 之一,并且通常拥有约 55-60%的用户份额。VS Code 正在增长,这不是从竞争的角度来看的,而是从缺乏对 IDE 的理解的角度来看的。VS Code 是一个代码编辑器,带有一些你可以在 IDE 中找到的特性,并且可以提供附加功能的扩展。因此,如果人们使用 VS Code 进行开发,则可能意味着开发人员不知道一个功能齐全的 IDE 能给他们什么。在 Web 领域,使用编辑器是可以理解的,因为 Web 开发人员通常使用动态语言,并且经常使用其他工具(例如浏览器插件)来满足他们的需求。但是在 Java 中,特别是在专业的 Java 中,你确实可以从一个与应用程序服务器集成的优秀工具中得到很多东西,你可以真正使用分析、重构等功能。

我们专家的最新消息

我发现有很多对本博客文章数据分析进行删减和编辑的版本,这是我无意间造成的混乱。我想澄清一下我对开发人员和 IDE 评论背后的意图。对我来说,如果开发人员不理解 IntelliJ IDEA 作为一个功能齐全的 IDE 给他们带来了什么,那对我来说就是一个失败,因为这六年来我的工作就是让开发人员了解 IDE(特别是 IntelliJ IDEA)能为你做什么。我强烈地认为,人们不应该因为不了解产品而责备用户或潜在用户。

我个人对 IDE 的观点来自拥有 20 多年 Java 开发经验的 Java 开发人员,他们开发过各种大大小小的 Java 项目。如果没有像 IntelliJ IDEA 这样的 IDE 提供大量的帮助,我无法想象如何创建一个复杂的企业应用程序。我也见过很多开发人员使用 VS Code,并且我完全了解代码编辑器所涵盖的用例。在你的工具箱中总有能容纳多于一种的工具,了解某个工具的优点将有助于我们为正确的工作选择合适的工具。

10.png讨论最多的 Java 工具和其他语言

在 IT 社区中会经常讨论 Java,其中的一个社区就是 Stack Overflow。我们从 “问答”部分 中获取了数据,以找出哪些标签与“ java”最相关。纵轴表示提到 Java 的次数,横轴表示标签出现的总次数。

专家分析

对于那些希望确保自己使用了正确的技术或正寻找适合自己的工具的用户来说,这个图表可能很有用。这些语言很有意思,但这可能是因为人们正在寻找 Java 与其他语言之间的比较。正则表达式是人们苦苦挣扎的一个利基领域,但它能上榜也就不足为奇了。

11.pngJava 社区的热门话题

Java 的讨论

我们分析了 Reddit 上“ java”子版块的帖子,并发现了 Java 用户在 Reddit 上讨论最多的主题。

专家分析

这些正是我期望看到的话题。例如,用 Java 编写代码的人总是会对这种语言是否仍然有需求感兴趣,毕竟,这种语言还在发展。我们刚刚庆祝了 Java 诞生 25 周年,因此人们希望检查它是否过时了,以及它是否仍然有效。特别是,如果他们刚从大学毕业,还不知道他们所学的语言是否能为他们提供工作机会。在容器中部署 Java 是一个非常热门的话题,包括我在内,这是每个人都想知道的东西,但几乎找不到任何相关信息。我对性能优化这个主题并不感到惊讶,尽管我认为这个主题有点多余,因为大多数应用程序实际上并不需要开发人员来进行优化,尽管许多开发人员认为这是一项重要的职业技能。使后端和前端协同工作也非常复杂,我可以想到有很多关于这方面的问题。

12.png

原文链接:

https://blog.jetbrains.com/idea/2020/09/a-picture-of-java-in-2020/



工作中99%能用到的git命令

IM即时通讯梅川酷子 发表了文章 • 0 个评论 • 108 次浏览 • 2020-06-29 11:48 • 来自相关话题

分支操作 git branch 创建分支 git checkout -b 创建并切换到新建的分支上 git checkout 切换分支 git branch 查看分支列表 git branch -v 查看所有分支的最后一次操作 git branch -vv ... ...查看全部

分支操作



git branch 创建分支

git checkout -b 创建并切换到新建的分支上

git checkout 切换分支

git branch 查看分支列表

git branch -v 查看所有分支的最后一次操作

git branch -vv 查看当前分支

git brabch -b 分支名 origin/分支名 创建远程分支到本地

git branch --merged 查看别的分支和当前分支合并过的分支

git branch --no-merged 查看未与当前分支合并的分支

git branch -d 分支名 删除本地分支

git branch -D 分支名 强行删除分支

git branch origin :分支名 删除远处仓库分支

git merge 分支名 合并分支到当前分支上





暂存操作



git stash 暂存当前修改

git stash apply 恢复最近的一次暂存

git stash pop 恢复暂存并删除暂存记录

git stash list 查看暂存列表

git stash drop 暂存名(例:stash@{0}) 移除某次暂存

git stash clear 清除暂存



回退操作





git reset --hard HEAD^ 回退到上一个版本

git reset --hard ahdhs1(commit_id) 回退到某个版本

git checkout -- file撤销修改的文件(如果文件加入到了暂存区,则回退到暂存区的,如果文件加入到了版本库,则还原至加入版本库之后的状态)

git reset HEAD file 撤回暂存区的文件修改到工作区



标签操作





git tag 标签名 添加标签(默认对当前版本)

git tag 标签名 commit_id 对某一提交记录打标签

git tag -a 标签名 -m '描述' 创建新标签并增加备注

git tag 列出所有标签列表

git show 标签名 查看标签信息

git tag -d 标签名 删除本地标签

git push origin 标签名 推送标签到远程仓库

git push origin --tags 推送所有标签到远程仓库

git push origin :refs/tags/标签名 从远程仓库中删除标签



常规操作





git push origin test 推送本地分支到远程仓库

git rm -r --cached 文件/文件夹名字 取消文件被版本控制

git reflog 获取执行过的命令

git log --graph 查看分支合并图

git merge --no-ff -m '合并描述' 分支名 不使用Fast forward方式合并,采用这种方式合并可以看到合并记录

git check-ignore -v 文件名 查看忽略规则

git add -f 文件名 强制将文件提交





git创建项目仓库



1、git init 初始化 2、git remote add origin url 关联远程仓库 3、git pull 4、git fetch 获取远程仓库中所有的分支到本地



忽略已加入到版本库中的文件

1、git update-index --assume-unchanged file 忽略单个文件 2、git rm -r --cached 文件/文件夹名字 (. 忽略全部文件)



取消忽略文件

git update-index --no-assume-unchanged file



拉取、上传免密码

git config --global credential.helper store





作者:playboy5566

链接:https://segmentfault.com/a/1190000023001428

来源:SegmentFault 思否

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。