• Git


    前言

    由于日常工作中会用到git和SVN等版本控制系统,而在学校又没有接触过,所以就抽时间整理了一下自己在大神公众号里学到的知识点,包括介绍和常用语法两部分。

    1、介绍

    Git是一个版本控制系统。

    顾名思义,版本控制系统(Version Control System,vcs)是一类用于追踪源代码改动的工具,这些工具可以帮助我们管理代码的历史记录,不仅如此,还可以让协作编码变得轻而易举。

    VCS 通过一系列的快照(Snapshots)将某个文件夹以及内容保存起来,每个快照都包含了文件夹的完整状态。同时,VCS 还维护者快照的创建者信息以及其他相关信息。

    VCS的优点:

    • 记录相关信息:代码编写人员,编写时间,修改了什么;
    • 并发编程;

    VCS中最为广大程序员欢迎的当属Git,此外还有SVN等。

    接下来我就将Git 的相关知识点进行一定的介绍。

    Git 将顶级目录中的文件和文件夹称作集合,并通过一系列快照来管理历史记录。

    在 Git 的术语中,文件被称为 blob 对象(数据对象),也就是一组数据。

    目录则被称为 tree(树),目录中可以包含文件和子目录。

    如:

    <root> (tree)
    |
    +- foo (tree)
    |  |
    |  + bar.txt (blob, contents = "hello world")
    |
    +- baz.txt (blob, contents = "git is wonderful")

    顶层的树(也就是 root) 包含了两个元素,一个名为 foo 的子树(包含了一个 blob 对象“bar.txt”),和一个 blob 对象“baz.txt”。

    版本控制系统是如何和快照进行关联的呢?

    在Git中,历史记录是一个由快照组成的有向无环图。“有向无环图”,听起来很高大上,但其实并不难理解。我们只需要知道这代表 Git 中的每个快照都有一系列的父辈,也就是之前的一系列快照。这些快照通常被称为“commit”,看起来好像是下面这样:

    o <-- o <-- o <-- o
                ^  
                 
                  --- o <-- o

    o 表示一次 commit,也就是一次快照。箭头指向了当前 commit 的父辈。在第三次 commit 之后,历史记录分叉成了两条独立的分支,这可能是因为要同时开发两个不同的特性,它们之间是相互独立的。

    开发完成后,这些分支可能会被合并为一个新的 commit,这个新的 commit 会同时包含这些特性,看起来好像是下面这样:

    o <-- o <-- o <-- o <---- o
                ^            /
                           v
                  --- o <-- o

    Git 中的 commit 是不可改变的。当然了,这并不意味着不能被修改,只不过这种“修改”实际上是创建了一个全新的提交记录。

    以伪代码的形式来学习 Git 的数据模型,可能更加通俗易懂。

    // 文件是一组数据
    type blob = array<byte>
    
    // 一个包含了文件和子目录的目录
    type tree = map<string, tree | file>
    
    // 每个 commit 都包含了一个父辈,元数据和顶层树
    type commit = struct {
        parent: array<commit> // 父辈
        author: string // 作者
        message: string // 信息
        snapshot: tree // 快照
    }

    Git 中的对象可以是 blob、tree 或者 commit。

    Git 在存储数据的时候,所有的对象都会基于它们的安全散列算法进行寻址。

     blob、tree 和 commit 一样,都是对象。当它们引用其他对象时,并没有真正在硬盘上保存这些对象,而是仅仅保存了它们的哈希值作为引用。

    拿这个例子来讲:

    <root> (tree)
    |
    +- foo (tree)
    |  |
    |  + bar.txt (blob, contents = "hello world")
    |
    +- baz.txt (blob, contents = "git is wonderful")

    root 引用的 foo 和 baz.txt 就像下面这样:

    100644 blob 4448adbf7ecd394f42ae135bbeed9676e894af85    baz.txt
    040000 tree c68d233a33c5c06e0340e4c224f0afca87c8ce87    foo

    所有的快照都可以通过它们的哈希值来标记,但 40 位的十六进制字符实在是太难记了,很不方便。针对这个问题,Git 的解决办法是给这些哈希值赋予一个可读的名字,也就是引用(reference),引用是指向 commit 的指针,与对象不同,它是可变的,可以被更新,指向新的 commit。通常,master 引用通常会指向主分支的最新一次 commit。

    这样,Git 就可以使用“master”这样容易被记住的名称来表示历史记录中特定的 commit,而不需要再使用一长串的十六进制字符了。

    在 Git 中,当前的位置有一个特殊的索引,它就是“HEAD”。

    在硬盘上,Git 仅存储对象和引用,因为其数据模型仅包含这些东西。所有的 git 命令都对应着对 commit 树的操作。

    Git 中还包含了一个和数据模型完全不相关的概念,叫做“暂存区”,它运行我们指定下次快照中要包含哪些改动。

    下面,我们来看一下常用的 git 命令行接口,包含基础、分支与合并、远端操作、撤销和高级操作。

    2、命令:

    2.1、基础

     1 git help <command>: 获取 git 命令的帮助信息
     2 git init: 创建一个新的 git 仓库,其数据会存放在一个名为 .git 的目录下
     3 git status: 显示当前的仓库状态
     4 git add <filename>: 添加文件到暂存区
     5 git commit: 创建一个新的提交
     6 git log: 显示历史日志
     7 git log --all --graph --decorate: 可视化历史记录(有向无环图)
     8 git diff <filename>: 显示与上一次提交之间的差异
     9 git diff <revision> <filename>: 显示某个文件两个版本之间的差异
    10 git checkout <revision>: 更新 HEAD 和目前的分支

    2.2、分支与合并

    git branch: 显示分支
    git branch <name>: 创建分支
    git checkout -b <name>: 创建分支并切换到该分支
    git merge <revision>: 合并到当前分支
    git mergetool: 使用工具来处理合并冲突

    2.3、远端操作

    git remote: 列出远端
    git remote add <name> <url>: 添加一个远端
    git push <remote> <local branch>:<remote branch>: 将对象传送至远端并更新远端引用
    git branch --set-upstream-to=<remote>/<remote branch>: 创建本地和远端分支的关联关系
    git fetch: 从远端获取对象/索引
    git pull: 相当于 git fetch; git merge
    git clone: 从远端下载仓库

    2.4、撤销

    git commit --amend: 编辑提交的内容或信息
    git reset HEAD <file>: 恢复暂存的文件
    git checkout -- <file>: 丢弃修改

    2.5、高级操作

    git config: 定制化
    git clone --shallow: 克隆仓库,但是不包括版本历史信息
    git add -p: 交互式暂存
    git blame: 查看最后修改某行的人
    git stash: 暂时移除工作目录下的修改内容
    git bisect: 通过二分查找搜索历史记录
    .gitignore: 指定不追踪的文件

    参考及致谢:

    1、https://mp.weixin.qq.com/s/_pgqMbAME1iWYFV-ZfHsQA

    ........

  • 相关阅读:
    Mockito
    输入一个链表,输出该链表中倒数第k个结点。
    序列化
    全排列
    PostgreSQL libpq学习指南二
    PostgreSQL libpq 客户端接口(一)
    PostgreSQL 中的shared buffer
    通过 Unwrapper 解密 DBMS 程序包
    openGuassDB介绍及安装实践
    PostgreSQL中的ACID特性介绍
  • 原文地址:https://www.cnblogs.com/gjmhome/p/14587253.html
Copyright © 2020-2023  润新知