版本控制SoEasy之Git-01

Git是什麼?

Git是一種常用的版本控制系統,我們常見的版本控制系統有git和svn。 要知道怎麼使用首先要了解它的概念。

什麼是版本控制

版本控制是指對軟件開發過程中各種程序代碼、配置文件及說明文檔等文件變更的管理,是軟件配置管理的核心思想之一。

  • 實現跨區域多人協同開發
  • 追蹤和記載一個或者多個文件的歷史記錄
  • 組織和保護你的源代碼和文檔
  • 統計工作量
  • 並行開發、提高開發效率
  • 跟蹤記錄整個軟件的開發過程
  • 減輕開發人員的負擔,節省時間,同時降低人爲錯誤

Git常用術語

記住git的常用術語對後續理解git的基本操作有着至關重要的作用

  • 倉庫(Repository)
    受版本控制的所有文件修訂歷史的共享數據庫

  • 工作空間(WorkSpace)
    本地硬盤或Unix 用戶帳戶上編輯的文件副本

  • 工作樹/區(Working tree)
    工作區包含了倉庫的工作文件。您可以修改和提交更改然後提交到倉庫。

  • 暫存區(Staging area)
    暫存區是工作區提交之後的地方。
    git提交到本地版本庫的一個過程

  • 索引(index)
    索引是暫存區的另一種術語

  • 簽入(Checkin)
    將新版本簽入回倉庫

  • 簽出(checkout)

  • 從倉庫中將文件的最新修訂版本複製到工作空間

  • 提交(Commit)
    對各自文件的工作副本做了更改,並將這些更改提交到倉庫

  • 衝突(Conflict)
    多人對同一文件的工作副本進行更改,並將這些更改提交到倉庫

  • 合併(Merge)
    將某分支上的更改聯接到此主幹或同爲主幹的另一個分支

  • 分支(Branch)
    從主線上分離開的副本,默認分支叫master

  • 鎖(Lock)
    獲得修改文件的專有權限。

  • 頭(HEAD)
    頭是一個象徵性的參考,最常用以指向當前選擇的分支。

  • 修訂(Revision)
    表示代碼的一個版本狀態。Git通過用SHA1 hash算法表示的ID來標識不同的版本。

  • 標記(Tags)
    標記指的是某個分支某個特定時間點的狀態。通過標記,可以很方便的切換到標記時的狀態。

Git和SVN

SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而工作的時候,用的都是自己的電腦,所以首先要從中央服務器得到最新的版本,然後工作,完成工作後,需要把自己做完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工作,對網絡帶寬要求較高。
在這裏插入圖片描述
Git是分佈式版本控制系統,沒有中央服務器,每個人的電腦就是一個完整的版本庫,工作的時候不需要聯網了,因爲版本都在自己電腦上。協同的方法是這樣的:比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
在這裏插入圖片描述

GitBash常用命令

cd ~	回home

cd ..回退到上一個目錄,直接cd進入默認目錄

pwd:顯示當前所在目錄路徑

ls(ll): 都是列出當前目錄中的所有文件,只不過ll列出的內容更爲詳細

touch: 新建一個文件	

rm :刪除一個文件

mkdir:新建一個文件

rm -r :刪除一個文件夾,rm -r 	src刪除src目錄

mv :移動文件,mv index.

reset: 清屏

history: 查看命令歷史

help 幫助

exit 推出

#表示註釋

顯示文件內容 cat

Git常用命令

查看配置,可以查看現在git環境配置

git config -l

查看系統

config git config --system --list

查看當前用戶global的配置

git config --global --list

查看當前倉庫配置

git config --local --list

設置用戶名和郵箱

$ git config --global user.name "guogugo"  #名稱
$ git config --global user.email [email protected]   #郵箱

總之–global爲全局配置,不加則爲某個項目的特定配置。

添加配置項

git config [--local|--global|--system]  section.key value

[--local|--global|--system]  #可選的,對應本地,全局,系統不同級別的設置

section.key #區域下的鍵

value #對應的值

刪除配置項

git config [--local|--global|--system] --unset section.key

git 理論基礎

工作區域

Git本地有三個工作區域:工作目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)。如果在加上遠程的git倉庫(Remote Directory)就可以分爲四個工作區域。文件在這四個區域之間的轉換關係如下:
在這裏插入圖片描述

  • Workspace:工作區,就是你平時存放項目代碼的地方
  • Index / Stage:暫存區,用於臨時存放你的改動,事實上它只是一個文件,保存即將提交到文件列表信息
  • Repository:倉庫區(或本地倉庫),就是安全存放數據的位置,這裏面有你提交到所有版本的數據。其中HEAD指向最新放入倉庫的版本
  • Remote:遠程倉庫,託管代碼的服務器,可以簡單的認爲是你項目組中的一臺電腦用於遠程數據交換
    下面這張圖能更好的說明
    在這裏插入圖片描述
  • Directory:使用Git管理的一個目錄,也就是一個倉庫,包含我們的工作空間和Git的管理空間。
  • WorkSpace:需要通過Git進行版本控制的目錄和文件,這些目錄和文件組成了工作空間。
  • .git:存放Git管理信息的目錄,初始化倉庫的時候自動創建。
    Index/Stage:暫存區,或者叫待提交更新區,在提交進入repo之前,我們可以把所有的更新放在暫存區。
  • Local Repo:本地倉庫,一個存放在本地的版本庫;HEAD會只是當前的開發分支(branch)。
  • Stash:隱藏,是一個工作狀態保存棧,用於保存/恢復WorkSpace中的臨時狀態。

git 的工作流程

Git基本git的工作流程一般是這樣的:

  1. 在工作目錄中添加、修改文件;
  2. 將需要進行版本管理的文件放入暫存區域;
  3. 將暫存區域的文件提交到git倉庫。(這裏是本地倉庫)

因此,git管理的文件有三種狀態:已修改(modified),已暫存(staged),已提交(committed)操作
在這裏插入圖片描述
圖解教程
直接看圖理解本地git的提交過程
在這裏插入圖片描述

Git的基本操作

創建工作目錄與常用指令

工作目錄(WorkSpace)一般就是你希望Git幫助你管理的文件夾,可以是你項目的目錄,也可以是一個空目錄,建議不要有中文。

日常使用只要記住下圖6個命令:
在這裏插入圖片描述

獲得git倉庫

需要用GIT管理的項目的根目錄執行(注意自己當前目錄的位置):

# 在當前目錄新建一個Git代碼庫
$ git init

執行後項目目錄會多出一個.git文件夾,關於版本等信息都在這裏面,如果沒有看到可以百度怎麼查看隱藏文件

使用如下命令,可以把創建目錄與倉庫一起完成

# 新建一個目錄,將其初始化爲Git代碼庫
$ git init [project-name]

克隆遠程倉庫

另一種方式是克隆遠程目錄,由於是將遠程服務器上的倉庫完全鏡像一份至本地,而不是取某一個特定版本,所以用clone而不是checkout,語法格式如下:

# 克隆一個項目和它的整個代碼歷史(版本信息)
$ git clone [url]

注意url爲https…的地址

git 文件操作

版本控制就是對文件的版本控制,要對文件進行修改、提交等操作,首先要知道文件當前在什麼狀態,不然可能會提交了現在還不想提交的文件,或者要提交的文件沒提交上。GIT不關心文件兩個版本之間的具體差別,而是關心文件的整體是否有改變,若文件被改變,在添加提交時就生成文件新版本的快照,而判斷文件整體是否改變的方法就是用SHA-1算法計算文件的校驗和。

文件四種狀態

在這裏插入圖片描述

  • Untracked: 未跟蹤, 此文件在文件夾中, 但並沒有加入到git庫, 不參與版本控制. 通過git add 狀態變爲Staged.
  • Unmodify: 文件已經入庫, 未修改, 即版本庫中的文件快照內容與文件夾中完全一致. 這種類型的文件有兩種去處, 如果它被修改,
    而變爲Modified. 如果使用git rm移出版本庫, 則成爲Untracked文件
  • Modified: 文件已修改, 僅僅是修改, 並沒有進行其他的操作. 這個文件也有兩個去處, 通過git
    add可進入暫存staged狀態, 使用git checkout 則丟棄修改過, 返回到unmodify狀態, 這個git
    checkout即從庫中取出文件, 覆蓋當前修改
  • Staged: 暫存狀態. 執行git commit則將修改同步到庫中, 這時庫中的文件和本地文件又變爲一致,
    文件爲Unmodify狀態. 執行git reset HEAD filename取消暫存, 文件狀態爲Modified
    在這裏插入圖片描述

查看文件狀態

#查看指定文件狀態
git status [filename]

#查看所有文件狀態
git status

添加文件和目錄

在這裏插入圖片描述

  • 工作區(Working Directory)就是你在電腦裏能看到的目錄。
  • 版本庫(Repository)工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
  • Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。

將untracked狀態的文件添加到暫存區,語法格式如下:

# 添加指定文件到暫存區
$ git add [file1] [file2] ...

# 添加指定目錄到暫存區,包括子目錄
$ git add [dir]

# 添加當前目錄的所有文件到暫存區
$ git add .

移除文件與目錄

在這裏插入圖片描述

#直接從暫存區刪除文件,工作區則不做出改變
git rm --cached <file>
#如果已經用add 命令把文件加入stage了,就先需要從stage中撤銷
git reset HEAD <file>...

當執行 “git reset HEAD” 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。

#移除所有未跟蹤文件
#一般會加上參數-df,-d表示包含目錄,-f表示強制清除。
git clean [options] 
#只從stage中刪除,保留物理文件
git rm --cached readme.txt 

#不但從stage中刪除,同時刪除物理文件
git rm readme.txt 

#把a.txt改名爲b.txt
git mv a.txt b.txt
  • 當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master
    指向的目錄樹就是提交時暫存區的目錄樹。
  • 當執行 “git reset HEAD” 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。
  • 當執行 “git rm –cached ” 命令時,會直接從暫存區刪除文件,工作區則不做出改變。
  • 當執行 “git checkout .” 或者 “git checkout — ”
    命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。
  • 當執行 “git checkout HEAD .” 或者 “git checkout HEAD ” 命令時,會用 HEAD指向的 master分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因爲不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

查看文件修改後的差異

git diff用於顯示WorkSpace中的文件和暫存區文件的差異

#查看文件修改後的差異
git diff [files]

-a表示修改之前的文件,+++b表示修改後的文件

#比較暫存區的文件與之前已經提交過的文件
git diff --cached

也可以把WorkSpace中的狀態和repo中的狀態進行diff,命令如下:

#比較repo與工作空間中的文件差異
git diff HEAD~n

在這裏插入圖片描述

簽出

如果倉庫中已經存在文件f4.txt,在工作區中對f4修改了,如果想撤銷可以使用checkout,簽出覆蓋

檢出命令git checkout是git最常用的命令之一,同時也是一個很危險的命令,因爲這條命令會重寫工作區

語法:

#用法一
git checkout [-q] [<commit>] [--] <paths>...
#用法二
git checkout [<branch>]
#用法三
git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>]

在這裏插入圖片描述

$ git checkout branch
#檢出branch分支。要完成圖中的三個步驟,更新HEAD以指向branch分支,以及用branch  指向的樹更新暫存區和工作區。

$ git checkout
#彙總顯示工作區、暫存區與HEAD的差異。

$ git checkout HEAD
#同上

$ git checkout -- filename
#用暫存區中filename文件來覆蓋工作區中的filename文件。相當於取消自上次執行git add filename以來(如果執行過)的本地修改。

$ git checkout branch -- filename
#維持HEAD的指向不變。用branch所指向的提交中filename替換暫存區和工作區中相   應的文件。注意會將暫存區和工作區中的filename文件直接覆蓋。

$ git checkout -- . 或寫作 git checkout .
#注意git checkout 命令後的參數爲一個點(“.”)。這條命令最危險!會取消所有本地的  #修改(相對於暫存區)。相當於用暫存區的所有文件直接覆蓋本地文件,不給用戶任何確認的機會!

$ git checkout commit_id -- file_name
#如果不加commit_id,那麼git checkout -- file_name 表示恢復文件到本地版本庫中最新的狀態。

提交

通過add只是將文件或目錄添加到了index暫存區,使用commit可以實現將暫存區的文件提交到本地倉庫。

# 提交暫存區到倉庫區
$ git commit -m [message]

# 提交暫存區的指定文件到倉庫區
$ git commit [file1] [file2] ... -m [message]

# 提交工作區自上次commit之後的變化,直接到倉庫區,跳過了add,對新文件無效
$ git commit -a

# 提交時顯示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,幷包括指定文件的新變化
$ git commit --amend [file1] [file2] ...

修訂提交

如果我們提交過後發現有個文件改錯了,或者只是想修改提交說明,這時可以對相應文件做出修改,將修改過的文件通過"git add"添加到暫存區,然後執行以下命令:

# 修訂提交
git commit --amend

撤銷提交(commit)

原理就是放棄工作區和index的改動,同時HEAD指針指向前一個commit對象

#撤銷上一次的提交
git reset --hard HEAD~1

查看日誌與歷史

查看提交日誌可以使用git log指令,語法格式如下:

#查看提交日誌
git log [<options>] [<revision range>] [[\--] <path>…?]

撤銷暫存區跟新

使用"git add"把更新提交到了暫存區。這時"git status"的輸出中提示我們可以通過"git reset HEAD …"把暫存區的更新移出到WorkSpace中

撤銷本地庫更新

在Git中,有一個HEAD指針指向當前分支中最新的提交。當前版本,我們使用"HEAD",那麼再錢一個版本可以使用"HEAD",如果想回退到更早的提交,可以使用"HEAD~n"。(也就是,HEAD=HEAD1,HEAD^^=HEAD2)

優質參考

張果教你用git

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