美文网首页
2020-05-01 自动化运维工具

2020-05-01 自动化运维工具

作者: oasis_m | 来源:发表于2020-05-01 11:15 被阅读0次

    声明:所有文章只作为学习笔记用,转载非原创
    Ansible
    http://www.ansible.com.cn/docs/intro.html
    http://www.ansible.com.cn/index.html

    git

    官方 https://github.com/git/git/releases 
            https://mirrors.edge.kernel.org/pub/software/scm/git/ 
         ---   git 原理 对象  挺重要的原理
     https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-Git-%E5%AF%B9%E8%B1%A1](https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-Git-%E5%AF%B9%E8%B1%A1 
    
    #深入理解原理
     https://www.cnblogs.com/mamingqian/p/9711975.html 
    Repo是由Android开发的命令行工具,对Git部分命令进行了封装,将百多个Git库有效的进行组织 
    
    我们提到了“Git数据库”,这是什么玩意儿呢?为了能够说清楚Git数据库的概念,我们暂且引入三个Git指令,通过这三个命令,我们就能一探git数据库的究竟。
    git init  用于创建一个空的git仓库,或重置一个已存在的git仓库
    git hash-object  git底层命令,用于向Git数据库中写入数据
    git cat-file  git底层命令,用于查看Git数据库中数据
    
    我们通过find .git命令查看新生成的空git仓库的结构,会发现其中有一个objects文件夹,这就是git数据库的存储位置。
    相应的,git数据库其实是一个简单的“键值对(key-value)”数据库
    SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数
    #object 目录
    find . -type f
    ./8b/aef1b4abc478178b004d62031cf7fe6db6f903
    ./1b/8f13ea803f6359cf903a803f48ec4c0617102b
    ./3c/d2954c0744aaa2846c55b77dc9d26d2dd80f9d
    ./01/dca2d74bbdf4f2aaad4786fbd913dd048331e5
    ./13/f31e5fff8d1154aca02f18ab42999a28a77f48
    ./31/0fc3dccef88e423f24b3b6a2486f731841daea
    ./2a/0a46f7c3eaa955684f6563abb0b03a5c1cc567
    ./2d/effe62b88231dea5b21acdcc0aa935f42115c4
    ./ff/0ea0f22980a1737cb805a98e57a76d0354a6f5
    ./35/9ea0c0b846ec137d5a3592787f3eedbc8db477
    示例:这个文件存储在以新存入数据对应hash值的前2位命名的文件夹内,文件名为hash值的后38位。这就是git数据库的存储方式,一个文件对应一条内容,就是这么简单直接。
    ./35/9ea0c0b846ec137d5a3592787f3eedbc8db477
    #git cat-file -t 359ea
    blob
    #git cat-file -p 359ea
    /bin/bash4
    其中,-t选项用于查看键值对应数据的类型,-p选项用于查看键值对应的数据内容,83bba为数据键值的简写。
    blob对象我们称之为数据对象,这是git数据库能够存储的对象类型之一,后面我们还会讲到另外两种对象分别是树(tree)对象和提交(commit)对象。
    
    我们明白,所谓跟踪文件变更,只不过是把文件变更过程中的各个状态完整记录下来。
     
    我们模拟一次文件变更的过程,看看仅仅利用git的对象数据库能不能实现“跟踪文件变更”的功能。
    git数据库存储文件时,只关心文件内容,与文件的名字无关。
    $echo "version 1" > file.txt
    $ git hash-object -w file.txt  #利用命令写入 echo "version 1" | git hash-object -w --stdin 效果相同
    $ find .git/objects -type f
    $ echo "version 2" > file.txt #修改
    $git cat-file -p 83baa
    version 1
    $git cat-file -p 1f7a7a
    version 2
    我们发现,file.txt的变更过程被完整的记录下来了。
    git cat-file -p 83baa > file.txt  #回到version1  
     
    #利用树对象(tree object)解决文件名保存和文件组织问题
    Git通过树(tree)对象将数据(blob)对象组织起来,这很类似于一种文件系统——blob对象对应文件内容,tree对象对应文件的目录和节点。一个树(tree)对象包含一条或多条记录,每条记录含有一个指向blob对象或tree对象的SHA-1指针,以及相应的模式、类型、文件名。
    
    #通常,Git根据某一时刻暂存区所表示的状态创建并记录一个对应的树对象,如此重复便可以依次记录一系列的树对象。
    #Git的暂存区是一个文件——.git/index
    为了创建一个树对象,我们需要通过暂存一些文件来创建一个暂存区。为此我们引入两个命令:
    git update-index     git底层命令,用于创建暂存区
    git ls-files --stage    git底层命令,用于查看暂存区内容
    git write-tree            git底层命令,用于将暂存区内容写入一个树对象
    
    
    以上我们添加了一个已经存在在git数据库中的文件到暂存区,如果我们新建一个未曾保存到git数据库的文件存入暂存区,进而保存为tree对象,会有什么不同吗?我们试试看。执行
    示例:
    $ echo "new file" > new
    $ git update-index --add new
    
    这说明两个问题:
    如果添加git数据库中尚未存储的数据到暂存区,则在执行update-index的时候,会同时把该数据保存到git数据库。
    添加文件进入暂存区的操作是追加操作,之前已经加入暂存区的文件依然存在——很多人会有误区,认为变更提交之后,暂存区就清空了。
    
    我们发现,无法将一个新建的空文件夹添加到暂存区。错误提示告诉我们,应该将文件将文件夹中的文件加入到暂存区(add files inside instead)。
    
    #  利用提交对象(commit object)记录版本间的时序关系和版本注释
    $ git write-tree
    cb0fbcc484a3376b3e70958a05be0299e57ab495
    $ git commit-tree cb0fbcc -m "first commit"
    7020a97c0e792f340e00e1bb8edcbafcc4dfb60f
    $ git cat-file 7020a97
    -m选项用于指定本次提交的注释。
    
    接触过git的小伙伴会发现,以上我们用到的这些指令在使用git过程中是用不到的。这是为什么呢?因为git对以上这些指令进行了封装,给用户提供了更便捷的操作命令,如add,commit等。
    
    #总结
    每次我们运行 git add 和 git commit 命令时, Git 所做的实质工作是将被改写的文件保存为数据对象,更新暂存区,记录树对象,最后创建一个指明了顶层树对象和父提交的提交对象。 这三种主要的 Git 对象——数据对象、树对象、提交对象——最初均以单独文件的形式保存在 .git/objects 目录下。
    
    
    #引用
    Git的引用
    Git的引用(references)保存在.git/refs目录下。git的引用类似于一个指针,它指向的是某一个hash键值。
    创建一个引用实在再简单不过。我们只需把一个git对象的hash键值保存在以引用的名字命名的文件中即可。
    在此之前我们查看提交记录需要执行 git log 491404,现在只需执行git log master。
    
    $ echo "491404fa6e6f95eb14683c3c06d10ddc5f8e883f" > .git/refs/heads/master
    $ cat .git/refs/heads/master
    491404fa6e6f95eb14683c3c06d10ddc5f8e883f
    Git并不提倡直接编辑引用文件,它提供了一个底层命令update-ref来创建或修改引用文件。
    echo "491404fa6e6f95eb14683c3c06d10ddc5f8e883f" > .git/refs/heads/master 命令可以简单的写作:
    $ git update-ref refs/heads/master 49140
    
    Git分支、tags等功能都是基于Git引用实现的。
    
    安装: https://www.cnblogs.com/wulixia/p/11016684.html 
     
    
    操作: https://www.runoob.com/manual/git-guide/ 
                https://www.cnblogs.com/ximiaomiao/p/7140456.html  图特别好
                https://www.cnblogs.com/WiseAdministrator/articles/11079872.html 
    
    工作流程
     https://baijiahao.baidu.com/s?id=1622009126306324754&wfr=spider&for=pc 
    ![image](https://img.haomeiwen.com/i20591801/e80a19f925db66e2?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
     https://www.cnblogs.com/WiseAdministrator/articles/11079872.html 
     https://www.cnblogs.com/videring/articles/6962005.html 
    
    概念
     https://www.cnblogs.com/zhuwei0901-yanwu/p/9466878.html 
    
    
    或许你还记得 起步 的内容, Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 **快照** 。
    
    https://blog.csdn.net/yangstarss/article/details/80691775
    #重点:
    使用git就是将本地文件(工作目录workspace)的文件,添加到暂存区(stage),然后提交到本地仓库(repository),最终可以协同开发,推送到远程仓库(remote)
    
    #git 里的基本概念组成 
    第一个是你的 工作目录,它持有实际文件;
    第二个是 暂存区(Index),它像个缓存区域,临时保存你的改动;
                Index空间,也叫做stage空间,或者cache空间,集中了很多人对Git的误解。
    最后是 HEAD,它指向你最后一次提交的结果。
    
    $ git ls-files --stage
     https://www.jianshu.com/p/6bb76450d763 
    100644 bf97e71de76bcff2bd8aba44710aa5e665eacb99 0       dir/inside.txt
    100644 8231f0fdc862f06b2bd7b7bfd2f42082d3086b71 0       index.txt
    上面的命令列出index中存放的信息。其中我们看到,即使我们是新checkout一个branch,index也不是空白的。它目前有两个条目,每个条目分别指向一个blob对象,而且还包含该blob对象所对应的文件的路径(分别是dir/inside.txt和index.txt)。而且这两个blob对象对应的都是当前commit中的文件版本。
    
    #克隆的本质
    在本地clone一个上文创建的本地仓库,git clone 可以直接输入路径来实现仓库的克隆,这与我们常见的通过url来实现本质是一样的,都是拷贝.git文件夹内的相关内容。 
    git clone是复合指令,相当于git fetch + git merge
    
    git版本库,也叫做git仓库(repository),也就是一个文件夹。
    git init命令会创建一个.git隐藏子目录,这个目录包含初始化git仓库所有的核心文件。
    此步仅仅是初始化,此时项目里的代码还没有被git跟踪,因此还需要git add对项目文件跟踪,然后git commit提交到本地仓库
    
    添加完pub 
    ssh -T git@github.com  #验证公钥是否添加成功
    
    #命令行添加一个仓库
     https://www.jianshu.com/p/9d0432e2a6e5 
    <meta charset="utf-8">
    
    # 1\. git init
    在项目根目目录下(空目录) 执行命令`git init` 初始化一个git仓库
    .git
    ├── branches
    ├── config    这个项目独有的配置
    ├── description
    ├── HEAD    head文件指示目前被检出的分支
    ├── hooks  hooks目录包含服务端和客户端的钩子脚本 hook scripts
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── prepare-commit-msg.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   └── update.sample
    ├── index  index文件保存暂存区的信息,只有git add之后才会生成,默认还没有这个文件
    ├── info    info目录是全局性排除文件,用于放置不想被记录在.gitignore文件中的忽略模式(ignored patterns)
    │   └── exclude
    ├── objects  存储所有数据内容
    │   ├── info
    │   └── pack
    └── refs  refs目录存储指向数据(分支)的提交对象的指针
        ├── heads
        └── tags
    
    git 仓库生命周期
    还记得git的四个区域吗?本地文件夹,暂存区,本地仓库,远程仓库吗?
    本地文件夹未初始化,git是不认识的
    本地文件git init后,就成了git仓库
    
    
    #工作区
    在我们进行git init mygit初始化一个git项目时,这个mygit文件夹,就是一个工作区(working Directory)
    
    #工作区里有一个.git隐藏文件夹,就是git的本地仓库
    .git文件夹里有一个index文件,就是git的暂存区,也叫做stage
    .git文件夹里的HEAD文件就是git的一个指针
    请记住,在工作文件夹的每一个文件,只有两种状态,一个是未跟踪,一个是已跟踪
    
    已跟踪:的指的是已经被纳入git版本管理的文件,在git快照中有他的记录
    未跟踪:的是这个文件既不在git快照中,也不在暂存区
    
    git init初始化时的工作文件夹,都属于已跟踪了,后续的编辑操作都会标记为,已修改文件,因此需要将修改后的文件,加入暂存区,然后提交暂存区的文件。
    
    git add 将 未跟踪 的文件添加到 暂存区域
                未修改    
                已修改
    git status 
    此命令查看git工作目录的文件,处于生命周期的哪一个状态 注意,只能在git工作目录中输入这个命令,他会去找.git文件夹 
    第一次输入git status会看到此状态,没有任何东西需要提交
    
    #撤销修改记录,只能在未提交到暂存区之前 
    git status
    git checkout -- my.txt  放弃工作区的修改操作
      如果你修改了文件,还添加到了暂存区 git add,那么只能撤销暂存区的操作,再撤销修改记录
    
    git status    
    git reset HEAD readme.txt  撤销暂存区的修改,unstage操作
    git checkout -- readme.txt
    
    #如果你直接在工作区删除文件,动作会被git记录
    rm -rf my.txt    删除了工作区的文件,git仓库还有记录
    git status    查看状态,可以检测到my.txt被删除
    
    如果确认文件无用,可以commit到git仓库
    git rm "my.txt"
    git commit -m "remove my.txt"
    
    rm -rf my.txt
    git checkout -- my.txt
    
    # 2\. git add
    复制一个文件到项目目录下,然后执行 `git add .`
    将“修改”从当前工作区存放到暂存区
    # 3\. git commit -m "first commit"
    执行 `git commit -m "注释描述"` 将暂存区中存放的文件提交到git仓库
    # 4\. 在远端新建一个git代码库:[https://github.com/JoeHR/electronApp.git](https://github.com/JoeHR/electronApp.git)
    # 5\. git remote add origin
    执行 命令 `git remote add origin https://github.com/JoeHR/electronApp.git` 将本地代码库的当前分支与远程的代码库相关联
    # 6\. git push -u origin master
    将本地代码库的当前分支推送到远程的代码库
    
    另:命令补充!
    查看git仓库的远程代码库的地址:git remote -v
     
    #练习
    git add main.py  开始跟踪main.py文件
    git status   此时再看已经被跟踪,现在已是可以被提交的状态,此时处于暂存区
    git commit -m "first main.py"  告诉git,把暂存区的main.py提交到本地仓库
    git log     查看刚才的commit记录
    
    
    #git diff
    我们将修改后的文件加入暂存区后,再执行 " git diff " 指令发现没有差异信息输出。这是因为直接使用 " git diff " 查看的是工作区和暂存区的差异。
    git diff : 对比工作区(未 git add)和暂存区(git add 之后)
    git diff --cached: 对比暂存区(git add 之后)和版本库(git commit 之后)
    git diff HEAD: 对比工作区(未 git add)和版本库(git commit 之后)
    
    有如下几种处理方式:
    1. add并且commit,再checkout,提交到当前分支
    2. add但不commit,可以stash,然后checkout回来之后stash apply,在commit,提交到当前分支
    3. add但不commit,也不stash,直接checkout,然后再commit的话,记录就在切换分支下面。
    
    其背后的原因:一个本地的git repo只有一个工作区和暂存区,但是有多个分支的提交区,而我们的checkout只是将HEAD指针从一个分支切换到另一个分支。
    
    
    
    # 重命名 mv main.py  mymain.py
    提示:直接mv的操作,会被git记录为两个形容,一、删除原有文件、二、新建了mymain.py文件
    此时新文件还未被跟踪,需要git add , git commit
    
    改名最正确的姿势
    git mv main.py mymain.py  
    git commit -m "mv mymain.py"
    
    当你的代码写好了一部分功能,就可以保存一个"存档",这个存档操作就是git commit,如果代码出错,可以随时回到"存档"记录
    
    查看"存档"记录,查看commit提交记录的命令
     git log
     git log --graph --all
    git log --oneline    一行显示git记录
    git log --oneline  --all  一行显示所有分支git记录
    git log --oneline --all -4 --graph 显示所有分支的版本演进的最近4条
    git log -4  显示最近4条记录
    git log --all     显示所有分支的commit信息
    
    #分支查看,切换分支
    git branch -v 查看分支信息
    git help --web log 以web界面显示log的参数
    git checkout <branch_name> #切换到指定分支
    git checkout -b <branch_name> #创建并切换到指定分支
    删除分支
    git branch -d <branch_name>
    .#删除一个干净的分支(即相对当前分支而言该分支没有新的提交记录)
    git branch -D <branch_name>
    .#强制删除一个分支,该分支有没有合并到当前分支的提交记录
    注意:删除分支前都需要先切换到其他分支才能进行删除操作
    
     分支恢复
    思路:对于已经有提交记录的分支删除后,实际上只是删除指针,commit记录还保留,如果想恢复,需要使用git reflog查找该分支指向的commitId,然后根据commitId创建新的分支
    git branch <branch_name> <hash_val> #根据指定commit创建新分支
    
    分支合并 https://www.jianshu.com/p/2e162b544878 
     分支暂存的机制
    
    #版本回退
    git log可以查看历史版本记录
    git reset --hard命令可以回退版本
    git reset --hard HEAD^ 回退到上个版本
    HEAD表示当前版版本
    HEAD^表示上个版本
    HEAD^^上上个版本
    
    
    
    git config --global user.name "xxx"
    git config --global user.email "xxxx@xx"
    
    #git diff是比较暂存区和工作区的文件
    git diff
    diff --git a/test.sh b/test.sh
    index e69de29..a4e696a 100644
    --- a/test.sh
    +++ b/test.sh
    @@ -0,0 +1,2 @@
    +djfkdl
    +sdjf
    
    #git 回退操作的逻辑
    reset revent 的逻辑是不同的
     https://segmentfault.com/a/1190000019352178 
    
    #HEAD
     http://www.zsythink.net/archives/3412/ 
    https://www.pianshen.com/article/9245192904/
    

    相关文章

      网友评论

          本文标题:2020-05-01 自动化运维工具

          本文链接:https://www.haomeiwen.com/subject/oywfghtx.html