聲明:所有文章只作為學習筆記用季稳,轉載非原創(chuàng)
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開發(fā)的命令行工具,對Git部分命令進行了封裝,將百多個Git庫有效的進行組織
我們提到了“Git數(shù)據(jù)庫”谷炸,這是什么玩意兒呢?為了能夠說清楚Git數(shù)據(jù)庫的概念社露,我們暫且引入三個Git指令,通過這三個命令,我們就能一探git數(shù)據(jù)庫的究竟他嚷。
git init 用于創(chuàng)建一個空的git倉庫默刚,或重置一個已存在的git倉庫
git hash-object git底層命令甥郑,用于向Git數(shù)據(jù)庫中寫入數(shù)據(jù)
git cat-file git底層命令,用于查看Git數(shù)據(jù)庫中數(shù)據(jù)
我們通過find .git命令查看新生成的空git倉庫的結構荤西,會發(fā)現(xiàn)其中有一個objects文件夾澜搅,這就是git數(shù)據(jù)庫的存儲位置伍俘。
相應的,git數(shù)據(jù)庫其實是一個簡單的“鍵值對(key-value)”數(shù)據(jù)庫
SHA-1(英語:Secure Hash Algorithm 1勉躺,中文名:安全散列算法1)是一種密碼散列函數(shù)
#object 目錄
find . -type f
./8b/aef1b4abc478178b004d62031cf7fe6db6f903
./1b/8f13ea803f6359cf903a803f48ec4c0617102b
./3c/d2954c0744aaa2846c55b77dc9d26d2dd80f9d
./01/dca2d74bbdf4f2aaad4786fbd913dd048331e5
./13/f31e5fff8d1154aca02f18ab42999a28a77f48
./31/0fc3dccef88e423f24b3b6a2486f731841daea
./2a/0a46f7c3eaa955684f6563abb0b03a5c1cc567
./2d/effe62b88231dea5b21acdcc0aa935f42115c4
./ff/0ea0f22980a1737cb805a98e57a76d0354a6f5
./35/9ea0c0b846ec137d5a3592787f3eedbc8db477
示例:這個文件存儲在以新存入數(shù)據(jù)對應hash值的前2位命名的文件夾內(nèi)癌瘾,文件名為hash值的后38位。這就是git數(shù)據(jù)庫的存儲方式饵溅,一個文件對應一條內(nèi)容妨退,就是這么簡單直接。
./35/9ea0c0b846ec137d5a3592787f3eedbc8db477
#git cat-file -t 359ea
blob
#git cat-file -p 359ea
/bin/bash4
其中蜕企,-t選項用于查看鍵值對應數(shù)據(jù)的類型咬荷,-p選項用于查看鍵值對應的數(shù)據(jù)內(nèi)容,83bba為數(shù)據(jù)鍵值的簡寫轻掩。
blob對象我們稱之為數(shù)據(jù)對象幸乒,這是git數(shù)據(jù)庫能夠存儲的對象類型之一,后面我們還會講到另外兩種對象分別是樹(tree)對象和提交(commit)對象唇牧。
我們明白罕扎,所謂跟蹤文件變更,只不過是把文件變更過程中的各個狀態(tài)完整記錄下來丐重。
我們模擬一次文件變更的過程腔召,看看僅僅利用git的對象數(shù)據(jù)庫能不能實現(xiàn)“跟蹤文件變更”的功能。
git數(shù)據(jù)庫存儲文件時扮惦,只關心文件內(nèi)容臀蛛,與文件的名字無關。
$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
我們發(fā)現(xiàn)径缅,file.txt的變更過程被完整的記錄下來了掺栅。
git cat-file -p 83baa > file.txt #回到version1
#利用樹對象(tree object)解決文件名保存和文件組織問題
Git通過樹(tree)對象將數(shù)據(jù)(blob)對象組織起來,這很類似于一種文件系統(tǒng)——blob對象對應文件內(nèi)容纳猪,tree對象對應文件的目錄和節(jié)點氧卧。一個樹(tree)對象包含一條或多條記錄,每條記錄含有一個指向blob對象或tree對象的SHA-1指針氏堤,以及相應的模式沙绝、類型、文件名鼠锈。
#通常闪檬,Git根據(jù)某一時刻暫存區(qū)所表示的狀態(tài)創(chuàng)建并記錄一個對應的樹對象,如此重復便可以依次記錄一系列的樹對象购笆。
#Git的暫存區(qū)是一個文件——.git/index
為了創(chuàng)建一個樹對象粗悯,我們需要通過暫存一些文件來創(chuàng)建一個暫存區(qū)。為此我們引入兩個命令:
git update-index git底層命令同欠,用于創(chuàng)建暫存區(qū)
git ls-files --stage git底層命令样傍,用于查看暫存區(qū)內(nèi)容
git write-tree git底層命令横缔,用于將暫存區(qū)內(nèi)容寫入一個樹對象
以上我們添加了一個已經(jīng)存在在git數(shù)據(jù)庫中的文件到暫存區(qū),如果我們新建一個未曾保存到git數(shù)據(jù)庫的文件存入暫存區(qū)衫哥,進而保存為tree對象茎刚,會有什么不同嗎?我們試試看撤逢。執(zhí)行
示例:
$ echo "new file" > new
$ git update-index --add new
這說明兩個問題:
如果添加git數(shù)據(jù)庫中尚未存儲的數(shù)據(jù)到暫存區(qū)膛锭,則在執(zhí)行update-index的時候,會同時把該數(shù)據(jù)保存到git數(shù)據(jù)庫蚊荣。
添加文件進入暫存區(qū)的操作是追加操作初狰,之前已經(jīng)加入暫存區(qū)的文件依然存在——很多人會有誤區(qū),認為變更提交之后妇押,暫存區(qū)就清空了跷究。
我們發(fā)現(xiàn),無法將一個新建的空文件夾添加到暫存區(qū)敲霍。錯誤提示告訴我們,應該將文件將文件夾中的文件加入到暫存區(qū)(add files inside instead)丁存。
# 利用提交對象(commit object)記錄版本間的時序關系和版本注釋
$ git write-tree
cb0fbcc484a3376b3e70958a05be0299e57ab495
$ git commit-tree cb0fbcc -m "first commit"
7020a97c0e792f340e00e1bb8edcbafcc4dfb60f
$ git cat-file 7020a97
-m選項用于指定本次提交的注釋肩杈。
接觸過git的小伙伴會發(fā)現(xiàn),以上我們用到的這些指令在使用git過程中是用不到的解寝。這是為什么呢扩然?因為git對以上這些指令進行了封裝,給用戶提供了更便捷的操作命令聋伦,如add夫偶,commit等。
#總結
每次我們運行 git add 和 git commit 命令時觉增, Git 所做的實質工作是將被改寫的文件保存為數(shù)據(jù)對象兵拢,更新暫存區(qū),記錄樹對象逾礁,最后創(chuàng)建一個指明了頂層樹對象和父提交的提交對象说铃。 這三種主要的 Git 對象——數(shù)據(jù)對象、樹對象嘹履、提交對象——最初均以單獨文件的形式保存在 .git/objects 目錄下腻扇。
#引用
Git的引用
Git的引用(references)保存在.git/refs目錄下。git的引用類似于一個指針砾嫉,它指向的是某一個hash鍵值幼苛。
創(chuàng)建一個引用實在再簡單不過。我們只需把一個git對象的hash鍵值保存在以引用的名字命名的文件中即可焕刮。
在此之前我們查看提交記錄需要執(zhí)行 git log 491404舶沿,現(xiàn)在只需執(zhí)行git log master舌剂。
$ echo "491404fa6e6f95eb14683c3c06d10ddc5f8e883f" > .git/refs/heads/master
$ cat .git/refs/heads/master
491404fa6e6f95eb14683c3c06d10ddc5f8e883f
Git并不提倡直接編輯引用文件,它提供了一個底層命令update-ref來創(chuàng)建或修改引用文件暑椰。
echo "491404fa6e6f95eb14683c3c06d10ddc5f8e883f" > .git/refs/heads/master 命令可以簡單的寫作:
$ git update-ref refs/heads/master 49140
Git分支霍转、tags等功能都是基于Git引用實現(xiàn)的。
安裝: 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
或許你還記得 起步 的內(nèi)容一汽, Git 保存的不是文件的變化或者差異避消,而是一系列不同時刻的 **快照** 。
https://blog.csdn.net/yangstarss/article/details/80691775
#重點:
使用git就是將本地文件(工作目錄workspace)的文件召夹,添加到暫存區(qū)(stage),然后提交到本地倉庫(repository)岩喷,最終可以協(xié)同開發(fā),推送到遠程倉庫(remote)
#git 里的基本概念組成
第一個是你的 工作目錄监憎,它持有實際文件纱意;
第二個是 暫存區(qū)(Index),它像個緩存區(qū)域鲸阔,臨時保存你的改動偷霉;
Index空間,也叫做stage空間褐筛,或者cache空間类少,集中了很多人對Git的誤解。
最后是 HEAD渔扎,它指向你最后一次提交的結果硫狞。
$ git ls-files --stage
http://www.reibang.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一個上文創(chuàng)建的本地倉庫旁瘫,git clone 可以直接輸入路徑來實現(xiàn)倉庫的克隆,這與我們常見的通過url來實現(xiàn)本質是一樣的琼蚯,都是拷貝.git文件夾內(nèi)的相關內(nèi)容酬凳。
git clone是復合指令,相當于git fetch + git merge
git版本庫遭庶,也叫做git倉庫(repository)宁仔,也就是一個文件夾。
git init命令會創(chuàng)建一個.git隱藏子目錄峦睡,這個目錄包含初始化git倉庫所有的核心文件翎苫。
此步僅僅是初始化权埠,此時項目里的代碼還沒有被git跟蹤,因此還需要git add對項目文件跟蹤煎谍,然后git commit提交到本地倉庫
添加完pub
ssh -T git@github.com #驗證公鑰是否添加成功
#命令行添加一個倉庫
http://www.reibang.com/p/9d0432e2a6e5
<meta charset="utf-8">
# 1\. git init
在項目根目目錄下(空目錄) 執(zhí)行命令`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文件保存暫存區(qū)的信息攘蔽,只有git add之后才會生成,默認還沒有這個文件
├── info info目錄是全局性排除文件呐粘,用于放置不想被記錄在.gitignore文件中的忽略模式(ignored patterns)
│ └── exclude
├── objects 存儲所有數(shù)據(jù)內(nèi)容
│ ├── info
│ └── pack
└── refs refs目錄存儲指向數(shù)據(jù)(分支)的提交對象的指針
├── heads
└── tags
git 倉庫生命周期
還記得git的四個區(qū)域嗎满俗?本地文件夾,暫存區(qū)作岖,本地倉庫唆垃,遠程倉庫嗎?
本地文件夾未初始化痘儡,git是不認識的
本地文件git init后辕万,就成了git倉庫
#工作區(qū)
在我們進行git init mygit初始化一個git項目時,這個mygit文件夾沉删,就是一個工作區(qū)(working Directory)
#工作區(qū)里有一個.git隱藏文件夾渐尿,就是git的本地倉庫
.git文件夾里有一個index文件,就是git的暫存區(qū)丑念,也叫做stage
.git文件夾里的HEAD文件就是git的一個指針
請記住涡戳,在工作文件夾的每一個文件,只有兩種狀態(tài)脯倚,一個是未跟蹤,一個是已跟蹤
已跟蹤:的指的是已經(jīng)被納入git版本管理的文件嵌屎,在git快照中有他的記錄
未跟蹤:的是這個文件既不在git快照中推正,也不在暫存區(qū)
git init初始化時的工作文件夾,都屬于已跟蹤了宝惰,后續(xù)的編輯操作都會標記為植榕,已修改文件,因此需要將修改后的文件尼夺,加入暫存區(qū)尊残,然后提交暫存區(qū)的文件。
git add 將 未跟蹤 的文件添加到 暫存區(qū)域
未修改
已修改
git status
此命令查看git工作目錄的文件淤堵,處于生命周期的哪一個狀態(tài) 注意寝衫,只能在git工作目錄中輸入這個命令,他會去找.git文件夾
第一次輸入git status會看到此狀態(tài)拐邪,沒有任何東西需要提交
#撤銷修改記錄慰毅,只能在未提交到暫存區(qū)之前
git status
git checkout -- my.txt 放棄工作區(qū)的修改操作
如果你修改了文件,還添加到了暫存區(qū) git add扎阶,那么只能撤銷暫存區(qū)的操作汹胃,再撤銷修改記錄
git status
git reset HEAD readme.txt 撤銷暫存區(qū)的修改婶芭,unstage操作
git checkout -- readme.txt
#如果你直接在工作區(qū)刪除文件,動作會被git記錄
rm -rf my.txt 刪除了工作區(qū)的文件着饥,git倉庫還有記錄
git status 查看狀態(tài)犀农,可以檢測到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
復制一個文件到項目目錄下宰掉,然后執(zhí)行 `git add .`
將“修改”從當前工作區(qū)存放到暫存區(qū)
# 3\. git commit -m "first commit"
執(zhí)行 `git commit -m "注釋描述"` 將暫存區(qū)中存放的文件提交到git倉庫
# 4\. 在遠端新建一個git代碼庫:[https://github.com/JoeHR/electronApp.git](https://github.com/JoeHR/electronApp.git)
# 5\. git remote add origin
執(zhí)行 命令 `git remote add origin https://github.com/JoeHR/electronApp.git` 將本地代碼庫的當前分支與遠程的代碼庫相關聯(lián)
# 6\. git push -u origin master
將本地代碼庫的當前分支推送到遠程的代碼庫
另:命令補充呵哨!
查看git倉庫的遠程代碼庫的地址:git remote -v
#練習
git add main.py 開始跟蹤main.py文件
git status 此時再看已經(jīng)被跟蹤,現(xiàn)在已是可以被提交的狀態(tài),此時處于暫存區(qū)
git commit -m "first main.py" 告訴git贵扰,把暫存區(qū)的main.py提交到本地倉庫
git log 查看剛才的commit記錄
#git diff
我們將修改后的文件加入暫存區(qū)后仇穗,再執(zhí)行 " git diff " 指令發(fā)現(xiàn)沒有差異信息輸出。這是因為直接使用 " git diff " 查看的是工作區(qū)和暫存區(qū)的差異戚绕。
git diff : 對比工作區(qū)(未 git add)和暫存區(qū)(git add 之后)
git diff --cached: 對比暫存區(qū)(git add 之后)和版本庫(git commit 之后)
git diff HEAD: 對比工作區(qū)(未 git add)和版本庫(git commit 之后)
有如下幾種處理方式:
1. add并且commit纹坐,再checkout,提交到當前分支
2. add但不commit舞丛,可以stash耘子,然后checkout回來之后stash apply,在commit球切,提交到當前分支
3. add但不commit谷誓,也不stash,直接checkout吨凑,然后再commit的話捍歪,記錄就在切換分支下面。
其背后的原因:一個本地的git repo只有一個工作區(qū)和暫存區(qū)鸵钝,但是有多個分支的提交區(qū)糙臼,而我們的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的參數(shù)
git checkout <branch_name> #切換到指定分支
git checkout -b <branch_name> #創(chuàng)建并切換到指定分支
刪除分支
git branch -d <branch_name>
.#刪除一個干凈的分支(即相對當前分支而言該分支沒有新的提交記錄)
git branch -D <branch_name>
.#強制刪除一個分支,該分支有沒有合并到當前分支的提交記錄
注意:刪除分支前都需要先切換到其他分支才能進行刪除操作
分支恢復
思路:對于已經(jīng)有提交記錄的分支刪除后绘证,實際上只是刪除指針隧膏,commit記錄還保留,如果想恢復嚷那,需要使用git reflog查找該分支指向的commitId胞枕,然后根據(jù)commitId創(chuàng)建新的分支
git branch <branch_name> <hash_val> #根據(jù)指定commit創(chuàng)建新分支
分支合并 http://www.reibang.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是比較暫存區(qū)和工作區(qū)的文件
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/