精华内容
下载资源
问答
  • Java中码点和代码单元
    万次阅读 多人点赞
    2018-10-26 23:54:39

    Java中码点和代码单元

    前言

    码点和代码单元这两个概念还是在《Java核心技术 卷一》发现的,这也是我看过这本书里面前五章中比较有用的一个知识点(PS:毕竟Java开发都一年了,基础应用都差不多了),以前都没听过。

    概念

    在介绍这个概念之前,建议大家先去看看一些编码方面的知识。《编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)》,这篇文章讲的挺好。每个国都有把自己的语言编码,于是出现了各种各样的编码(美国的ASCII,中国的GBK,俄罗斯的KOI-8等),如果你不安装相应的编码,就无法解释相应编码想表达的内容。最后 ISO 一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。
    而在设计Java时,当时的Unicode才发布1.0版本,字符连65536代码值一半都不到,为了方便后面增加,Java使用了16位的Unicode字符集。但是没想到,随着计算机的普及,各国计算机的发展,16位也放不下人类的集体文化财富。
    码点是指一个编码表中的某个字符对应的代码值。Unicode的码点分为17个代码级别,第一个级别是基本的多语言级别,码点从U+0000——U+FFFF,其余的16个级别从U+10000——U+10FFFF,其中包括一些辅助字符。
    基本的多语言级别,每个字符用16位表示代码单元,而辅助字符采用连续的一对连续代码单元进行编码。

    代码实例

    下面hi𝕆中的𝕆实际上是是一个辅助字符,它实际上占用了两个char来保存,这个字符串中总共为4个char,3个代码点。

        public static void main(String[] args) {
            String hello = "hi𝕆";
            System.out.println(hello.length());//4
            System.out.println(hello.codePointCount(0, hello.length()));//3
        }
    

    下列代码中显示了每个char的16进制和每个代码单元的16进制。

        public static void main(String[] args) {
            String hello = "hi𝕆";
            int length = hello.length();
            for(int i=0;i<length;i++) {
                char charAt = hello.charAt(i);
                System.out.println(Integer.toHexString(charAt));
            }
            int codePointCount = hello.codePointCount(0, length);
            for(int i=0;i<codePointCount;i++) {
                int index = hello.offsetByCodePoints(0,i);
                int charAt = hello.codePointAt(index);
                System.out.println(Integer.toHexString(charAt));
            }
        }
    

    分为4个代码单元

    68
    69
    d835
    dd46
    

    3个码点

    68
    69
    1d546
    

    而码点转化为字符串则需要使用一些特殊的API,比如:
    判读是不是一个码点,上文的d835或者dd46肯定不是

    Character.isValidCodePoint(codePoint)
    

    码点转化为字符串:

    char[] chars = Character.toChars(0x1d546);
    String str = new String(chars);
    System.out.println(str);//𝕆
    
    更多相关内容
  • 《软件测试的艺术》书中第三章讲到人工测试的代码检查、代码走查、桌面检查同行评审。 #代码检查 Def:以组为单位阅读代码,一系列规程错误技术的集合。 Group:代码检查小组(一般为4人) 职务 ...

     

    • 代码检查、走查与评审

    《软件测试的艺术》书中第三章讲到人工测试的代码检查、代码走查、桌面检查和同行评审。

    #代码检查

    Def:以组为单位阅读代码,一系列规程和错误技术的集合。

    Group:代码检查小组(一般为4人)

    职务

    职责

    备注

    协调人

    1. 为代码检查分发资料、安排进程;
    2. 在代码检查中起主导作用;
    3. 记录发现的所有错误;
    4. 确保所有错误随后得到改正。

    一名程序员、但不是被测程序的作者,不需要特别了解程序细节

    程序编码人员

    朗读程序并逐行讲解

    即被测程序作者,也是被检查者

    其他成员

    提出质疑,并讨论

    程序的设计人员,前提不同于编码人员

    测试专家

    提出质疑,并讨论

    具备软件测试经验,并熟悉大部分的常见编码错误

    Process:检查议程与注意事项

    Step1:会议之前,协调人分发程序清单和设计规范给小组成员,所有成员在检查之前进行熟悉。

    Step2:会议中,程序编码人员逐条语句讲述逻辑结构,过程中其他成员结合常见的编码错误列表分析程序,提出质疑,讨论,确认是否存在错误,协调人记录讨论过程以及错误清单。

    Step3:会议结束后,协调人将错误清单提交给程序编码人员进行确认,若发现错误过多,或者某个错误涉及对程序做根本性的改动,协调人需要在错误修正后,重新安排会议再次检查。

    Time:理想时间在90~120分钟,一般为每小时150行左右速度进行。因此建议每个代码检查会议处理一个或几个模块或子程序。

    Error table:用于代码检查的错误列表,见附录A。

    #代码走查

    Def:以组为单位阅读代码,一系列规程和错误技术的集合。

    Group:代码检查小组(一般为3-5人)

    职务

    职责

    备注

    协调人

    1. 为代码检查分发资料、安排进程;
    2. 在代码检查中起主导作用;
    3. 记录发现的所有错误;
    4. 确保所有错误随后得到改正。

    一名程序员、但不是被测程序的作者,不需要特别了解程序细节

    秘书

    记录所有查出的错误

     

    程序编码人员

    朗读程序并逐行讲解

    即被测程序作者,也是被检查者

    测试人员

    提出质疑,并讨论

    具备软件测试经验,并熟悉大部分的常见编码错误

    其他人员

    提出质疑,并讨论

    可以包括:

    一个经验丰富的程序员;

    一位程序设计语言专家;

    一位程序员新手;(可以给出新颖、不带偏见的观点)

    最终维护程序的人员;

    一位来自其他不同项目的人员;

    一位来自该软件编程小组的程序员。

    Process:检查议程与注意事项

    Step1:会议之前,协调人分发程序清单和设计规范给小组成员,所有成员在检查之前进行熟悉,同时测试人员提前准备一些书面测试用例(程序或模块具有代表性的输入集及预期的输出集)来参加会议

    Step2:会议中,将每一个测试用例通过人脑过一遍,即输入集沿程序的逻辑结构走一遍。程序的状态(如变量的值)记录在纸张或白板上以供监视。其中测试用例尽量结构简单、数量较少。

    Step3:会议结束后,秘书将错误清单提交给程序编码人员进行确认,若发现错误过多,或者某个错误涉及对程序做根本性的改动,协调人需要在错误修正后,重新安排会议再次检查。

    Time:理想时间在一至两个小时。

     

    #桌面检查

    此方法可视为由单人进行的代码检查或代码走查:有一个人阅读程序,对照错误列表检查程序,对程序推演测试数据。缺点:缺乏约束性、违反自检原则、效率低

     

    #同行评审

    此方法与程序测试无关,目标不是为了发现bug,而是在自我评价和相互学习中提高代码质量。

    是一种依据程序整体质量、可维护性、可扩展性、易用性和清晰性对匿名程序进行评价的技术。

    Step1:选出一名程序员作为评审过程的管理员,然后由管理员选出每名6~20名参与者(具备相似背景,起码编程语言一致),组成评审团

    Step2:每个参与者选出两个自己编写的程序以供评审,其中至少一个代表自身能力的好作品,集合成评审资料

    Step3:随机分发给参与者,每名参与者对分到的4个程序进行评审,分为两个“最好的”,两个“较差”的程序,全过程保密。平均每名评审员每个程序时间在30分钟左右,评审完后填写一张评价表。

    Step4:评审员将自己分配到的4个程序全部评审完,进行相对质量分级,分值为1~10分

    参考如下标准评分(1:明确“是”、10:明确“否”):

    1. 程序是否易于理解?
    2. 高层次的设计是否可见且合理?
    3. 底层次的设计是否可见且合理?
    4. 修改此程序对评审者而言是否容易?
    5. 评审者是否会以编写出改程序而骄傲?

    并给出总的评价和建议的改进意见。

    Step5:会议结束,参与者会收到自己的两个程序匿名评价表,以及一个带统计的总结,说明在所有程序中程序的整体和具体得分情况,以及他对其他程序的评价与其他评审人对同一程序打分的比较分析情况。

     

    • 静态分析、代码审查与代码走查

    军工软件静态测试方法一般为静态分析、代码审查和代码走查,顺序通常为静态分析、代码审查、代码走查。其中静态分析和代码审查会使用到单元测试工具。详见参见《GJB-Z 141-2004 军用软件测试指南》A.1静态测试方法

     

    #静态分析

    静态分析一般包括控制流分析、 数据流分析、 接口分析、 表达式分析。

    •   控制流分析

    控制流分析是使用控制流程图系统地检査被测程序的控制结构的工作。控制流按照结构化程序规则和程序结构的基本要求进行程序结构检査。这些要求是被测程序不应包含:

    a)  转向并不存在的语句标号;

    b)  没有使用的语句标号;

    c)  没有使用的子程序定义;

    d)  调用并不存在的子程序;

    e)  从程序入口进入后无法达到的语句;

    f)  不能达到停止语句的语句。

    控制流程图是一种简化的程序流程图, 控制流程图由 “节点” 和 “弧" 两种图形符号构成。

    •  数据流分析

    数据流分析是用控制流程图来分析数据发生的异常情况, 这些异常包括被初始化、 被赋值或被引用过程中行为序列的异常。数据流分析也作为数据流测试的预处理过程 。

    数据流分析首先建立控制流程图, 然后在控制流程图中标注某个数据对象的操作序列, 通历控制流程图, 形成这个数据对象的数据流模型, 并给出这个数据对象的初始状态, 利用数据流异常状态图分析数据对象可能的异常。

    数据流分析可以査出引用未定义变量、对以前未使用的变量再次赋值等程序错误或异常情况。

    • 接口分析

    接口分析主要用在程序静态分析和设计分析,接口一致性的设计分析涉及模块之间接口的一致性以及模块与外部数据库之间的一致性,程序的接口分析涉及子程序以及函数之间的接口一致性, 包括检査形参与实参的类型、数量、维数、顺序以及使用的一致性。

    • 表达式分析

    表达式错误主要有以下几种:

    括号使用不正确, 数组引用错误, 作为除数的变量可能为零, 作为开平方的变量可能为负, 作为正切值的变量可能为π/2 , 浮点数变量比较时产生的错误。

    • 此外, 静态分析还可以完成下述工作:

    a)  提供问接涉及程序缺陷的信息:

    1 )  每一类型语句出现的次数;

    2)  所有变量和常量的交叉引用表;

    3)  标识符的使用方式;

    4)  过程的调用层次;

    5)  违背编码规则;

    6)  程序结构图和程序流程图;

    7)  子程序规模、调用/被调用关系、扇入/扇出数。

    b)  进行语法/语义分析, 提出语义或结构要点, 供进一步分析。

    c)  进行符号求值。

    d)  为动态测试选择测试用例进行预处理。

    静态分析常需要使用软件工具进行,例如C++Test、Jtest、TestBed等单元测试工具,静态分析是在程序编译通过之后, 其它静态测试之前进行的,一般静态分析测试报告中会描述违反编码规则数、扇入扇出数大于X的个数等。

     

    #代码审查

    代码审查和《软件测试的艺术》中代码检查基本一致。

    代码审査的测试内容: 检査代码和设计的一致性; 检査代码执行标准的情况; 检査代码逻辑表达的正确性; 检査代码结构的合理性; 检査代码的可读性。

    代码审査的组织:由四人以上组成,分别为组长、资深程序员、程序编写者与专职测试人员。组长不能是被测试程序的编写者, 组长负责分配资料、安排计划、主持开会、记录并保存被发现的错误。

    代码审査的过程:

    a)  准备阶段:组长分发有关材料, 被测程序的设计和编码人员向审査组详细说明有关材料, 并回答审査组成员所提出的有关问题。

    b)  程序阅读: 审査组人员仔细阅读代码和相关材料, 对照代码审査单, 记录问题及明显缺陷。

    c)  会议审査:组长主持会议,程序员逐句阐明程序的逻辑,其他人员提出问题,利用代码审査单,进行分析讨论, 对讨论的各个问题形成结论性意见。

    d)  形成报告: 会后将发现的错误形成代码审査问题表, 并交给程序开发人员。对发现错误较多或发现重大错误, 在改正错误之后再次进行会议审査。

    代码审査问题表应写明所査出的错误类型、错误类别、错误严重程度、错误位置、错误原因。错误类型有文档错误、编程语言错误、逻辑错误、接口错误、数据使用错误、编程风格不当、软件多余物,错误类别有遗漏、错误、多余。这种静态测试方法是一种多人一起进行的测试活动, 要求每个人尽量多提出问題, 同时讲述程序者也会突然发现一些问题, 这时要放慢进度, 把问题分析出来 。

    实际项目中代码审查也会结合单元测试工具和桌面检查等方法。

    代码审查单例子:见附录B,C/C++语言可以参考GJB 8114-2013《C/C++语言编程安全子集》中的强制准则

    #代码走查

    代码走查和《软件测试的艺术》中代码走查基本一致。

    代码走査的组织: 由四人以上组成,分别为组长、秘书、 资深程序员与专职测试人员。走査人员不能是被测试程序的编写者, 组长负责分配资料、安排计划、 主持开会, 秘书记录被发现的错误。

    代码走査的过程:

    a)  准备阶段:组长分发有关材料, 走査组详细阅读材料和认真研究程序 。

    b)  生成实例: 走査小组人员提出一些有代表性的测试实例 。

    c)  会议走査: 组长主持会议, 其他人员对测试实例用头脑来执行程序, 也就是测试实例沿程序逻辑走一通, 并由測试人员讲述程序执行过程, 在纸上或黑板上监视程序状态, 秘书记录下发现的问题。

    d)  形成报告:会后将发现的错误形成报告,并交给程序开发人员。对发现错误较多或发现重大错误, 在改正错误之后再次进行会议走査 。

    这种静态测试方法是一种多人一起进行的测试活动, 要求每个人尽量多提供测试实例, 这些测试实例是作为怀疑程序逻辑与计算错误的启发点, 在随测试实例游历程序逻辑时,在怀疑程序的过程中发现错误。这种方法不如代码审査检査的范围广, 错误覆盖全。

    一般项目中,如果程序规模较小,一万行左右,可以考虑全部程序进行代码走查,但如果代码规模较大时,全部代码完全不切实际,应选择错误集中较多、容易出错,在程序中属于关键的函数,或者编程人员强烈建议的等,最后形成代码走查测试实例、代码走查会议记录单、走查报告等工作产品。

     

     

    • 附录A

    序号

    错误类型

    错误清单(持续更新)

    1

    数据引用错误

    1、是否有引用的变量未赋值或无初始化?

    2、所有数组引用,是否每一个下标的值都在相应维规定的界限之内?

    3、所有数组引用,是否每一个下标的值都是整数?

    4、所有的通过指针或者引用变量的引用,当前引用的内存单元是否分配?(虚调用)

    5、如果一个内存区域具有不同属性的别名,当通过别名进行引用时,内存区域中的数据值是否具有正确的属性?

    6、变量值的类型或属性是否与编译器所预期的一致?

    7、在使用的计算机上,当内存分配的单元小于内存可寻址的单元大小时,是否存在直接或间接的寻址错误?

    8、当使用指针或引用变量时,被引用的内存的属性是否与编译器所预期的一致?

    9、假如一个数据结构在多个过程或子过程中被引用,那么每个过程或子过程对该结构的定义是否都相同?

    10、如果字符串有索引,当对数组进行索引操作或下标引用,字符串的边界取值是否有“仅差一个”的错误?

    11、对于面向对象的语言,是否所有的继承需求都在实现类中得到了满足?

    2

    数据声明错误

    1、是否所有的变量都进行了声明?

    2、如果变量所有的属性在声明中没有明确说明,那么默认的属性能否被正确理解?

    3、如果变量在声明语句被初始化,那么它的初始化是否正确?

    4、是否每个变量都被赋予了正确的长度和数据类型?

    5、变量的初始化是否与其存储空间的数据类型一致?

    6、是否存在有着相似名称的变量?

    3

    运算错误

    1、是否存在不一致的数据类型(如非运算符)的变量间的运算?

    2、是否有混合模式的运算?

    3、是否有相同数据结构、不同字长变量间的运算?

    4、赋值语句的目标变量的数据类型是否小于右边表达式的数据类型或结果?

    5、在表达式的运算中是否存在表达式向上或向下溢出的情况?

    6、除法运算中除数是否为0?

    7、如果计算机表达变量的基本方式是基于二进制的,那么运算结果是否不精确?例如10*0.1,在二进制计算机中,很少会等于1.0.

    8、在特定场合,变量的值是否超过了有意义的范围?

    9、对于包含一个以上的操作符的表达式,赋值顺序和操作符的优先顺序是否正确?

    10、整数的运算是否有使用不当的情况,尤其是除法?

    4

    比较错误

    1、是否有不同数据类型的变量之间的比较。例如将字符串与地址、日期或数字相比较?

    2、是否有混合模式的比较运算,或不同长度的变量间的比较运算?

    3、比较运算符是否正确?程序员经常混淆至多、至少、大于、不小于、小于和等于等比较关系

    4、每个布尔表达式所叙述的内容是否都正确?例如涉及与、或、非表达式时

    5、布尔运算符的操作数是否为布尔类型?比较运算符和布尔运算符是否错误地混淆在一起?

    6、在二进制的计算机中,是否有用二进制表示的小数或浮点数的比较运算?

    7、对于那些包含一个以上的布尔运算符的表达式,赋值顺序以及运算符的优先顺序是否正确?

    8、编译器计算布尔表达式的方式是否对程序产生影响?

    5

    控制流程错误

    1、如果程序中包含很多分支,比如有计算GO TO语句,索引变量的值是否会大于可能的分支数量?

    1. 是否所有的循环最终都终止了?

    3、程序、模块或子程序是否最终都停止了?

    4、由于实际情况没有满足循环的入口条件,循环体是否有可能从未执行过?

    5、如果循环同时由迭代变量和一个布尔条件所控制(如一个搜索循环),循环是否越界?

    6、是否存在“仅差一个”的错误,如迭代数量恰恰是多一次或者少一次?

    7、如果编程语言中有语句块或代码块的概念(例如do......while或{...}),是否每一组语句都有一个明确的while语句,并且do语句也与其相应的语句对应?或者是否每一个左括号对应一个有括号?

    8、是否存在不能穷尽的判断?

    6

    接口错误

    1、被调用模块接收到的形参数量是否等于调用模块发送的实参数量?顺序是否正确?

    2、实参的属性(如数据类型和大小)是否与相应形参的属性相匹配?

    3、实参的量纲是否与对应形参的量纲相匹配?

    4、此模块传递给彼模块的实参数量,是否等于彼模块期望的形参数量?

    5、此模块传递给彼模块的实参的属性,是否与彼模块相应形参的属性相匹配?

    6、此模块传递给比模块的实参的量纲,是否与彼模块相应形参的量纲相匹配?

    7、如果调用了内置函数,实参的数量、属性、顺序是否正确?

    8、如果某个模块或类有多个入口点,是否引用了与当前入口点无关的形参?

    9、是否有子程序改变了某个原本仅为输入值得形参?

    10、如果存在全局变量,在所有引用它们的模块中,它们的定义和属性是否相同?

    11、常数是否以实参形式传递过?

    7

    输入/输出错误

    1、如果对文件明确声明过,其属性是否正确?

    2、打开文件的语句中各项属性的设置是否正确?

    3、格式规范是否与I\O语句中的信息相吻合?

    4、是否有足够的可用内存空间,来保留程序将读取的文件?

    5、是否所有的文件在使用之前都打开了?

    1. 是否所有的文件在使用之后都关闭了?

    7、是否判断文件结束的条件,并正确处理?

    8、对I/O出错情况处理是否正确?

    9、任何打印或显示的文本信息中是否存在拼写或语法错误?

    10、程序是否正确处理了类似于“File Not Found”这样的错误?

    8

    其他检查

    1、如果编译器建立了一个标识符交叉引用列表,那么对该列表进行检查,查看是否有变量从未引用过,或仅被引用过一次。

    2、如果编译器建立了一个属性列表,那么对每个变量的属性进行检查,确保没有赋予过不希望的默认属性值。

    3、如果程序编译通过了,但计算机提供了一个或多个“警告”或“提示”信息,应对此逐一进行认真检查。“警告”信息指出编译器对程序某些操作的正确性有所怀疑;所有这些疑问都应进行检查。“提示”信息可能会罗列出没有声明的变量,或者是不利于代码优化的用法。

    4、程序或模块是否具有足够的鲁棒性?即是否对输入的合法性进行了检查?

    5、程序是否遗漏了某个功能?

    • 附录B

    代码审查单(可进行任意更改,仅为例子参考)

    审查表名称

    语言编程代码审查单

    审查表标识

     

    审查表描述

    审查软件代码是否遵循了规定的代码规则,并审查软件代码与软件设计的符合性。

    审查内容

    序号

    审查项

    期望结果与评估标准

    审查结果

    通过与否

    1

    代码执行标准的符合性审查

    寄存器使用:

    1)  如果需要一个专用寄存器, 指定了吗?

    2)  宏扩展或子程序调用使用了已使用着的寄存器而未保存数据吗?

    3)  默认使用的寄存器的值正确吗?

     

    格式:

    1)  嵌套的IF 是否已正确地缩进?

    2)  注释准确并有意义吗?

    3)  是否使用了有意义的标号?

    4)  代码是否基本上与开始时的模块模式一致?

    5)  是否連循全套的编程标准?

     

    入口和出口连接:

    1) 初始入口的最终出口正确吗?

    2) 对另一模块的每一次调用:

    全部所需的参数是否已传送给每一个被调用的模块?

    被传送的参数值是否正确的设置?

    栈状态和指针状态是否正确?

     

    程序语言的使用:

    1)  模块中是否使用语言完整定义的有限子集?

    2)  未使用内存的内容是否影响系统安全? 处理是否得当?

     

    存储器使用:

    1)  每一个域在第一次使用前正确地初始化了吗?

    2)  规定的域正确吗?

    3)  每个域是否由正确的变量类型声明?

    4)  存储器重复使用吗?可能产生冲突吗?

     

    f)  测试和转移:

    l )  是否进行了浮点相等比较?

    2)  测试条件正确吗?

    3)  用于测试的变量正确吗?

    4)  每个转换目标正确并至少执行一次?

    5)  三种情况(大于 0, 小于 0, 等于 0)是否已全部测试?

     

    g)  性能:

    1 )  逻辑是否被最佳地编码?

    2)  提供的是一般的错误处理还是异常的例程?

     

    h)  可维护性:

    1)  所提供的列表控制是否有利于提高可读性?

    2)  标号和子程序名符合代码的意义吗?

     

    i)  逻辑:

    1)  每个循环是否执行正确的次数?

    2)  输入参数的所有异常值是否已直接测试?

     

    j) 软件多余物:

    1)  是否有不可能执行到的代码?

    2)  是否有即使不执行也不影响程序功能的指令?

    3)  是否有未引用的变量、标号和常量?

    4)  是否有多余的程序单元?

     

     

    2

    代码与设计的一致性和合理性审查

    1)  全部设计是否均已实现?

    2)  编码是否做了设计所规定的内容?

     

     

    问题单标识

     

    审查人员

     

    监测人员

     

    审查时间

     

     

    展开全文
  • Git 代码管理(代码提交和代码回退) Git的主要功能是代码管理,版本管理,分支管理。 在远程代码管理平台上,项目的代码被管理在一个远程代码仓库中,在本地,代码保存在一个本地代码仓库中。通过Git,本地对代码...

    Git 代码管理(代码提交和代码回退)

    Git的主要功能是代码管理,版本管理,分支管理。

    在远程代码管理平台上,项目的代码被管理在一个远程代码仓库中,在本地,代码保存在一个本地代码仓库中。通过Git,本地对代码进行修改后,可以提交到远程代码仓库,当远程的代码被他人修改后,也可以拉取代码到本地。

    一、工作区、暂存区和仓库区

    将代码从远程代码仓库中拉到本地仓库后,本地仓库的代码与远程仓库的最新代码保持一致。这时候可以在本地仓库中对代码进行修改。修改代码之后,需要按步骤将代码提交并推到远程仓库,要理解这个过程,就要知道工作区、暂存区和仓库区。

    当不得不回退/回滚代码时,对工作区、暂存区、仓库区的理解更是重要。

    工作区、暂存区、仓库区是虚拟的概念,并不是物理上有三个独立的空间,其实相当于是代码提交的三个阶段。

    工作区:开发人员增加、修改、删除代码/文件时,都是在工作区中进行的。工作区有两个状态很重要,修改前(拉取代码后没有做任何修改)和修改后(确定修改内容并保存)。

    暂存区:是开发人员完成部分功能后将代码和文件暂存的区域。工作区的代码完成后,必须先经过暂存区才能提交。这个区域的代码会生成版本,不过提交后版本就没有了。

    仓库区:是开发人员完成阶段性的功能后将代码提交的区域,这个区域的代码每次提交都有版本号(版本号很重要),可以用于查看版本和回退版本。暂存区的代码,必须要经过仓库区才能推到远程仓库。

    二、工作区、暂存区、仓库区和远程仓库的关系

    一开始从远程仓库中拉取最新代码,代码保存在本地仓库中,开发人员还没有对代码做任何的修改,所以代码处于工作区未修改状态。

    对代码修改、增加、删除后,保存代码,此时代码仍然在工作区,现在处于修改后的状态。

    使用 git add . 将修改后的代码添加到暂存区。

    使用 git commit -m "提交信息" 将暂存区的代码提交到仓库区,每次提交都有对应的版本号。

    使用 git push 将代码从本地仓库区推到远程代码仓库上。

    每一个步骤都可以支持回退/回滚。

    修改后的代码要回退到修改前,使用 git checkout file。新增加的文件要回到修改前,直接rm file。

    暂存区、仓库区、远程仓库的代码回退/回滚都可以使用 git reset 来实现,根据版本号指定回退的版本,HEAD 或 commit-id。

    git reset 有三个参数:

    --hard 会将代码回退到修改前的状态,就相当于上次拉完代码的状态。所有增加、修改、删除的内容都不在了。(这个操作要慎重)

    --mixed 会将代码回退到修改后的状态,可以再次对代码增加、修改、删除,保存,添加到暂存区,提交到仓库区。

    --soft 会将代码回退到暂存区,可以继续往前回退,也可以重新提交到仓库区。

    如果代码已经推到了远程仓库,reset 回滚后重新推代码时,一定要加 --force 或 -f 参数,才能将本地仓库的版本覆盖远程仓库的代码,避免代码冲突。(这个操作也要慎重,要与团队做好沟通,否则会把其他人的代码也覆盖了)

    三、Git代码管理(提交和回退)

    本文中,有一个叫 GitProject 的项目代码托管在 Github 上,在 Windows 本地已经配置好了本地代码仓库,这个项目是一个新建的项目,里面没有任何代码(只有一个 README 文件)。

    1. 右键打开 Git Bash , 进入本地代码的目录中,为了方便练习 git 的使用,我先创建了一个 git.py 文件,写了几行代码,然后将代码推到了远程仓库,下面的步骤基于这次提交的代码来做修改。

    编写代码可以使用任何您喜欢的方式,各种编辑器、IDE都可以,比如用vi写好后wq保存退出。不管用什么方式,代码都是处于工作区,都可以保存代码然后按步骤提交代码。

    2. 确认分支和拉取代码

    不管任何时候,在开始修改代码之前,都记得先做两步操作。

    第一,先看当前处于哪个分支上,当前 GitProject 项目还只有一个分支 master ,所以用的是 master 。

    在实际的工作中,代码的分支会非常多,大的项目活跃的分支可能10几个,还有很多不常用的分支。而且,实际工作中是不会直接在mster分支上修改和调试代码的,都是先在其他分支测试通过之后,才会合入到master分支。

    所以第一步先看当前分支是不是自己要修改代码的分支,如果不是先切换,否则改了很多代码发现改错分支了,很麻烦。

    # 查看当前分支
    git branch
    # 查看所有分支
    git branch -a
    # 切换分支
    git checkout master
    # 如果分支是在远程仓库创建的,可以这样获取
    git fetch origin
    
    

    第二步,git pull 拉取当前最新的代码,如果不是最新的代码,修改代码后向远程仓库提交时,会造成代码冲突。

    # 拉取最新代码
    git pull

    做好以上两步,基本可以避免大部分的代码回退问题和代码冲突问题。

    确认好分支是最新代码后,在git.py中进行开发(增加一行代码),然后保存。

    3. 修改代码和取消修改

    在修改代码前,使用 git status查看当前的状态,代码提示的是 nothing to commit,修改并保存后,git.py 的名字变成了红色,当前 git.py 处于工作区已修改的状态。

    如果现在保存的代码不想要了,可以用 git checkout file 使代码回到修改之前,所有修改的内容都不会保存,如果是一个新增加的文件,可以使用 rm file 直接删除文件,回到修改前。

    # 查看当前代码状态
    git status
    # 修改后回退到修改前
    git checkout git.py

    4. 查看修改内容

    修改并保存代码后,可以使用 git diff 查看修改的内容。

    # 查看修改的代码内容
    git diff

    5. add添加代码和回退

    代码处于工作区修改后的状态,可以使用 git add file 或 git add . 将代码添加到暂存区。git add file 是添加指定的文件,

    git add . 是将整个工作区中保存了的内容都添加到暂存区。

    # 添加git.py到暂存区
    git add git.py
    # 添加所有已修改代码到暂存区
    git add .
    

    代码添加到暂存区后,使用 git status 查看到当前的状态,git.py 的名字变成了绿色,说明当前代码处于暂存区。

    如果不想继续提交代码,将代码回退到前面的状态,可以使用 git reset HEAD git.py 回退到工作区修改后的状态。

    其中,git reset 是所有操作过程中都可以使用的回退命令,后面接要回退的文件名,不指定文件则回退所有的修改。

    HEAD 表示当前的版本,当前版本可以省略,HEAD~ 或 HEAD^ 表示当前版本的上一个版本,后面可以接多个~或^,也可以接数字。如HEAD~~~表示当前版本往前数的第3个版本,HEAD~5表示当前版本往前数的第5个版本。

    git reset 后还有三个参数, --soft回退到暂存区,--mixed回退到工作区修改后的状态,--mixed可以省略不写,--hard回退到修改之前的状态。

    所以 git reset 、 git reset git.py 、 git reset HEAD git.py 和 git reset --mixed HEAD git.py 一样,都是将 git.py 回退到当前版本的修改后状态。

    # 回退代码到工作区修改后
    git reset --mixed HEAD git.py

    6. commit提交代码和回退

    代码处于暂存区时,可以使用 git commit -m "提交信息" 来将代码提交到仓库区。

    如果代码处于工作区,也可以使用 git commit -am "提交信息" 将代码从工作区提交到仓库区,相当于 git add 和 git commit 命令合并成一条命令,两步操作合并了。

    # 提交代码
    git commit -m "add print**"

    提交代码后,代码处于待 git push 的状态,现在 git status 已经不显示被修改的 git.py 了。

    一旦 git commit ,代码就立即生成一个新的版本号,要回退就是上一个版本了。

    如果代码已经 git cmmit 提交,想要回退,可以使用 git reset --soft HEAD~ 来将代码回退到暂存区。可以使用 git reset HEAD~ 或 git reset --mixed HEAD~ 回退到工作区修改之后, 可以使用 git reset --hard HEAD~ 回到工作区修改代码前。 

    # 回退代码到暂存区
    git reset --soft HEAD~

    7. push推代码到远程仓库

    在本地仓库区的代码,使用 git push origin 分支名 将代码推到远程仓库中,也可以直接 git push ,但建议还是跟上分支名。

    # 将代码推到远程仓库
    git push origin master

    8. 查看远程仓库

    到远程仓库查看,现在的 GitProject 项目有三次提交(前两次分别是新建项目,创建git.py文件),第三次提交的信息为 add print**, 正是我们刚才提交过来的代码,说明代码已经被推到了远程仓库。

    9. 回退提交到远程仓库的代码

    如果代码已经推到了远程仓库,但是发现代码有问题,需要将代码回滚,还是可以使用 git reset 来回滚代码。

    回退到的位置依然是根据版本和 --soft --mixed --hard 三个参数来定位,回退的命令与前面的相同。

    10. 重新提交回退的代码

    现在将代码回退到了暂存区,现在的状态是待提交状态。

    也可以回退到工作区进行修改,重新提交代码,然后推代码到远程仓库。

    现在远程仓库的代码是第三次提交后的代码,本地代码回退了第三次提交,相当于是第二次提交之后的状态。在第二次提交的基础上重新提交,次数还是第三次。

    远程已经有了三次提交,又要推另一个第三次提交,这会造成冲突问题,无法推成功。所以,在推代码的时候要加上 --force 或 -f ,表示将本地回退后重新提交的代码覆盖远程仓库的提交。

    # 提交并覆盖远程仓库
    git push origin master --force

    11. 重新提交后,远程仓库的提交次数还是3次,但是提交信息已经改变了。说明上次提交到远程仓库的代码已经被覆盖了。

    上面所有的回退操作中,版本号都可以通过 HEAD 来确定版本的。

    每次 commit 提交都会生成一个唯一的 commit-id,要找到指定的版本,也可以使用 git log 或 git reflog 来查看提交过的 commit-id ,然后通过 commit-id 来指定版本。

    git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录,git log 则不能察看已经删除了的commit记录。

    回退命令:

    # 回退到指定版本
    git reset --hard commit-id

    在工作中,更安全更常用的回退代码方式是 Revert ,Revert 操作会生成一个新的 commit-id ,然后将 Revert 操作提交,就回退了代码。如果回退掉的代码又要 Merged 进来,可以再次 Revert,又生成一个新的 commit-id,然后提交。

    使用 Revert 进行的每一次操作,都会有对应的 commit-id,并且 Revert 不会对其他人的代码造成影响,所以更适用。

     

     

    展开全文
  • 如图所示: 1、选中1点击Default,则设置JSP只显示代码; 2、选中2点击Default,则设置JSP显示视图和代码

    这里写图片描述

    如图所示:
    1、选中1点击Default,则设置JSP只显示代码;
    2、选中2点击Default,则设置JSP显示视图和代码。

    展开全文
  • eclipse代码格式化模板注释格式化模板

    千次下载 热门讨论 2014-10-24 11:59:17
    eclipse代码格式化模板注释格式化模板,需要的请自行下载。
  • Markdown语法009:行内代码和代码

    万次阅读 2018-08-29 14:34:16
    行内代码: 如果要标记一小段行内代码,你可以用反引号把它包起来,例如: C语言中使用`printf()`进行格式化输出。 显示效果:  C语言中使用printf()进行格式化输出。 代码块: 将要显示的代码块放在3对反...
  • markdown语法之行内代码和代码段落

    万次阅读 2018-08-12 21:44:18
    在行内代码的左边右边均打上点即可code 代码区块 使用键盘上左上角数字1左边的键盘上面写三个,下面也写三个即可. 在中间写代码.可在第一行的“`左边写上语言的类型,例如 “` java private “` 显示的效果...
  • 回滚分为两部分,本地回滚服务器回滚。   本地回滚: 1.1、Showlog 显示你的提交记录。   1.2、选择要回滚到的记录,右击选择Reset this to this vision。在弹出的对话框中选择reset Type 为hard。 ...
  • 上一期讲到线性插值法在数值近似上的应用,末尾简单提了下直接利用Matlab进行验证和代码生成。 今天接着上一讲说说具体的方法以及如何通过配置选项进行优化,从而使之适用于嵌入式芯片上运行。   准备工作 ...
  • 自从google大力推出android studio开发android IDE工具之后,最近大家都切换到android studio。但是切换过来之后,各种不顺手。...在eclipse中格式化代码快捷键是Ctrl+shift+F,但是到了android studio就
  • 但是当你将Case sensitive completion设置为None的时候,就可以Eclipse一样用小写的“t”开头也可以找到Toast这个类了。 设置方法: 1.左上角点击File选项,找到Settings 2.点击Settings后,找到Editor 3.点击...
  • 设置Typora中扩展语法和代码块中行号的显示 在我们阅读博客时,简洁、明了的代码格式能让我们迅速定位和理解代码;而Markdown支持的语法高亮又可以让我们抓住重点,便于以后的复习和巩固。本文为作者在现实中使用...
  • 1.设置代码自动提示 1.1 Tools->Preferences->Code Insight 默认的代码提示时间比较长,可以调小延时时间 这样当我们在输入代码,延迟0.3秒就会自动提示代码 如果代码提示只有一个,可以按TAB键快
  • 用vscode写的项目和代码都突然消失不见了

    万次阅读 热门讨论 2019-09-14 13:23:48
    用vscode写的项目和代码都突然消失不见了 不改设置的的话,vscode会自动更新,他的更新机制是覆盖目录。 所以当你把工程目录设置在vscode文件夹下的话,就被覆盖 掉了 愚蠢的萌新,瑟瑟发抖 转自 ...
  • 代码自动补全 使用快捷键Ctrl+Shift+P调出命令行,在settings.json文件中添加 "python.autoComplete.addBrackets": true, 二 代码提示 打开命令行输入:pip install flake8,如果提示安装失败,就输入:conda ...
  • Static静态代码块以及各代码块之间的执行顺序

    万次阅读 多人点赞 2019-10-16 19:56:49
    文章目录代码块的分类1、静态代码块(也叫静态块、静态初始化块)2、构造代码块(也叫构造初始化块)3、代码块(又叫普通代码块、初始化块)执行顺序的代码测试继承中各代码块的执行顺序 代码块的分类 基本上代码...
  • 随机森林的代码实现相应的数据集 (python代码

    千次下载 热门讨论 2017-03-20 21:39:45
    本文件包括随机森林的代码实现相应的数据集,以及详尽的中文注释,已调试通过。代码有两份,一份是在网上下载的,另一份是自己整理后编写的。编程环境为Python2.7。因为只是用来学习随机森林算法,所以在调参方法...
  • 解决Ubuntu下VScode终端和代码字体显示不正常

    万次阅读 多人点赞 2019-10-05 15:19:11
    解决Ubuntu下VScode终端和代码字体显示不正常 一,问题重现 Ubuntu下,终端里的字体宽度过宽,代码里面的缩进过小,导致看起来非常的不舒服。 二,问题解决 在vscode 的偏好里面修改字体设置为monospace(等宽...
  • 代码Review那些事

    万次阅读 多人点赞 2016-04-27 20:18:19
    代码Review那些事
  • 具体方式就像页面文件(.aspx)和代码文件(.cs)两个文件相互关联 所构成的页面。一边情况下,.aspx文件中没有代码、只有空间和HTML代码,而.cs文件中编写相关的代码操作。 这样做的好处就是:使代码与页面内容分离,...
  • 这是个数学公式,但是想打出源代码(比如说想介绍一下这个代码的使用)的时候却不知道该怎么操作了。 其实有的人想到了,直接在外面再加上` ````,那就可以了吧。 这段话还会有个问题,那就是文中的“` ````”是...
  • JAVA 同步方法同步代码块的区别是什么?

    万次阅读 多人点赞 2019-06-04 12:04:33
    区别: ...同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰; 为何使用同步? java允许多线程并发控制,当多个线...
  • IntelliJ IDEA中的神仙插件(写代码必备)

    万次阅读 多人点赞 2022-01-15 02:39:09
    俗话说:"工欲善其事必先利其器",今天准备大家一起分享一下实际工作中能提升幸福感工作效率的IDEA插件。
  • 基金前端代码和后端代码的区别 基金后端代码和基金前端代码区别 一、问题 在浏览基金网站的时候,发现一款基金【交银成长30混合】,发现基金代码有一个前端交易代码和一个后端交易代码,本着好奇的心态,了解了...
  • Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序阅读目录构造函数构造代码块静态代码块Java类初始化顺序静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义...
  • 不小心进行了错误的操作,想要回到前一步操作的时候 ...3.在写自己代码的时候,经常代码下面会出现波浪线,表示自己的代码格式不符合规范,不过也不是错误,比如: 红色这块区域的波浪线是由于定义的两个...
  • 汇编语言代码数据段

    千次阅读 2017-12-17 11:32:59
    在8086cpu环境下,一个地址一个内存单元就对应着一个B,代码段指的是长度为小于64kb的、地址连续、起始地址为16(十进制)的倍数的内存单元当作专门存放代码的,数据段指的是长度小于64kb的、地址连续、起始地址为...
  • 什么叫伪代码

    千次阅读 2019-10-05 05:29:39
    由于最近找工作,面试时面试官提问时让我用伪代码回答他所提的问题,当时笔者就蒙了,满脑子就是问号,相信有部分童鞋笔者差不多,当然大多数童鞋都是好孩子,应该都知道,于是笔者赶紧回来查了一下官方解释如下:...
  • 代码整洁 vs 代码肮脏

    万次阅读 多人点赞 2019-09-16 12:05:12
    写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、什么是整洁代码;然后通过大量的刻意练习,才能真正写出整洁的代码。 WTF/min是衡量代码质量的唯一标准,...
  • Pycharm中对代码进行注释缩进

    万次阅读 2018-01-11 16:28:34
    Pycharm中对代码进行注释缩进 一、注释 1. #单行注释 2. """ 多行注释 """ 3. pycharm多行注释快捷键:Ctrl+/ 二、缩进 缩进:Tab 反向缩进:Shift+Tab

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,747,395
精华内容 5,098,958
关键字:

和代码