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

声明:所有文章只作为学习笔记用,转载非原创
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://upload-images.jianshu.io/upload_images/20591801-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/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352