Git见解和常用指令

Git见解和常用指令

Distributed-is-the-new-centralized

在阅读git的文档的过程中看到这句话,感觉非常精髓。

是说版本控制分为本地版本控制系统、集中化(Centralized)版本控制系统以及分布式(Distributed)版本控制系统,其中:

  1. 本地版本控制中,最流行的一种是RCS,其工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容;

  2. 为了让在不同系统上的开发者协同工作,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生,比较具有代表性的比如CVS、Subversion、Perforce等,都有一个单一集中管理的服务器,保存所有文件的修订版本,协同工作的机器都连接到此地,拉取新文件或是推送更新;

但是如果中心服务器宕机或磁盘损坏,CVCS必然会出现一定的问题,本地版本控制系统也存在类似的问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险;

  1. 于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 在这类系统中,像 Git、Mercurial 以及 Darcs 等,客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

在分布式版本控制系统中,每一个客户端都相当于CVCS中的中心服务器,这样最大程度的确保了历史版本更新文件的安全性,另外,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。

Git的运作逻辑

每次提交更新或保存项目状态时,Git都会给当前所有文件创建一个快照,并保存快照的索引,如果有未作修改的文件,出于效率,Git不会重新存储此文件,而只保留一个链接指向之前存储的此文件;

由于Git在客户端上将代码仓库和完整的历史记录都镜像了下来,因此几乎一切操作都可以在本地离线进行,因此速度相当快;

Git 中所有的数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,若在传送过程中丢失信息或损坏文件,Git 就能发现。

Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:

24b9da6552252987aa493b52f8696cd6d3b00373

实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

Git一般只添加数据,已经提交到快照的文件,难以被删除,因此说Git几乎不会执行任何可能导致文件不可恢复的操作;

Git的文件有三种状态:

  • 已提交(committed),表示数据已经安全地保存在本地数据库中。
  • 已修改(modified),表示修改了文件,但还没保存到数据库中。
  • 已暂存(staged),表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

Git维护三颗“树”:

  • 工作目录,持有实际文件,是放在磁盘上直接被修改的工作区。
  • 暂存区(Index/stage,又称索引),保存着下次将要提交的文件列表信息。
  • .git directory(repo),指向最后一次提交(commit)的结果,Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。

一次修改后,暂存、提交并推送到远程仓库所涉及的指令如下所示:

Git常用命令

1
2
3
git add --all //将改动的文件全部放入暂存区
git commit -m "fixsinfo" //提交改动到Git仓库目录,并填写改动信息
git push origin main //将提交的改动上传到远程仓库中

初始化一个git仓库

1
git init

创建一个新文件,并填写一些内容

1
echo [Random contents] > [filename]

将工作区中的指定文件添加到暂存区

1
git add [filename]

将暂存区的文件提交到版本控制中并附描述

1
git commit -m "Change Description"

查看文件状态

1
git status

更为紧凑的状态输出

1
git status -s/--short

A 新添加到暂存区的文件

M 修改过的文件

输出有两栏,左栏表示暂存区,右栏表示工作区

查看未暂存的已修改文件的差异

1
git diff

查看已经暂存的变化

1
git diff --cached/--staged

跳过暂存步骤直接提交

1
git commit -a -m "Change Description"

从跟踪文件清单和工作仓库中移除某个文件

1
git rm [filename]

从暂存区和工作仓库移除某个文件

1
git rm -f [filename]

从暂存区移除,在工作仓库中保留某个文件

1
git rm --cached [filename]

重命名文件

1
git mv [name1] [name2]

忽略文件

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。