从本质彻底精通Git——4个模型1个周期1个史观1个工作流

  Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

  Git是Linus Torvalds为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

二、分布式VS集中式

  VisualSVN、TortoiseSVN、Bazzar为集中式版本控制系统,而Mercurial、Git、Bitkeeper为分布式版本控制系统。

  1. 集中式版本控制

    优点:可以对具体的文件或目录进行权限控制,有全局的版本号。

    缺点:所有操作都需要联网中心服务器。

  2. 分布式版本控制

    优点:

      i. 分支管理。

      ii. 完整性和安全性更高,各客户端保留有完整的版本库。

      iii. 绝大部分操作都是本地化的,支持离线。

    缺点:

      i. 对版本库的目录和文件无法做到精细化的权限控制。

      ii. 无全局性的版本号。

  通过以上分析的集中式和分布式版本控制的优缺点,我们就能总结出以Git为代表的分布式版本控制和以SVN为代表的集中式版本控制之间的区别。

  3. Git和SVN的区别

最核心的区别当然是分布式和集中式。

处理数据的方式不同,Git以元数据方式存储数据,SVN按照文件存储,对应的取出数据方式也不一样。

分支管理或分支模型(下文会详解)。

全局性的版本号。

数据的完整性和安全性,分布式的更好。

三、常用的Git解决方案和代码托管平台

  1.开源软件解决方案:Gitea、GitLab

  2.代码托管平台:码云(Gitee)、码市(Coding)、GitHub、GitLab、Bitbucket

四、Git的基石SHA-1

  In cryptography, SHA-1 (Secure Hash Algorithm 1) is a cryptographichash function which takes an input and produces a 160-bit (20-byte) hash value known as a message digest – typically rendered as ahexadecimal number, 40 digits long. It was designed by the UnitedStates National Security Agency, and is a U.S. Federal InformationProcessing Standard.

  以上摘自维基百科,主要说明了SHA是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。SHA-1长度为20字节,160位,熟悉网络编程的都知道,4位可以转换成一个十六进制的数字,所以一个SHA-1散列可以展示为40长度的十六进制的数字。

  SHA-1的计算方法伪代码:

1 //Note: All variables are unsigned 32 bits and wrap modulo 232 when calculating 2 3 //Initial variables: 4 h0 := 0x67452301 5 h1 := 0xEFCDAB89 6 h2 := 0x98BADCFE 7 h3 := 0x10325476 8 h4 := 0xC3D2E1F0 9 10 //Pre-processing: 11 append the bit '1' to the message 12 append k bits '0', where k is the minimum number >= 0 such that the resulting message 13 length (in bits) is congruent to 448(mod 512) 14 append length of message (before pre-processing), in bits, as 64-bit big-endian integer 15 16 //Process the message in successive 512-bit chunks: 17 break message into 512-bit chunks 18 for each chunk 19 break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15 20 21 //Extend the sixteen 32-bit words into eighty 32-bit words: 22 for i from 16 to 79 23 w[i] := (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1 24 25 //Initialize hash value for this chunk: 26 a := h0 27 b := h1 28 c := h2 29 d := h3 30 e := h4 31 32 //Main loop: 33 for i from 0 to 79 34 if 0 ≤ i ≤ 19 then 35 f := (b and c) or ((not b) and d) 36 k := 0x5A827999 37 else if 20 ≤ i ≤ 39 38 f := b xor c xor d 39 k := 0x6ED9EBA1 40 else if 40 ≤ i ≤ 59 41 f := (b and c) or (b and d) or(c and d) 42 k := 0x8F1BBCDC 43 else if 60 ≤ i ≤ 79 44 f := b xor c xor d 45 k := 0xCA62C1D6 46 temp := (a leftrotate 5) + f + e + k + w[i] 47 e := d 48 d := c 49 c := b leftrotate 30 50 b := a 51 a := temp 52 53 //Add this chunk's hash to result so far: 54 h0 := h0 + a 55 h1 := h1 + b 56 h2 := h2 + c 57 h3 := h3 + d 58 h4 := h4 + e 59 60 //Produce the final hash value (big-endian): 61 digest = hash = h0 append h1 append h2 append h3 append h4

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfjzg.html