創建本地倉庫:
????????創建 Git 本地倉庫
????????要提前說的是,倉庫是進行版本控制的?個文件目錄。我們要想對文件進行版本控制,就必須先創建?個倉庫出來。
? ? ? ? 首先touch 一個文件:
? ? ? ? 初始化倉庫:
? ? ? ? 創建完成后,我們會發現當前目錄會出現一個.git 文件
????????我們發現,當前目錄下多了?個 .git 的隱藏文件, .git 目錄是 Git 來跟蹤管理倉庫的,不要手動修改這個目錄里面的文件,不然改亂了,就把 Git 倉庫給破壞了。
配置 Git
????????當安裝 Git 后首先要做的事情是設置你的 用戶名稱 和 e-mail 地址,這是非常重要的。配置命令為:? ? ??
git config user.name "XX"
git config user.email "XXXXX"
# 把 Your Name 改成你的昵稱
# 把 email@example.com 改成郵箱的格式,只要格式正確即可。
查看配置命令為:
git config -l
如果這樣顯示則說明配置成功。?
刪除name 和email 的操作。?
git config --unset user.name
git config --unset user.email
在系統下并非只有一個git的倉庫,如果我們想讓每個倉庫都配置上我們設置的name 和 email 的話,就要使用 git config --global user.name/email 。
刪除對應的配置命令為:
git config [--global] --unset user.name
git config [--global] --unset user.email
工作區、暫存區、版本庫
????????工作區:是在電腦上你要寫代碼或文件的目錄。
? ? ? ? 暫存區:英文叫 stage 或 index。?般存放在?.git 目錄下的 index 文件(.git/index)中,我們
把暫存區有時也叫作索引(index)。
? ? ? ? 版本庫:又名倉庫,英文名??repository。工作區有?個隱藏?錄 .git ,它不算工作區,而
是 Git 的版本庫。這個版本庫里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git
都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
注意:我們不能手動修改 ".git" 文件下的任何文件。那么我們改如何管理我們的readme文件呢??
????????圖中左側為工作區,右側為版本庫。Git 的版本庫里存了很多東西,其中最重要的就是暫存區。
????????在創建Git版本庫時,Git會為我們自動創建?個唯?的 master 分支,以及指向 master 的?個指針叫 HEAD。
????????當對工作區修改(或新增)的文件執行?git add 命令時,暫存區目錄樹的文件索引會被更新(并沒有存對象,只存索引,所以是輕量級的)。同時修改的工作區內容會寫入對象庫的一個新的git對象中。
????????當執行提交操作 git commit 時,master 分支會做相應的更新,可以簡單理解為暫存區的目錄
樹才會被真正寫到版本庫中,這是git才對其進行了真正的管理。
? ? ? ? 由于這是我們新建的一個倉庫,沒有進行add操作?所以還沒有暫存區。
? ?我們能對工作區的 “readme” 文件進行直接的管理嗎,經過上述的解釋,只能通過 add commit 等操作之后,將readme 添加至版本庫,我們才能對其進行管理。
????????首先進行 add 操作 ,我們可以git add . 也可以git add readme ,前者是將工作區所有文件添加至暫存區,而后者則是將指定文件添加至暫存區。
? ? ? ? 之后進行commit 操作:將暫存區內容提交至本地倉庫(版本庫)。
? ? ? ? 我們可以發現git給我們維護的十分詳細。
????????如何查看我們提交的信息,使用 git log 或者 git log --pretty=oneline,區別在于是否一行打印出來。
? ? ? ? 其中每次提交都會生成commit id 來輕量化的記錄我們打印的信息。
查看 .git文件
先來看看我們的 .git 的?錄結構:
1. index 就是我們的暫存區,add 后的內容都是添加到這?的。
2. HEAD就是我們的默認指向 master 分支的指針:
3. objects 為 Git 的對象庫,里面包含了創建的各種版本庫對象及內容。當執行git add? 命令時,暫存區的?錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的?個新的對象中 ,就位于 ".git/objects" 目錄下。
????????HEAD里面存儲的是 ref: refs/heads/master 那么master 中是什么呢?我們可以通過打印出master來查看。
????????我們發現master里存放的是最近一次提交的commit id。
? ? ? ? ?注意:commit id 我們要分為前后兩部分來看,查找 object 時要將 commit id 分成2部分,其前2位是?件夾名稱,后38位是文件名稱。找到這個文件之后,?般不能直接看到里面是什么,該類文件是經過(安全哈希算法)加密過的文件,好在我們可以使用 git cat-file 命令來查看版本庫對象的內容
? ? ? ? ?其中在詳細的信息中我們可以發現有一行為tree ,打印tree的commit id 我們發現是我們進行提交的readme 文件以及其 commit id ,在對其commit id 進行打印我們會發現里面顯示出來我們修改的內容。
? ? ? ? 我們每一次對文件的修改,提交到本地倉庫后都會被git記錄下來。修改的工作區內容會寫入對象庫的一個新的git中。
????????添加文件:
????????如果我們創建了一個至多個文件但是只對其中的一個文件進行add commit 操作,那么僅僅這一個文件被放到本地倉庫了,要是想對余下的文件也讓其放到本地倉庫中,我們就需要對其余的文件進行“add” 或者 “add.” ,之后今天commit就能夠放到本地倉庫了。
????????Git 比其他版本控制系統設計得優秀,因為 Git 跟蹤并管理的是修改,而非文件。什么是修改?比如你新增了一行,這就是?個修改,刪除了一行,也是?個修改,更改了某些字符,也是?個修改,刪了?些又加了?些,也是?個修改,甚至創建?個新文件,也算?個修改。
? ? ? ? 我們對readme文件添加一行代碼。
????????此時,倉庫中的 readme 和我們?作區的 readme 是不同的,使用 git status 命令用于查看在你上次提交之后是否有對文件進行再次修改。
? ? ? ? 在一個項目中往往一次修改的代碼往往成千上萬行,此時我們想要查看工作區與本地倉庫之間的代碼我們就要使用 git diff XXX 命令 。
? ? ? ? 此時再進行add操作,然后查看狀態發現此時狀態已經改變。
? ? ? ? 當我們commit 之后,顯示如下。