1. 程式人生 > >Git基本概念與核心命令掌握

Git基本概念與核心命令掌握

一、GIT體系概述

GIT 與 svn 主要區別:

  1. 儲存方式不一樣
  2. 使用方式不一樣
  3. 管理模式不一樣

二、GIT 核心命令使用

主要內容:

  1. git 客戶端安裝配置
  2. 整體認識GIT的基本使用
  3. 分支管理
  4. 標籤管理
  5. 遠端倉庫配置

1、安裝git 客戶端安裝

官方客戶端: httpsd://git-scm.com/downloads

其它客戶端:https://tortoisegit.org/download/

 

2、認識GIT的基本使用

  1. git 專案建立與克隆
  2. 檔案提交與推送

完整模擬從專案新增到push 過程

  1.  建立專案
  1.  初始化git倉庫
  1.  提交檔案
  1. 遠端關聯
  1. push 至遠端倉庫

 

本地初始化GIT 倉庫:

#基於遠端倉庫克隆至本地

git clone <remote_url>

 

#當前目錄初始化為git 本地倉庫

git init  <directory>

 

基於mvn 模板建立專案

mvn archetype:generate

 

本地新增

#新增指定檔案至暫存區

git add <fileName>

#新增指定目錄至暫存區

git add <directory>

#新增所有

git add -A

#將指定目錄及子目錄移除出暫存區

git rm --cached target -r

#新增勿略配置檔案 .gitignore

本地提交

#提交至本地倉庫

git commit file -m '提交評論'

#快捷提交至本地倉庫

git commit -am '快新增與提交'

3、分支管理

#檢視當前分支

git branch [-avv]

#基於當前分支新建分支

git branch <branch name>

#基於提交新建分支

git branch <branch name> <commit id>

$ git branch -d {dev}

#切換分支

git checkout <branch name>

#合併分支

git merge <merge target>

#解決衝突,如果因衝突導致自動合併失敗,此時 status 為mergeing 狀態.

#需要手動修改後重新提交(commit) 

 

 

4、遠端倉庫管理

#檢視遠端配置 

git remote [-v]

#新增遠端地址

git remote add origin http:xxx.xxx

#刪除遠端地址

git remote remove origin 

#上傳新分支至遠端

git push --set-upstream origin master 

#將本地分支與遠端建立關聯

git branch --track --set-upstream-to=origin/test test

5、tag 管理

#檢視當前

git tag

#建立分支

git tag <tag name> <branch name>

#刪除分支

git tag -d <tag name>

 

6、日誌管理

 

#檢視當前分支下所有提交日誌

git log

#檢視當前分支下所有提交日誌

git log {branch}

# 單行顯示日誌

git log --oneline

# 比較兩個版本的區別

git log master..experiment

#以圖表的方式顯示提交合併網絡

git log --pretty=format:'%h %s' --graph

 

三、git 底層原理

  1. GIT儲存對像
  2. GIT樹對像
  3. GIT提交對像
  4. GIT引用

1、GIT儲存對像(hashMap)

Git 是一個內容定址檔案系統,其核心部分是一個簡單的鍵值對資料庫(key-value data store),你可以向資料庫中插入任意內容,它會返回一個用於取回該值的hash 鍵。

# git 鍵值庫中插入資料

echo 'luban is good man' | git hash-object -w --stdin

79362d07cf264f8078b489a47132afbc73f87b9a

#基於鍵獲取指定內容

git cat-file -p 79362d07cf264f8078b489a47132afbc73f87b9a

Git基於該功能 把每個檔案的版本中內容都儲存在資料庫中,當要進行版本回滾的時候就通過其中一個鍵將期取回並替換。

 

  1. 模擬演示git 版寫入與回滾過程

# 查詢所有的git 對像

  find .git/objects/ -type f

# 寫入版本1

echo 'version1' > README.MF; git hash-object -w README.MF;

# 寫入版本2

echo 'version2' > README.MF; git hash-object -w README.MF;

# 寫入版本3

echo 'version3' > README.MF; git hash-object -w README.MF;

# 回滾指定版本

git cat-file -p c11e96db44f7f3bc4c608aa7d7cd9ba4ab25066e > README.MF

 

所以我們平常用的 git add 其實就是把修改之後的內容 插入到鍵值庫中。當我們執行 git add README.MF 等同於執行了 git hash-object -w README.MF 把檔案寫到資料庫中。

 

我們解決了儲存的問題,但其只能儲存內容同並沒有儲存檔名,如果要進行回滾 怎麼知道哪個內容對應哪個檔案呢?接下要講的就是樹物件,它解決了檔名儲存的問題 。

2、GIT樹對像

樹對像解決了檔名的問題,它的目的將多個檔名組織在一起,其內包含多個檔名稱與其對應的Key和其它樹對像的用引用,可以理解成作業系統當中的資料夾,一個資料夾包含多個檔案和多個其它資料夾。

 

 

每一個分支當中都關聯了一個樹對像,他儲存了當前分支下所有的檔名及對應的 key.

通過以下命令即可檢視

#檢視分支樹

 git cat-file -p master^{tree}

 

3、git提交物件

一次提交即為當前版本的一個快照,該快照就是通過提交對像儲存,其儲存的內容為:一個頂級樹物件、上一次提交的對像啥希、提交者使用者名稱及郵箱、提交時間戳、提交評論。

 

$ git cat-file -p b2395925b5f1c12bf8cb9602f05fc8d580311836

tree 002adb8152f7cd49f400a0480ef2d4c09b060c07

parent 8be903f5e1046b851117a21cdc3c80bdcaf97570

author tommy <[email protected]> 1532959457 +0800

committer tommy <[email protected]> 1532959457 +0800

 

通過上面的知識,我們可以推測出從修改一個檔案到提交的過程總共生成了三個對像:

一個內容物件 ==> 儲存了檔案內容

一個樹對像 ==> 儲存了檔名及內容對像的key

一個提交對像 ==> 儲存了樹對像的key 及提交評論。

 

  1. 演示檔案提交過程

 

4、GIT引用

當我們執行 git branch {branchName} 時建立了一個分支,其本質就是在git 基於指定提交建立了一個引用檔案,儲存在 .git\refs\heads\ 下。

  1. 演示分支的建立

 git branch dev

 cat.git\refs\heads\dev

git 總共 有三種類型的引用:

  1. 分支引用
  2. 遠端分支引用
  3. 標籤引用

 

 

#查詢比較兩個版本

 git log master..experiment

 

#版本提交歷史網路

git log --pretty=format:'%h %s' --graph

 

#檢視分支樹

git cat-file -p master^{tree}