01 | Git的安裝
-
git文檔官方網址:
-
下載對應系統的.exe安裝包,解壓安裝【一路下一步即可】
驗證是否安裝成功方法:打開電腦cmd指令窗口,輸入
git --version
輸出如上圖即安裝成功
02 | 使用Git之前需要做的最小配置
-
配置 user 信息
配置 user.name 和 user.email
注:目的,方便項目管理人員通過提交記錄指正問題或者與提交者溝通相關問題;
$ git config --global user.name 'your_name' $ git config --global user.email 'your_email@domain.com'
-
config 的三個作用域
缺省等同於 local
$ git config --local // local 只針對某個倉庫有效 $ git config --global // global 對當前用戶所有倉庫有效 $ git config --system // system對系統所有登錄的用戶有效【不常用】
顯示 config 的配置,加 --list【注:--list后需要加空格來匹配查詢范圍】
$ git config --list --local $ git config --list --global $ git config --list --system
思考:配置用戶信息時,local 和 global 有哪些區別?
03 | 創建第一個倉庫並配置local用戶信息
-
建 Git 倉庫
兩種場景:
(1)把已有的項目代碼納入 Git 管理
$ cd 項目代碼所在文件夾 $ git init
(2)新建的項目直接用 Git 管理
$ cd 某個文件夾 $ git init your_project #會在當前路徑下創建和項目名稱同名的文件夾 $ cd your_project
-
在新建倉庫中,若同時配置global 和 local 的用戶信息時,Git 如何處理?
commit 記錄時,用戶信息權重優先級比較:
當前倉庫 local 信息 > 其他倉庫 local 信息 > 全局 global 信息
-
往倉庫里面添加文件
(1)加入 index.html 和 git-logo
(2)加入 style.css
(3)加入 scrpit.js
(4)修改 index.html 和style.css
工作目錄 ---> git add files ---> 暫存區 ---> git commit ---> 版本歷史
-
指令:git add -u == git add .
注:將項目中已經被 git 跟蹤(管理,控制)的文件
05 | 給文件重命名的簡便方法
-
步驟
重命名文件 ---> git add 文件名【添加新文件】---> git rm 文件名【移除舊文件】
git reset --hard 【清除暫存】 將暫存區和工作區目錄上的所有的更改清除掉(慎用)
簡化步驟:
git mv readme readme.md
注:在window和os系統中對於大小寫的敏感度會影響修改結果,需要特別留心
06 | 通過git log 查看版本演變歷史
-
git log 【查看當前分支的版本歷史】的常用用法
git log --oneline // 簡單的查看版本列表歷史有哪些修改 git log -n4 --oneline // 查看最近4次的提交歷史 git log -n2 --oneline // 查看最近2次的提交歷史 git log --all // 查看所有分支的提交歷史 git log --all --graph // 圖形化提交分支歷史 // 一些組合 git log --oneline --all // 所有分支提交歷史記錄列表 git log --oneline --all -n4 // 所有分支最近四次的提交歷史記錄 git log --oneline --all -n4 --graph // 所有分支最近四次的提交歷史記錄圖形化 git log --oneline temp // 指定分支提交歷史記錄列表 // 特例 git log --oneline --all temp // all之后再指定分支是不起作用的,all的優先級更高 // 其他 git branch // 查看本地分支信息 git branch -v // 查看相對詳細的本地分支信息 git branch -a // 查看所有分支信息 git branch -av // 查看包括遠程倉庫在內的分支信息 git help --web log // 跳轉到git log 的幫助文檔網頁
-
命令行與圖形界面各自利弊
簡單總結:因人而異;
-
什么時候用'--'什么時候用'-'的問題
網友給出的理解:
(1)與Linux大致規則相同,- 后面跟一個字符,如-a,-b; -- 后面跟的是字符串,如--version,--all
(2)參考help文檔查看規律,詳細參數需要使用--,簡化參數使用-
-
git help --web log 報錯 fatal:'/usr/local/git/share/doc/git-doc':not a documentation directory.
問題節點:當前路徑下缺少git-doc文件夾,方案百度即可;
造成問題的原因:電腦跟新git版本沖突,導致文件缺失;
-
git help -4 <==> git help -n4
原文檔中提示: '-<number>' 通 ‘-n<number>’
-
git log 模式退出需要按q退出,有時則不需要?
當控制台窗口足夠大,能夠顯示所有的日志信息時,就不會進入vi的瀏覽模式
07 | gitk: 通過圖形界面工具來查看版本歷史
-
git 管理的項目目錄下cmd命令窗口輸入gitk即可彈出對應可視化窗口;
-
gitk 可能存在的問題:
(1)中文亂碼;【百度即可找到解決方案】
(2)直接輸入gitk報錯,可能原因:git 版本問題;安裝時未安裝gitk,需要手動安裝;
-
圖形化工具推薦:
gitkarken、sourcetree、tower、tortoise
-
Author // 作者 Committer // 提交人 // 意義:尊重原作者
08 | 探秘 .git 目錄
ls -al // linux命令,顯示當前目錄下的所有文件及文件夾包括隱藏的.和..等的詳細信息
-
其中常用的有HEAD【作用:告知當前工作分支】
cat fileName // linux 指令平時用的最多的主要是在終端查看某個文件 ref:refs/heads/master // 意指當前指向分支為 master 分支
注:當執行 git checkout temp 切換到新創建的temp分支后,其指向將更新為ref:refs/heads/temp
-
config 內部內容【和本地倉庫相關的配置信息】
-
refs 內容
heads ---> 對應項目中不同的分支 tags ---> 意味着項目中可以有多個標簽【又稱里程碑】
git cat-file -t 提交關鍵編號 // 查看編號類型 // commit 生成的字符串即可以理解為通過算法生成的哈希值
注:tag 本身擁有一個哈希值--->存放着一個對象,對象的值為另一個哈希值--->這個對象的類型是個commit
-
objcets
git cat-file -t // 看類型 git cat-file -p // 看內容 tree // 樹 blob // 文件對象 commit // 對象 // tree、blob、commit git的三個核心對象
注:樹的策略為 e9 + 哈希值
09 | commit、tree 和 blob 三個對象之間的關系
-
commit 【撥開】---> 【含有】tree(特定時間點的所有文件快照)--->blob【具體的文件】
-
png 為特殊格式的二進制文件,故而命令行cat 解析成亂碼;
-
git 本身有增量存儲機制,應對commit無數次后,objects目錄中文件的不斷累積疊加;
其次,Git 對於內容相同的文件只會存一個blob,不同的commit的區別是commit、tree和有差異的blob,多數未變更的文件對應的blob都是相同的,如此設計從而對版本管理系統來說節省了很多的存儲空間;
-
git底層的運行流程了:
(1)當我們添加或者修改了文件並且add到Stage Area之后,首先會根據文件內容創建不同的blob
(2)當進行提交之后馬上創建一個tree組件把需要的blob組件添加進去
(3)之后再封裝到一個commit組件中完成本次提交。
在將來進行reset的時候可以直接使用 git reset --hard xxxxx 可以恢復到某個特定的版本,在reset之后,git會根據這個commit組件的id快速的找到tree組件,然后根據tree找到blob組件,之后對倉庫進行還原,整個過程都是以hash和二進制進行操作,所以git執行效率非常之高
(4)對於tree的理解:git 中的文件夾是通過 tree 來組織的,so,可以把 tree 對應於文件夾對象;
10 | 練習:數一數 tree 的個數 【待驗證】
-
題目:新建的Git倉庫,有且僅有1個commit,僅僅包含/doc/readme,請問內含有多少個tree,多少個blob?
-
思考:若不讓readme文件中寫入信息,加入暫存區后Git是會創建一個空的blob對象,還是不創建呢?
11 | 分離頭指針情況下的注意事項
-
情況英文描述:
You are in 'detached HEAD' state. // 你正處在一個分離頭指針狀態
-
產生原因指令
git checkout 某個commit的hash值 // 未與分支掛鈎
-
好處與風險
(1)好處:可以基於某個commit做任何修改,不滿意時,直接切換回之前分支即可;
(2)風險:分離頭指針狀態下所做修改如果不和任何分支掛鈎,日后切換分支時會被git清理掉,所做更改一並刪除;
注:分離頭狀態更改在切換分支后雖然扔存在一段時間,但是取回來相對麻煩,並且Git定時會清理不要的東西
-
思考:什么情況下可以使用分離頭指針?【待補充】
場景1:若想基於某個commit做變更,試試新的方案是否可行,就可以采用分離頭指針的方式。測試后發現不成熟,直接reset會其他分支即可。省卻了建、刪分支的繁復操作;
聲明:僅做學習記錄,交流使用~
學習資源請訪問:https://time.geekbang.org/