1. 程式人生 > 其它 >Git&Github

Git&Github

Git & GitHub

Git簡介

1.1 版本控制具備的功能

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

Git官網:https://git-scm.com/

1.2 Git優勢

  • 大部分操作在本地完成,不需要聯網
  • 完整性保證:對每次資料提交都會進行hash操作
  • 儘可能新增資料而不是刪除或修改資料
  • 分支操作非常快捷流暢
  • 與 Linux 命令全面相容

1.3本地庫和遠端庫互動方式

1.3.1 團隊內部協作

1.3.2 跨團隊協作

1.4 Git命令列操作

1.4.1 本地庫初始化 git init

  • 命令:git init
  • 效果:會在當前目錄下建立一個 .git的隱藏檔案.`

.git 目錄存放的是與本地庫相關的目錄和檔案,不要刪除

1.4.2 設定簽名 git config

作用:用來區分不同開發人員身份

辨析:這裡設定的簽名和登入遠端庫(Github)的賬號密碼沒有任何關係。

  • 命令:

    • 專案級別/倉庫級別:僅在當前本地庫有效
      git config user.name 設定的姓名 git config user.email 設定的email
    • 系統使用者級別:登入當前作業系統的使用者範圍
      git config --global user.name 設定的姓名 git config --global user.email 設定的email
      就近原則:專案級別優先於系統使用者級別,二者都有時用專案級別的簽名
  • 效果

  • 專案級別資訊儲存到.git下面的config檔案

  • 系統使用者級別資訊存放在~/.gitconfig

1.4.3 檢視檔案狀態 git status

  • 命令 :git status

1.4.4 新增 git add

流程:新建立的一個檔案,必須先要新增到暫存區,然後再提交到本地庫;然後可以push推送到遠端庫

  • git add [filename]
  • 將工作區“新建/修改”新增到暫存區

1.新建立一個檔案 git init初始化完成後

2.檢視檔案狀態:新建立的檔案沒有被追蹤

3.git add新增到暫存區後,在檢視檔案狀態 :已經被追蹤了

4.從暫存區移除檔案 git rm --cashed [filename] 檔案狀態又變成未追蹤

5.然後通過git add [filename]繼續提交

1.4.5 提交 git commit

  • 命令:git commit [filename]
  • 命令:git commit -m "給提交的命名" [filename] 常用

將hello.txt文件進行修改 檔案狀態發生改變 此時相當於你本地檔案發生改變了 但是快取區檔案未改變,所以不能直接git commit提交

使用git add將工作區檔案新增到暫存區,然後再用命令提交 或者 git commit -a 直接新增並提交,而不能直接git commit提交

git add後再提交 這種提交方式常用 直接命名提交

1.4.6 版本控制 git reset --hard

本質:就是通過移動歷史記錄中的HEAD指標,實現版本前進後退

檢視日誌:

  • 命令:git log 詳細顯示

  • 命令:git log --pretty=online 每條記錄資訊一行顯示

  • 命令: git reflog 常用 HEAD@{表示從當前版本移動到該版本需要移動步數}

1.4.6.1 基於索引值實現版本控制 [推薦]

命令:git reset --hard [區域性版本索引值] 可前進可後退

1.4.6.2 基於^符號實現版本控制

只能用於後退

  • 命令: git reset --hard HEAD^^^ 回退3步
    一個^符號退一次

1.4.6.3 基於~符號實現版本控制

  • 命令:git reset --hard HEAD~n 回退n步

1.4.6.4 reset命令三個引數對比

通過git reflog檢視本地庫變化;通過git status檢視暫存區的變化;通過本地檔案檢視工作區的變化;

初始上本地庫、暫存區和工作區是同一個版本

  • --soft引數:僅僅在本地庫移動HEAD指標;

    相當於你的本地庫屬新的版本,而暫存區和工作區都處於新的版本,所以對暫存區而言,相當於被修改的檔案經過了git add /git commit -a,但是沒有經過git commit提交

    如果執行git commit提交後,暫存區相當於會和本地庫位於同一個版本,但是工作區任然處於上一版本。

  • --mixed引數:1.在本地庫移動HEAD引數;2.重置暫存區;

    就相當於本地庫和暫存區屬於同一版本,工作區還停留在上一版本

  • --hard引數:1.在本地庫移動HEAD引數;2.重置暫存區;3.重置工作區;
    而--hard引數保證本地庫,暫存區和工作區版本保持一致;

git提交的記錄(不管建立/刪除檔案)永遠存在,即使你將本地檔案刪除;

1.5 找回本地已刪除的檔案

前提:建立的檔案已經完成提交,提交到了本地庫中;

操作:通過git reset --hard [指標指向檔案沒有刪除時候]

首先完成本地庫提交

然後刪除本地檔案

檢視狀態,將刪除狀態提交 只要檔案被修改,都需要git add重新提交

檢視日誌,存在兩個版本,一個是hello.txt存在提交的版本,另一個刪除hello.txt提交的版本

然後通過版本控制回退到上一版本

將檔案繼續刪除

1.6 比較檔案前後差異 git diff

命令:git diff [檔名] 將工作區檔案和暫存區檔案進行比較

命令:git diff [本地庫中歷史版本] 將工作區和歷史版本進行比較

不帶檔名比較多個檔案

比較:git diff [檔名] 工作區檔案和暫存區檔案進行比較

比較:git diff [本地庫中歷史版本] 將工作區和歷史版本進行比較

1.7 分支

概念:在版本控制過程中,使用多條線同時推進任務。

1.7.1 分支的優點:

1.同時並行推進多個功能開發,提高工作效率;

2.各個分支在開發過程中,如果某一個分支開發失敗,不會對其他分支有任何影響。失敗的分支刪除重新開始即可;

1.7.2 分支的相關命令

1.7.2.1 檢視當前所有分支 git branch -v

-v是比較詳細顯示

命令:git branch -v [推薦] 顯示全部分支

1.7.2.2 建立分支 git brach [分支名稱]

命令:git branch [分支名稱]

1.7.2.3 切換分支 git checkout [分支名稱]

命令:git checkout [分支名稱]

1.7.2.4 合併分支 git merge [待合併分支名稱]

首先將hot-fix分支檔案進行修改

命令:git merge [待合併分支名稱]

合併分支第一步:切換到接受修改的分支(被合併,增加新內容)上;常將其他分支合併到master,所以切換到master分支上;

合併分支第一步:執行分支合併命令

1.7.3 分支合併的問題

描述:兩個分支分別對同一個檔案的同一部位修改,然後將一個分支合併到另一個分支,就會產生衝突;

表現為:

解決方法:

  • 編輯檔案,刪除特殊符號,然後修改檔案至滿意;
  • git add
  • git commit -m [檔案資訊] 此時後面不能跟檔名,否則報錯;

1.8 Git原理

1.8.1 雜湊

雜湊是一個系列的加密演算法,各個不同的雜湊演算法雖然加密強度不同,但是有以下幾個共同點:

  • 不管輸入資料的資料量有多大,輸入同一個雜湊演算法,得到的加密結果長度固定。
  • 雜湊演算法確定,輸入資料確定,輸出資料能夠保證不變
  • 雜湊演算法確定,輸入資料有變化,輸出資料一定有變化,而且通常變化很大
  • 雜湊演算法不可逆

Git 底層採用的是 SHA-1 演算法。

雜湊演算法可以被用來驗證檔案。原理如下圖所示:

Git 把資料看作是小型檔案系統的一組快照。每次提交更新時 Git 都會對當前的全部檔案製作一個快照並儲存這個快照的索引。為了高效,如果檔案沒有修改,Git 不再重新儲存該檔案,而是隻保留一個連結指向之前儲存的檔案。所以 Git 的工作方式可以稱之為快照流。

每一個新版本會儲存一個快照資訊,快照資訊裡面包含了指向上一版本的資訊

git建立分支本質:建立一個指標,指向當前版本資訊;即圖中testing分支

切換到testing分支,對testing分支提交修改;

修改當前分支,也即是HEAD節點指向誰,誰就是當前分支;

git切換分支本質:相當於將HEAD節點指向當前分支的指標,即僅僅修改了HEAD指向;

  1. GitHub

2.1 團隊內部協作開發

2.1.1 專案經理建立本地庫和遠端庫

1.建立遠端庫

2.建立本地庫 本地庫與遠端庫可以不同名稱;

3.專案經理將檔案推送到Github

首先為遠端庫起一個快捷方式的別名

命令:git remote -v 檢視本地庫中遠端網址

命令:git remote add [別名] [對應遠端庫HTTPS網址]

命令:git push [遠端庫對應分支網址資訊] [本地分支名稱]

推送成功

2.1.2 程式設計師從遠端庫進行clone

命令:git clone [遠端庫克隆資訊]

克隆的作用:

  • 完整的把遠端庫下載到本地

  • 建立origin遠端地址別名

  • 初始化本地庫 不用人為初始化,就已經存在.git 檔案

2.1.3 專案經理邀請程式設計師加入團隊

程式設計師修改程式碼後推送到專案經理的遠端庫

將專案經理邀請連結傳送給程式設計師,程式設計師確認即可;https://github.com/wustjq/study/invitations

加入群組後,程式設計師再推送才會成功

程式設計師的程式碼推送到遠端庫後,專案經理還需要進行合併操作

程式設計師:

專案經理:

可以發現,兩者都可在遠端庫看見,但是本地檔案並沒有被修改。

我們一般不直接pull ,而是先fetch(必須先拉取,不然切換分支看不到的),再切換到遠端庫分支進行檢視,是否程式碼已修改好,確認後在merge合併到本地

2.1.4 專案經理合並程式碼

可發現合併後本地就顯示程式設計師修改程式碼

pull = fetch + merge

必須先拉取才能合併

命令:git fetch [遠端庫別名] [遠端分支名] 從遠端庫拉取

命令:git merge [遠端庫別名/遠端庫分支名] 合併

2.2 衝突問題

衝突問題:跟前面分支合併方式一樣,後修改的人需要先將程式碼拉取下來,在前人基礎上在進行修改;否後修改人直接修改會報錯

  • 如果不是基於GitHub遠端庫的最新版所作的修改,不能進行推送,必須先拉取到本地修改;
  • 拉取下來後如果進入衝突狀態,則按照1.7.3 分支合併解決分支衝突解決方法即可