1. 程式人生 > 實用技巧 >Git安裝及基礎命令使用

Git安裝及基礎命令使用

一、版本控制系統

1.什麼是版本控制系統

記錄一個或多個變化的過程,以便隨時會到某個時間點
#功能:
1.記錄檔案的歷史變化
2.可以隨時回到任何一個時間點
3.多人協作開發

2.為什麼要用版本控制系統

版本控制是指在軟體開發過程中對各種程式程式碼、配置檔案及說明文件等檔案變更的管理,版本控制系統能夠隨著時間的推進記錄一系列檔案的變化,方便以後隨時回退到某個版本

3.版本併發控制型別

1)本地版本控制系統

平時開發不使用版本控制系統的情況下,我們習慣用複製整個專案目錄的方式來儲存不同的版本,或許還會改名加上備份時間以示區別。這種方式需要對專案頻繁進行復制,最終整個工作區會比較臃腫混亂且時間一長很難區分專案之間的差異。

為了解決這個問題,人們開發了本地版本控制系統,大多都是採用某種簡單的資料庫來記錄檔案的歷次更新差異。最流行的是RCS,它的工作原理是在硬碟上儲存補丁集(補丁指檔案修訂前後的變化),通過應用所有的補丁,可以重新計算出各個版本的檔案內容。

本地版本控制系統一定程度上解決了手動複製貼上程式碼的問題,但無法解決多人協作的問題。

2)集中式版本控制系統

集中式版本控制系統的出現是為了解決不同系統上的開發者協同開發,即多人協作的問題,主要有 CVS 和 SVN。集中式版本控制系統有一個單一的集中管理的中央伺服器,儲存所有檔案的修訂版本,由管理員管理和控制開發人員的許可權,而協同工作的人們通過客戶端連到中央伺服器,從伺服器上拉取最新的程式碼,在本地開發,開發完成再提交到中央伺服器。

#集中式版本控制系統有許多優點:
1.操作比較簡單,只需要拉取程式碼,開發,提交程式碼。
2.基本解決多人協作問題,每個人都可以從伺服器拉取最新程式碼瞭解夥伴的進度。
3.同時管理員可以輕鬆控制各開發者的許可權。
3.只需要維護中央伺服器上的資料庫即可。

#缺點也很明顯:
1.本地沒有全套程式碼,沒有版本資訊,提交更新都需聯網跟伺服器進行互動,對網路要求較高。
2.集中式的通病:風險較大,伺服器一旦宕機,所有人無法工作,伺服器磁碟一旦損壞,如果沒有備份將丟失所有資料。

3)分散式版本控制系統

分散式版本控制系統很好地解決了集中式版本控制系統的缺點。首先,在分散式版本控制系統中,系統儲存的不是檔案變化的差量,而是檔案的快照,即把檔案的整體複製下來儲存,其次,最重要的是分散式版本控制系統是去中心化的,當你從中央伺服器拉取下來程式碼時,拉取的是一個完整的版本庫,不僅僅是一份生硬的程式碼,還有歷史記錄,提交記錄等版本資訊,這樣即使某一臺機器宕機也能找到檔案的完整備份。

Git 是 Linux 發明者 Linus 開發的一款分散式版本控制系統,是目前最為流行和軟體開發者必須掌握的工具。

二、安裝git

1.環境準備

主機 IP 配置
git 10.0.0.80 3G記憶體

2.基本優化

#關閉selinux和防火牆
#時間同步
[root@git ~]# ntpdate time1.aliyun.com

3.安裝git

[root@git ~]# yum install -y git

[root@git ~]# git config
--global	use global config file			#使用全域性的配置檔案
--system	use system config file			#使用系統的配置檔案
--local		use repository config file		#使用版本庫的配置檔案

4.建立git的使用者

#配置使用者
[root@git ~]# git config --global user.name "lhd"
#配置使用者郵箱
[root@git ~]# git config --global user.email "[email protected]"
#顯示語法高亮
[root@git ~]# git config --global color.ui true

#檢視全域性配置
[root@git ~]# git config --list
user.name=lhd
[email protected]
color.ui=true
#生成了一個檔案
[root@git ~]# cat .gitconfig
[user]
	name = lhd
	email = [email protected]
[color]
	ui = true

5.初始化git

#初始化需要工作目錄
[root@git ~]# mkdir git_data

#初始化
[root@git ~]# cd git_data/
[root@git git_data]# git init .
Initialized empty Git repository in /root/git_data/.git/

#初始化會生成多個檔案
[root@git git_data]# ll .git/
total 12
drwxr-xr-x 2 root root   6 Sep 17 16:13 branches			#分支目錄
-rw-r--r-- 1 root root  92 Sep 17 16:13 config				#配置檔案
-rw-r--r-- 1 root root  73 Sep 17 16:13 description			#程式使用的檔案
-rw-r--r-- 1 root root  23 Sep 17 16:13 HEAD				#版本指標
drwxr-xr-x 2 root root 242 Sep 17 16:13 hooks				#鉤子檔案
drwxr-xr-x 2 root root  21 Sep 17 16:13 info				#排除檔案
drwxr-xr-x 4 root root  30 Sep 17 16:13 objects				#存放資料的子檔案
drwxr-xr-x 4 root root  31 Sep 17 16:13 refs				#資料指標

三、git介紹

1.git組成

1.工作區 (workspace)
	就是我們當前工作空間,也就是我們當前能在本地資料夾下面看到的檔案結構。初始化工作空間或者工作空間 clean 的時候,檔案內容和 index 暫存區是一致的,隨著修改,工作區檔案在沒有 add 到暫存區時候,工作區將和暫存區是不一致的。

2.暫存區 (index)
	老版本概念也叫 Cache 區,就是檔案暫時存放的地方,所有暫時存放在暫存區中的檔案將隨著一個 commit 一起提交到 local repository 此時 local repository 裡面檔案將完全被暫存區所取代。暫存區是 git 架構設計中非常重要和難理解的一部分。

3.本地倉庫 (local repository)
	git 是分散式版本控制系統,和其他版本控制系統不同的是他可以完全去中心化工作,你可以不用和中央伺服器 (remote server) 進行通訊,在本地即可進行全部離線操作,包括 log,history,commit,diff 等等。完成離線操作最核心是因為 git 有一個幾乎和遠端一樣的本地倉庫,所有本地離線操作都可以在本地完成,等需要的時候再和遠端服務進行互動。

4.遠端倉庫 (remote repository)
	中心化倉庫,所有人共享,本地倉庫會需要和遠端倉庫進行互動,也就能將其他所有人內容更新到本地倉庫把自己內容上傳分享給其他人。結構大體和本地倉庫一樣。

2.git的四種狀態

#檔案在不同的操作下可能處於不同的 git 生命週期

1.Untracked		#未跟蹤
	1)新建的檔案,還沒有被git管理過
	2)將檔案從git跟蹤管理中刪除,那麼readme處於unstacked狀態
	
2.Staged		#已暫存
	1)檔案已經使用git add提交到暫存區
	2)然後在對modifed狀態的檔案執行git add命令,那麼readme檔案又變成staged狀態

3.Unmodified	#未修改
	1)將處於staged狀態的檔案git commit到倉庫,那麼檔案處於unmodified狀態

4.Modified		#已修改
	1)如果當前檔案正處於unmodified狀態,然後修改工作區的檔案,那麼檔案變為modifed狀態

四、git基礎命令

1.檢視狀態

[root@git git_data]# git status
# On branch master				# 暫存區資料
#
# Initial commit				# 未跟蹤			
#
nothing to commit (create/copy files and use "git add" to track)

2.檔案操作

1)新建檔案

[root@git git_data]# touch {1,2,3}
[root@git git_data]# ll
total 0
-rw-r--r-- 1 root root 0 Sep 17 16:38 1
-rw-r--r-- 1 root root 0 Sep 17 16:38 2
-rw-r--r-- 1 root root 0 Sep 17 16:38 3

2)提交檔案

#提交檔案到暫存區
[root@git git_data]# git add 1
[root@git git_data]# git status

#提交所有工作區域的檔案
[root@git git_data]# git add .
[root@git git_data]# git status

#提交暫存區檔案到本地倉庫
git commit -m "提交註釋"

3)刪除檔案

1>將暫存區的檔案移除
[root@git git_data]# git rm --cache 1
rm '1'
[root@git git_data]# git status
2>刪除工作目錄的檔案
[root@git git_data]# rm -rf 1
[root@git git_data]# git status
3>同時刪除
#同時刪除暫存區和工作區的檔案
[root@git git_data]# git rm -f 2
rm '2'
[root@git git_data]# git status	

4)提交到倉庫

#將暫存區的檔案提交到倉庫
[root@git git_data]# git commit -m "add new file 3"
[master (root-commit) a4566ae] add new file 3
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 3
 
 -m		#註釋

#檢視狀態,沒有可提交的內容
[root@git git_data]# git status
# On branch master
nothing to commit, working directory clean

5)修改檔案

1>重新命名
#方式一:
1.本地重新命名
[root@git git_data]# mv 3 3.txt
[root@git git_data]# git status

2.從暫存區刪除檔案
[root@git git_data]# git rm --cached 3
rm '3'

3.再次提交檔案
[root@git git_data]# git add 3.txt
[root@git git_data]# git status

4.提交到本地倉庫
[root@git git_data]# git commit -m "rename 3.txt"
2>同時修改
1.同時修改暫存區和工作目錄的檔名字
[root@git git_data]# git mv 3.txt 3
[root@git git_data]# git status

2.提交本地倉庫
[root@git git_data]# git commit -m "rename 3 too"

6)對比檔案

git status 只能檢視區域的狀態的不同,不能檢視內容是否相同

git diff	#可以檢視檔案的不同

# 對比工作目錄和暫存區的檔案
[root@git git_data]# git diff 3
diff --git a/3 b/3
index 573541a..58c9bdf 100644
--- a/3
+++ b/3
@@ -1 +1 @@
-0
+111


# 對比本地倉庫和暫存區的資料
[root@git git_data]# git diff --cached 3
diff --git a/3 b/3
index 573541a..58c9bdf 100644
--- a/3
+++ b/3
@@ -1 +1 @@
-0
+111

3.提交歷史

當我們執行git commit後,發現程式碼錯了,需要回滾
git任何操作都相當於做快照,我們可以恢復到任意時刻

1)檢視歷史

[root@git git_data]# git log 
commit 43f49f38976593194516ab68228faaa09b746270
Author: lhd <[email protected]>
Date:   Thu Sep 17 17:09:21 2020 +0800

    modified 3

commit 90f573fa6524704cc3457cd3e3a1ccb24e5230ef
Author: lhd <[email protected]>
Date:   Thu Sep 17 16:58:06 2020 +0800

    rename 3 too

2)檢視簡單的歷史提交

[root@git git_data]# git log --oneline 
43f49f3 modified 3
90f573f rename 3 too
5d61056 rename 3.txt
a4566ae add new file 3

3)檢視當前分支

[root@git git_data]# git log --oneline --decorate
43f49f3 (HEAD, master) modified 3
90f573f rename 3 too
5d61056 rename 3.txt
a4566ae add new file 3

4)檢視提交的詳細資訊

[root@git git_data]# git log -p

5)顯示最近提交的資料

[root@git git_data]# git log --oneline  -2			# 只顯示兩行
43f49f3 modified 3
90f573f rename 3 too

6)恢復了歷史資料

1>暫存區資料取出至工作區
#從暫存區將資料取出
[root@git git_data]# git checkout -- 3
2>修改了工作區並且提交到了暫存區
# 回到上一次提交的節點(也就是本地倉庫退回暫存區)
[root@git git_data]# git reset HEAD 3
Unstaged changes after reset:
M	3

#從暫存區將資料取出(將暫存區資料取出至工作區)
[root@git git_data]# git checkout -- 3
[root@git git_data]# git diff 3
3>修改了工作區並且提交到了暫存區在提交到了本地倉庫
1.修改檔案並一路提交到本地倉庫
[root@git git_data]# echo 333 > 3
[root@git git_data]# git add 3
[root@git git_data]# git commit -m "錯誤的提交"
[master 3044a5a] 錯誤的提交
 1 file changed, 1 insertion(+), 1 deletion(-)
 
2.發現錯誤,想要回滾
#檢視提交歷史
[root@git git_data]# git log --oneline 
3044a5a 錯誤的提交
43f49f3 modified 3
90f573f rename 3 too
5d61056 rename 3.txt
a4566ae add new file 3

3.使用指標回到上一次提交的時間點
[root@git git_data]# git reset --hard 43f49f3
HEAD is now at 43f49f3 modified 3
[root@git git_data]# git log --oneline --decorate
43f49f3 (HEAD, master) modified 3
90f573f rename 3 too
5d61056 rename 3.txt
a4566ae add new file 3

4.發現回滾錯了,又看不到新提交的時間點
#檢視所有的經歷時間節點
[root@git git_data]# git reflog 
43f49f3 HEAD@{0}: reset: moving to 43f49f3
3044a5a HEAD@{1}: commit: 錯誤的提交
43f49f3 HEAD@{2}: commit: modified 3
90f573f HEAD@{3}: commit: rename 3 too
5d61056 HEAD@{4}: commit: rename 3.txt
a4566ae HEAD@{5}: commit (initial): add new file 3

5.回到回滾之前的時間點
[root@git git_data]# git reset --hard 3044a5a
HEAD is now at 3044a5a 錯誤的提交
[root@git git_data]# cat 3 
333