git及github的原理及使用(一)

目錄

1、版本控制工具應具備的特點

2、版本控制工具分類

3、Git結構

4、代碼託管中心

5、本地庫和遠程庫的聯繫

6、安裝Git

7、基本命令操作

8、版本管理

9、分支

10、Git原理


1、版本控制工具應具備的特點

  • 協同修改:多人並行不悖的修改服務器端的同一個文件。
  • 數據備份:不僅保存目錄和文件的當前狀態,還能夠保存每一個提交過的歷史狀態。
  • 版本管理:在保存每一個版本的文件信息的時候要做到不保存重複數據,以節約存儲空間,提高運行效率。這方面 SVN 採用的是增量式管理的方式,而 Git 採取了文件系統快照的方式。
  • 權限控制:對團隊中參與開發的人員進行權限控制。對團隊外開發者貢獻的代碼進行審覈——Git 獨有。
  • 歷史記錄:查看修改人、修改時間、修改內容、日誌信息。將本地文件恢復到某一個歷史狀態。
  • 分支管理:允許開發團隊在工作過程中多條生產線同時推進任務,進一步提高效率

2、版本控制工具分類

  • 集中式版本控制工具:服務器一旦故障則歷史記錄全部丟失,用戶本地只有一份最終文件。例如 cvs,svn
  • 分佈式版本控制工具:用戶本地也是一個服務器,有完整的歷史記錄版本控制,可以和其他用戶之間進行數據的恢復。例如 Git,Mercurial

3、Git結構

先不看遠程服務器,只關注自己的本地電腦。git的使用過程如下:

4、代碼託管中心

  • git已經實現本地的版本控制
  • 代碼託管中心就是去維護遠程庫(遠程服務器,在上面也維護了一份代碼,開發者可以從其中拷貝到本地,也可以從本地推送到遠程服務器)
  • 局域網環境下:GitLab服務器(公司內部一般使用該服務器)
  • 外網環境下:GitHub(全世界的人可以在這上面共享項目,進行開源)

5、本地庫和遠程庫的聯繫

  • 團隊內部協作

遠程庫由 B 創建,此時B把A也加入團隊,則A就擁有了項目的權限。

 

  • 跨團隊協作

開發者C不是團隊成員,不能直接修改遠程庫代碼,則通過fork操作得到一個屬於C的遠程庫。那麼C修改了遠程庫後需要發起 pull request請求, 由B進行審覈並merge,把 C的遠程庫中修改的內容合併到 遠程庫B。

6、安裝Git

  • 下載對應的安裝包,如下圖所示。並安裝到一個非中文每空格的目錄下。

  • 安裝成功後可以在windows任何一個目錄下右鍵,選擇 Git Bash Here 進入命令窗口。如下圖所示

7、基本命令操作

鼠標右鍵-->Git Bash Here-->進入命令窗口-->通過命令開始使用Git(linux的命令在此處基礎都適用)

初始化本地庫 git init

操作步驟:創建文件夾gitTest,進入文件夾, 使用命令 git init 初始化本地庫。

產生結果:會生成一個 gitTest/.git 目錄,不要修改。

設置簽名 git config

簽名作用:區分開發者,在本地提交後通過查看日誌,可以看到開發人員的名稱和郵件。

項目級別簽名:僅在當前本地庫範圍內有效,信息保存在 ./.git/config 文件中。

設置方式:git config user.name Tom         git config user.email [email protected]

系統級別簽名:登錄當前操作系統的用戶範圍有效,信息保存在 ~/.gitconfig 文件中

設置方式:git config --global user.name Tom        git config --global user.email [email protected]

簽名級別優先級:項目級別優先於系統級別,不允許二則同時不存在

查看狀態 git status 查看工作區,暫存區的狀態
添加到暫存區 git add [fileName/*]

將工作區的 ‘新建/修改’ 添加到暫存區

git add * 表示添加所有改動的文件

添加操作回退 git rm --cached [fileName] 把未追蹤的文件添加到暫存區後的還原操作,文件重新恢復到未追蹤狀態
提交到本地庫 git commit

將暫存區的內容提交到本地庫

git commit  -m “msg” [fileName]   提交的時候附帶說明

git commit [fileName]  進入到vim編輯器去編寫提交說明

查看日誌  git log

控制方式: 空格-翻頁,b-向上翻頁,q-退出

最全的展示:git log

一行展示日誌:git log --pretty=oneline

一行展示日誌簡潔版: git log --oneline (會截取hash值展示)

下圖可以看到一整套操作過程:創建本地庫-->新建文件-->查看狀態-->添加到暫存區-->提交-->查看日誌

8、版本管理

  • 我們通過git reflog命令打印的日誌來理解版本

如下圖/表,每一次提交都會生成一個全局唯一hash值,對應到一個版本。有一個指針(HEAD) 通過移動來指向對應的版本。我們通過移動該指針可以控制版本的前進和回退,即可以進行文件的還原或恢復。

日誌的詳細情況
hash值的部分值 HEAD指針指向的位置 回到當前版本需要回退的步數 提交的日誌
5d80a53 (HEAD -> master) HEAD@{0}: commit: test2.txt第一次提交
a5eb47d   HEAD@{1}: commit: test1.txt追加內容def
56a073a   HEAD@{2}: commit: test1.txt追加內容abc
cd9ca2d   HEAD@{3}: commit (initial): test1.txt第一次提交
  • 前進後退操作
方法 命令 作用
基於索引值(hash值) git reset --hard [局部索引值] 回到某個版本
使用^符號 git reset --hard HEAD^ 只能後退,後退一步
使用~符號 git reset --hard HAED~n 只能後退,後退n步
  • reset命令的三個參數對比
--soft 僅在本地庫移動 HEAD 指針 不常用
--mixed

在本地庫移動 HEAD 指針

重置暫存區

不常用

--hard

在本地庫移動 HEAD 指針

重置暫存區

重置工作區

常用(可以通過其重置特性來恢復工作區被刪除的文件
  • 比較文件
git diff [filename] 和暫存區的文件比較

git diff  [本地庫中歷史版本] [filename]

 

和本地庫中的某個版本比較

例如: git diff  HEAD^  test.txt

            git diff 5d80a53 test.txt

不帶文件名比較多個文件  

9、分支

項目創建之初默認有一個主幹分支(master),但是多個版本無法同時在一個分支上並行開發。所以我們需要創建多個分支,來讓團隊並行開發,開發完成後分別再合併到主幹分支上。

  • 分支的操作
創建分支 git branch [分支名]  
查看分支 git branch -v  
切換分支

git checkout [分支名]

 
合併分支 git merge [有新內容的分支名] 例如上圖中:feature_blue分支開發完成後,我們切換到master分支,並執行命令 git merge feature_blue,把開發的內容合併到master主幹。
解決衝突  

合併後有的文件可能有衝突,需要我們手動修改文件。

然後添加到暫存區  git add [fileName]

最後提交  git commit -m "msg" ,注意commit 此時不能帶具體文件名

10、Git原理

  • 保證數據的完整性

保證通過網絡下載的文件跟服務器上一樣:Git利用哈希算法的特性,對服務器和本地同一個文件進行哈希,得到的結果一致則表示文件沒有丟失或損壞。

  • Git保存版本的機制

Git每次提交,都會對當前全部文件製作一個快照,並保存這個快照的索引。若相比較上個版本有改變的文件,在快照中則保存完整的文件,若沒有改變則保留一個指向文件的鏈接即可。

  • Git提交機制

每一次提交都會產生一個區塊

各個提交區塊之間則由父子關係連接成一條鏈路

類似於區塊鏈,通過對每個數據進行哈希,且把每次的哈希值都記錄到上層的區塊,再對上層區塊進行哈希.......依此類推。這樣只要任何一個地方數據有變動,其上層的所有數據的哈希值都會有變化,校驗機制就會檢測不通過。

  • Git分支管理機制

對於svn而言 ,創建一個分支,是直接把項目copy一份,顯得太笨重。

對於git而言,創建一個分支,只需要新增一個指針,詳情如下圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章