Git版本控制系統

1/28
Git版本控制系統
版本控制系統
功能:版本控制是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。
具體功能:記錄文件的所有歷史變化隨時可恢復到任何一個歷史狀態多人協作開發或修改錯誤恢復多功能
並行開發
版本控制系統分類
1、本地版本控制系統(Local VCS)
優點:只能單機使用
缺點:不能實現文件版本信息的資源共享
2、集中化版本控制系統(Centralized VCS)
常用軟件:SVN(以前軟件開發公司幾乎都用這款軟件)
優點:集中化管理文件數據的版本,方便、快捷。
缺點:工作在C/S模式下,C端必須跟S端聯網才能正常使用,即必須在線使用,不能離線使用
3、分佈式版本控制系統(Distributed VCS)
常用軟件: git 開發者:由linux內核的開發者林納斯.託瓦茲開發
優點:文件版本數據信息分佈存儲,支持離線使用。
版本控制系統基本概念
1、repository --- 倉庫。存放所有文件及其歷史信息
2、checkout --- 取出或切換到指定版本的文件
3、version --- 記錄標識一個版本(編號或其他代碼)
4、tag --- 標籤。記錄標識一個主要版本(1.0 2.0 3.0)

Git安裝
查:rpm -q git
安裝:yum install -y git
查所有文件列表:rpm -ql git
查配置文件列表:rpm -qc
git查git的man手冊:man git
版本控制系統介紹
版本控制系統
版本控制是一種記錄若干文件內容變化,以便將來查閱特定版本修訂情況的系統。大部分時候我們使用最
頻繁的還是對源代碼文件的版本控制,其實任何文件都可以納入版本控制系統。
1).更好備份:相比於將不同版本的文件以時間等命名存儲備份,使用版本控制系統能節約更多的磁盤空
間,因爲版本控制系統不是文件的複製備份,而是差異備份,文件快照備份等等。
2).更好的回溯:可以將某個文件回溯到之前的任何一個提交狀態,甚至將整個項目回退到過去的某個時間
點。
3).更好的團隊協作:這是最重要的,團隊共同開發一款軟件,如果沒有版本控制,那是不可想象的,簡單
點的可以使用文件傳輸到某一位核心開發者庫上進行合併,但如果團隊的成員是分散在全國各地的,甚至
2/28
是世界各地的,比如linux內核的開發,那完全是沒辦法進行的。使用版本控制後,可以比較文件的變化系
統,可以查詢是誰提交了新的更新,並且可以由項目負責人管理提交,進行更新的管理。
相比於svn, git有什麼優勢?
從不同的角度和不同的需求可能都會有不同的觀點,這裏也只能說明兩者的適用情景。
svn屬於集中化的版本控制系統:
有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的成員通過客戶端連接到這臺
服務器,進行文件上傳和更新。
優點:
a.使用簡單,比較符合我們的常規思維(我當年從SVN轉向Git也花費了不少時間)。
b.同步代碼比較簡單,只要一步操作即可。
缺點:
a.丟失數據的風險:最顯而易見的,由於集中化的特點,如果版本庫的服務器磁盤發生故障等,你不
能保證所有的數據已經有人提取出來了,最壞的情況是徹底的丟失整個項目的所有歷史更改記錄。
b.網絡中斷的情況下,協作就無法進行了,因爲無法連接服務器進行上傳和更新。
git屬於分佈式版本控制系統:
客戶端並不只提取最新版本的文件快照,而是把原始的代碼倉庫完整地鏡像下來。
優點:
a.由於任何人每次提取操作,實際上都是一次對代碼倉庫的完整備份,因此近乎所有的操作都可以在
本地執行,速度就是相當的快,並且可以在網絡斷開的時候操作仍然不受影響,可以頻繁的進行提

更新,等到有網絡的時候再上傳到遠程的鏡像倉庫就可以了。
b.文檔很詳細,並且命令行的提示也很到位,用起來比較得新應手,而且很多的設置與操作跟linux操
作很相近(不虧是linux之父創造的)。
c.git的分支模型,相當的輕量級,被稱爲“必殺技”。

缺點:
a.每個開發人員都擁有所有的代碼,不利於核心代碼的保密(如果有重要代碼需要保密,則不建議使
用git)
git的歷史
Linus在1991年創建了開源的Linux,從此,Linux系統不斷髮展,已經成爲最大的服務器系統軟件了。
Linus雖然創建了Linux,但Linux的壯大是靠全世界熱心的志願者參與的,這麼多人在世界各地爲Linux編
寫代碼,那Linux的代碼是如何管理的呢?
事實是,在2002年以前,世界各地的志願者把源代碼文件通過diff的方式發給Linus,然後由Linus本人通
過手工方式合併代碼!
你也許會想,爲什麼Linus不把Linux代碼放到版本控制系統裏呢?不是有CVS、SVN這些免費的版本控
制系統嗎?因爲Linus堅定地反對CVS和SVN,這些集中式的版本控制系統不但速度慢,而且必須聯網才能
使用。有一些商用的版本控制系統,雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。
不過,到了2002年,Linux系統已經發展了十年了,代碼庫之大讓Linus很難繼續通過手工方式管理了,
社區的弟兄們也對這種方式表達了強烈不滿,於是Linus選擇了一個商業的版本控制系統BitKeeper,
BitKeeper的東家BitMover公司出於人道主義精神,授權Linux社區免費使用這個版本控制系統。
安定團結的大好局面在2005年就被打破了,原因是Linux社區牛人聚集,不免沾染了一些梁山好漢的江
湖習氣。開發Samba的Andrew試圖破解BitKeeper的協議(這麼幹的其實也不只他一個),被BitMover公
司發現了(監控工作做得不錯!),於是BitMover公司怒了,要收回Linux社區的免費使用權。
3/28
Linus可以向BitMover公司道個歉,保證以後嚴格管教弟兄們,嗯,這是不可能的。實際情況是這樣的:
Linus花了兩週時間自己用C寫了一個分佈式版本控制系統,這就是Git!一個月之內,Linux系統的源碼已經
由Git管理了!牛是怎麼定義的呢?大家可以體會一下。
Git迅速成爲最流行的分佈式版本控制系統,尤其是2008年,GitHub網站上線了,它爲開源項目免費提
供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。
歷史就是這麼偶然,如果不是當年BitMover公司威脅Linux社區,可能現在我們就沒有免費而超級好用的
Git了。
集中式vs分佈式
Linus一直痛恨的CVS及SVN都是集中式的版本控制系統,而Git是分佈式版本控制系統,集中式和分佈式版
本控制系統有什麼區別呢?
先說集中式版本控制系統,版本庫是集中存放在中央服務器的,而幹活的時候,用的都是自己的電腦,所
以要先從中央服務器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央服務器。中央
服務器就好比是一個圖書館,你要改一本書,必須先從圖書館借出來,然後回到家自己改,改完了,再放
回圖書館。
集中式版本控制系統最大的毛病就是必須聯網才能工作,如果在局域網內還好,帶寬夠大,速度夠快,可
如果在互聯網上,遇到網速慢的話,可能提交一個10M的文件就需要5分鐘,這還不得把人給憋死啊。
那分佈式版本控制系統與集中式版本控制系統有何不同呢?首先,分佈式版本控制系統根本沒有“中央服務
器”,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯網了,因爲版本庫就在你
自己的電腦上。既然每個人電腦上都有一個完整的版本庫,那多個人如何協作呢?比方說你在自己電腦上
改了文件A,你的同事也在他的電腦上改了文件A,這時,你們倆之間只需把各自的修改推送給對方,就可
以互相看到對方的修改了。
和集中式版本控制系統相比,分佈式版本控制系統的安全性要高很多,因爲每個人電腦裏都有完整的版本
庫,某一個人的電腦壞掉了不要緊,隨便從其他人那裏複製一個就可以了。而集中式版本控制系統的中央
服務器要是出了問題,所有人都沒法幹活了。
在實際使用分佈式版本控制系統的時候,其實很少在兩人之間的電腦上推送版本庫的修改,因爲可能你們
4/28
倆不在一個局域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。因
此,分佈式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交
換”大家的修改,沒有它大家也一樣幹活,只是交換修改不方便而已。
當然,Git的優勢不單是不必聯網這麼簡單,後面我們還會看到Git極其強大的分支管理,把SVN等遠遠拋在
了後面。
CVS作爲最早的開源而且免費的集中式版本控制系統,直到現在還有不少人在用。由於CVS自身設計的問
題,會造成提交文件不完整,版本庫莫名其妙損壞的情況。同樣是開源而且免費的SVN修正了CVS的一些
穩定性問題,是目前用得最多的集中式版本庫控制系統。
除了免費的外,還有收費的集中式版本控制系統,比如IBM的ClearCase(以前是Rational公司的,被IBM收
購了),特點是安裝比Windows還大,運行比蝸牛還慢,能用ClearCase的一般是世界500強,他們有個共
同的特點是財大氣粗,或者人傻錢多。
微軟自己也有一個集中式版本控制系統叫VSS,集成在Visual Studio中。由於其反人類的設計,連微軟自己
都不好意思用了。
分佈式版本控制系統除了Git以及促使Git誕生的BitKeeper外,還有類似Git的Mercurial和Bazaar等。這些分
布式版本控制系統各有特點,但最快、最簡單也最流行的依然是Git!
git概念
5/28
工作區
版本庫
暫存區
HEAD
版本號
版本日誌

工作區(Working Directory):
存放git版本倉庫的目錄就是工作區
版本庫(Repository):
工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
暫存區:
Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動
創建的第一個分支master,以及指向master的一個指針叫HEAD。
HEAD:
你的本地倉庫由 git 維護的三棵“樹”組成。
第一個是你的 工作目錄,它持有實際文件;
第二個是 緩存區(Index),它像個緩存區域,臨時保存你的改動;
第三個HEAD,指向你最近一次提交後的結果。
6/28
添加修改到暫存區:
創建兩個文件add到stage:
 #git add 文件名 
 或者
 #git add *
從stage提交到當前master分支的HEAD:
#git commit -m “版本描述信息” //提交暫存區裏的修改到版本庫的分支
7/28
Git跟蹤並管理的是修改,而非文件:
什麼是修改?比如你新增了一行,這就是一個修改,刪除了一行,也是一個修改,更改了某些字符,也是
一個修改,刪了一些又加了一些,也是一個修改,甚至創建一個新文件,也算一個修改。
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
每次修改,如果不add到暫存區,那就不會加入到commit中。
實驗(本實驗要學過基本操作後再做):
1.現有源文件:
[root@vm20 gittest]# cat a.txt 
friday
monday
2.第一次修改:添加一行tuesday
[root@vm20 gittest]# cat a.txt 
friday
monday
tuesday
3.執行add:
[root@vm20 gittest]# git add a.txt
4.第二次修改:添加一行wednesday
[root@vm20 gittest]# cat a.txt
friday
monday
tuesday
wednesday
5.不做add,直接提交:
[root@vm20 gittest]# git commit -m "看看第二次修改有沒有被commit"
[master 0e14810] 看看第二次修改有沒有被commit
 1 file changed, 1 insertion(+)
[root@vm20 gittest]# git status
# 位於分支 master
# 尚未暫存以備提交的變更:
8/28
# (使用 "git add <file>..." 更新要提交的內容)
# (使用 "git checkout -- <file>..." 丟棄工作區的改動)
#
# 修改: a.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
注意:如果第二修改也被add了不會出現上面的提示
6.查看當前版本和a.txt文件內容的區別(有輸出內容,說明現在版本庫和文件a.txt內容有區別,也就是第
二次修改並沒有被提交):
[root@vm20 gittest]# git diff HEAD -- a.txt
diff --git a/a.txt b/a.txt
index 1091166..adfd1e9 100644
--- a/a.txt
+++ b/a.txt
@@ -1,3 +1,4 @@
 friday
 monday
 tuesday
+wednesday
7.再次add後,發現工作區乾淨了,而且當前版本庫HEAD和a.txt沒有任何區別了:
 [root@vm20 gittest]# git add a.txt
 [root@vm20 gittest]# git commit -m "再看第二次修改有沒有被commit"
 [master fe18903] 再看第二次修改有沒有被commit
 1 file changed, 1 insertion(+)

 [root@vm20 gittest]# git status
 # 位於分支 master
 無文件要提交,乾淨的工作區

 [root@vm20 gittest]# git diff HEAD -- a.txt
 [root@vm20 gittest]# 

版本號:
也就是commit id,和SVN不一樣,Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出
來的一個非常大的數字,用十六進制表示。爲什麼commit id需要用這麼一大串數字表示呢?因爲Git是分
布式的版本控制系統,如果多人在同一個版本庫裏工作,如果大家都用1,2,3……作爲版本號,那肯定就
衝突了。
查看版本號:
版本號可以通過版本日誌查看

版本日誌:
commit完成的功能類似快照,可以使用git log查看每次的commit記錄
[root@vm20 gittest]# git log
commit fbecfa3d04ae5038aa11bf55942e46c840077ace
Author: [email protected] <tom>
Date: Fri Sep 29 02:20:51 2017 -0400
add haha
9/28
commit 7e99d947e4878029edb3bf7f32e5dcc4c785e765
Author: [email protected] <tom>
Date: Fri Sep 29 00:01:50 2017 -0400
添加hello一行
commit addd750a13477d215cc75f4634aae0a686133e90
Author: [email protected] <tom>
Date: Thu Sep 28 23:15:25 2017 -0400
test
顯示分支:
[root@vm20 gittest]# git log --graph
單行方式顯示:
[root@vm20 gittest]# git log --pretty=oneline
fbecfa3d04ae5038aa11bf55942e46c840077ace add haha
7e99d947e4878029edb3bf7f32e5dcc4c785e765 添加hello一行
addd750a13477d215cc75f4634aae0a686133e90 test
[root@vm20 gittest]# git log --graph

創建版本庫
版本庫:
又名倉庫,英文名repository,可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起
來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還
原”.
1.創建一個空目錄:在vm20上創建
[root@vm20 /]# mkdir gittest
[root@vm20 /]# cd gittest/
2.通過git init命令把這個目錄變成Git可以管理的倉庫:
方式1.創建本地庫:
這樣創建的庫其他機器可以clone,但是沒辦法push
10/28
[root@vm20 gittest]# git init
初始化空的 Git 版本庫於 /gittest/.git/
創建完成後查看庫目錄:
[root@vm20 gittest]# ls -a
. .. .git
方式2.創建裸庫: 適用與作爲遠程中心倉庫使用
創建裸庫纔可以從別處push代碼過來,使用--bare參數
[root@vm20 gittest2]# git init --bare
初始化空的 Git 版本庫於 /gittest2/
默認會把當前所在目錄做成庫目錄,可以在命令後面跟目錄指定子目錄爲版本庫

git init --bare 庫名字

裸庫創建完成後查看庫目錄:
[root@vm20 gittest2]# ls
branches config description HEAD hooks info objects refs
注:不一定必須在空目錄下創建Git倉庫,選擇一個已經有東西的目錄也是可以的
添加文件到版本庫
所有版本控制系統,其實只能跟蹤文本文件的改動,比如TXT文件,網頁,所有的程序代碼等等,Git也
不例外。版本控制系統可以告訴你每次的改動,比如在第5行加了一個單詞“Linux”,在第8行刪了一個單
詞“Windows”。而圖片、視頻這些二進制文件,雖然也能由版本控制系統管理,但沒法跟蹤文件的變化,
只能把二進制文件每次改動串起來,也就是隻知道圖片從100KB改成了120KB,但到底改了啥,版本控制
系統不知道,也沒法知道。
Microsoft的Word格式是二進制格式,因此,版本控制系統是沒法跟蹤Word文件的改動的,如果要真正
使用版本控制系統,就要以純文本方式編寫文件。

強烈建議使用標準的UTF-8編碼,所有語言使用同一種編碼,既沒有衝突,又被所有平臺所支持。
3.在gittest目錄下創建一個測試文件readme.txt
[root@vm20 gittest]# cat readme.txt
Git is a version control system.
Git is free software.
4.把文件添加到暫存區:使用 "git add" 建立跟蹤
[root@vm20 gittest]# git add readme.txt
使用#git status可以查看狀態
使用#git rm --cached readme.txt可以刪除文件跟蹤,但是不可以回退文件內容的修改,建議使用下一
節講到的撤銷修改

5.提交文件到倉庫分支:
[root@vm20 gittest]# git commit -m "test"
[master(根提交) addd750] test
1 file changed, 2 insertions(+)
create mode 100644 readme.txt

-m 本次提交的說明
11/28
6.查看git狀態:
[root@vm20 gittest]# git status

位於分支 master

無文件要提交,乾淨的工作區
修改文件後再此查看狀態:
[root@vm20 gittest]# echo hello >> readme.txt

[root@vm20 gittest]# git status

位於分支 master

尚未暫存以備提交的變更:

(使用 "git add <file>..." 更新要提交的內容)

(使用 "git checkout -- <file>..." 丟棄工作區的改動)

#

修改: readme.txt

#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
查看修改了什麼內容:
[root@vm20 gittest]# git diff
diff --git a/readme.txt b/readme.txt
index 795d143..57083df 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
Git is a version control system.
Git is free software.
+hello
再次提交可以先add再commit,也可以使用-a和commit一起:
[root@vm20 gittest]# git commit -a -m "添加hello一行"
[master 7e99d94] 添加hello一行
1 file changed, 1 insertion(+)

[root@vm20 gittest]# git status

位於分支 master

無文件要提交,乾淨的工作區
撤銷修改
撤銷修改
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命
令git reset HEAD file,
就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,使用版本回退,不過前提是沒有推送到
遠程庫。(見下節)
場景1: 源文件添加了一行thursday,還沒有add到stage(前提:之前提交過此文件)
[root@vm20 gittest]# cat a.txt
12/28
wednesday
thursday
撤銷剛纔的修改:
[root@vm20 gittest]# git checkout -- a.txt
[root@vm20 gittest]# cat a.txt
wednesday
場景2:源文件添加了一行thursday,並且add到了stage(前提:之前提交過此文件)
[root@vm20 gittest]# cat a.txt
wednesday
thursday
[root@vm20 gittest]# git add a.txt
[root@vm20 gittest]# git status

位於分支 master

要提交的變更:

(使用 "git reset HEAD <file>..." 撤出暫存區)

#

修改: a.txt

#
[root@vm20 gittest]# git reset HEAD a.txt
重置後撤出暫存區的變更:
M a.txt
[root@vm20 gittest]# cat a.txt
wednesday
thursday
[root@vm20 gittest]# git checkout -- a.txt
[root@vm20 gittest]# cat a.txt
wednesday



版本回退
場景3:已經提交到版本庫
13/28
查看現在的版本:
[root@ansible gittest]# git log
commit 898a61cb50da77daeda51453bef38c98fecd46a0
Author: wing <[email protected]>
Date: Sun Feb 25 18:04:27 2018 +0800
 test1
commit d75411fb17e661cefc1900a09c8a784e8aa0d79a
Author: wing <[email protected]>
Date: Sun Feb 25 17:56:45 2018 +0800
 test1
版本回退(切換):
在Git中,上一個版本就HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數
不過來,所以寫成HEAD~100
回到上一個版本:
[root@vm20 gittest]# git reset --hard HEAD^
HEAD 現在位於 83f6e8d Signed-off-by: [email protected] <tom>
回到指定的版本(根據版本號): 
[root@vm20 gittest]#git reset --hard 6fe5b9a2 

消失的ID號:
回到早期的版本後再查看git log會發現最近的版本消失,可以使用reflog查看消失的版本ID,用於回退到消
失的版本
[root@vm20 gittest]# git reflog 
32c31f5 HEAD@{0}: reset: moving to 32c31f54c1
6fe5b9a HEAD@{1}: reset: moving to 6fe5b9a2
928ab9e HEAD@{2}: reset: moving to HEAD^^
83f6e8d HEAD@{3}: reset: moving to HEAD^
6fe5b9a HEAD@{5}: commit: 這個能寫中文
83f6e8d HEAD@{6}: commit: Signed-off-by: [email protected] <tom>
32c31f5 HEAD@{7}: commit: add a line monday
928ab9e HEAD@{8}: commit (amend): this is a new file test
bee2ba0 HEAD@{9}: commit: this is a new file test
c8e6b87 HEAD@{10}: commit: 添了兩個
fbecfa3 HEAD@{11}: commit: add haha
7e99d94 HEAD@{12}: commit: 添加hello一行
addd750 HEAD@{13}: commit (initial): test
Git的版本回退速度非常快,因爲Git在內部有個指向當前版本的HEAD指針,當你回退版本的時候,Git僅僅
是把HEAD從指向
append GPL:
14/28
git-head
改爲指向add distributed:
git-head-move
然後順便把工作區的文件更新了。所以你讓HEAD指向哪個版本號,你就把當前版本定位在哪。 
刪除文件
刪除文件:
從工作區刪除a.txt,並且從版本庫一起刪除
[root@vm20 gittest]# rm -rf a.txt
[root@vm20 gittest]# git status
# 位於分支 master
# 尚未暫存以備提交的變更:
# (使用 "git add/rm <file>..." 更新要提交的內容)
# (使用 "git checkout -- <file>..." 丟棄工作區的改動)
#
# 刪除: a.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@vm20 gittest]# git rm a.txt
rm 'a.txt'
[root@vm20 gittest]# git commit -m "刪除文件a.txt"
[master 4bb90a4] 刪除文件a.txt
 1 file changed, 4 deletions(-)
 delete mode 100644 a.txt
[root@vm20 gittest]# git status
# 位於分支 master
無文件要提交,乾淨的工作區
刪除了文件readme.txt之後又後悔了,恢復回來
[root@vm20 gittest]# ls
readme.txt
[root@vm20 gittest]# rm -rf readme.txt 
[root@vm20 gittest]# git checkout -- readme.txt
[root@vm20 gittest]# ls
readme.txt
15/28
Git遠程倉庫
Git遠程倉庫
Git遠程倉庫實際就是保存在服務器上的git倉庫文件
http協議:只支持下載,不支持上傳
ssh協議:支持上傳和下載,採用ssh認證
git協議:支持上傳下載,效率高
Git基礎 Git安裝完成之後,需要進行一些基本信息設置
 1、設置用戶名git config --global user.name "flyer“設置用戶郵箱
 2、git config --global user.email [email protected]
 3、查看設置git config --list
初始化一個新的git倉庫
 創建一個文件夾(或使用已有文件夾)mkdir /flyer在文件夾內初始化git,創建git倉庫cd /flyergit initls -
a 發現多了一個.git目錄,即初始化成功

Git checkout取所需的版本
git log 查看版本日誌,複製其中的commit的MD5值的左邊6個字符
git checkout 粘貼第1版本的commit的MD5值c
at hosts 發現內容爲第1個版本的
git log 查看當前狀態以前的的日誌
git reflog 查看參考日誌(即所有日誌)
cat .git/logs/HEAD 查看所有日誌
git checkout 用第2版的commit的MD5值cat hosts
 git的本地使用
mkdir -pv /jim ; cd /jim
git init
cp -av /etc/host* /jim/
git status
git add *
git status
git tag v001
git commit -m "desc:host files v1." 
git log 或 git reflog
rm -rfv hosts*
git status
git commit -a -m "desc:host files v2." 
cp -av /etc/{passwd,group} /jim/
git add *
git commit -m "desc:add passwd group v3." 
git log 請複製v1版的commit值的前6個字符
 ls
git checkout 請粘貼v1版的commit值的前6個字符
Git刪除文件
1、本地刪除文件rm README
2、從git中刪除文件 文件依然記錄在git倉庫歷史中git rm README
16/28
3、提交操作git commit -m "delete README"
測試:cd /mydocgit statusrm hostsgit rm hostsgit commit -m 'del hosts'git status git 
log 查看當前日誌; git reflog 查看所有日誌
碼雲平臺使用
在linux或windows系統中安裝git軟件註冊“碼雲”平臺賬號。官網:http://git.oschina.net/登錄github賬
號:在“碼雲”平臺創建網絡倉庫(也稱爲項目)
cd /opt
git clone https://gitee.com/rshare/jin0312.git
ls 
cd jin0312
ls -a
cp -v /etc/host* ./
git status
git add *
git commit -m ‘host* file v1.‘
git status
git log
git push輸入碼雲平臺的用戶賬號 rshare輸入密碼 ****自動上傳數據到碼雲平臺的倉庫中
17/28
使用“碼雲“github”平臺
安裝git軟件註冊“碼雲”平臺賬號。
官網:http://git.oschina.net/登錄github賬號:在“碼雲”平臺創建網絡倉庫(也稱爲項目)Linux創建ssh
密鑰,並複製公鑰到“碼雲”平臺個人賬號中。(僅用於push更新網絡倉庫數據時驗證身份)測試ssh身份驗證
是否成功同步github倉庫數據到本地: 
git clone [email protected]:rshare/conf.git
用git命令添加add、提交commit文件
用git push origin master上傳更新網絡github數據在“碼雲”平臺查看是否有新數據用git刪除文件
實例:rshare個人github同步數據實戰。
git環境準備:yum install -y git
git config --help
git config --global user.name "sky" //用戶信息
git config --global user.mail "[email protected]" 
//用戶郵箱第1步,登錄github:
1、註冊Github賬號,網站:https://github.com 我的賬號:rshare 密碼:pass000
2、Linux創建SSH密鑰:
方法一:非交互式生成密鑰:ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa -C "[email protected]" cat 
~/.ssh/id_rsa.pub //提交密鑰,複製裏面的密鑰(第3步要粘貼)說明:ssh-keygen是ssh密鑰生成器,-t指
定算法爲rsa,-N指定密碼爲空,-f指定私鑰位置,-C指定註釋信息(不指定則爲主機名)。
3、將公鑰加入到Github賬戶信息Account Settings->SSH Key方法:登錄到github網頁中登陸自己的賬
號,然後再account setting中,找到SSH KEY講複製的密鑰加入(需要再次輸入github的密碼)
4、測試驗證是否成功。ssh -T [email protected] 提示successfully說明成功Hi someone! You've 
successfully authenticated, but GitHub does not provide shell access. 
 ##同步github到本地
 1、複製項目到本地:mkdir /testcd /testgit clone [email protected]:rshare/mydocker.git ##以SSH方
式克隆到本地,可以讀寫 git clone https://github.com/rshare/docker-installer.git ##以https方式克隆
到本地,可以讀寫 ls 查看文件列表
 2、創建新文件,並上傳到github中。
 cd /test/mydocker
 ls -a
 git remote
 cp -v /etc/{hosts,group,passwd} ./
 git add hosts group passwd
 git status
 git commit -m '3files'
 git push -u origin master
驗證:在github個人網站的mydocker倉庫中查看是否多了三個文件(hosts,group,passwd)。git其他命
令:git branch #查看分支(即目錄結構) 
 3、刪除遠程倉庫中的文件。cd /test/mydocker
 ls -a
 git rm --cached hosts group passwd #刪除緩存數據,並不刪除本地文件
 git status
 git commit -m "hehe"
 git push origin 驗證:在github個人網站的mydocker倉庫中查看是否少了三個文件
(hosts,group,passwd)。
18/28
在同步過來的sample倉庫執行
cd
git clone [email protected]:/srv/sample.git
ls
cd sample
mkdir conf
cp -v /etc/*.conf conf/
git status
git add conf
git commit -m 'conf bak'
git remote -v
git branch
git push origin master
驗證數據:
mkdir /a
cd /a
git clone [email protected]:/srv/sample.git
ls 發現有sample目錄說明數據同步成功
cd sample
ls -R ./ 發現有conf目錄,說明git服務器上的數據已經更新了。
github數據驗證
驗證數據:
mkdir /a
cd /a
19/28
git clone [email protected]:/srv/sample.git
ls 發現有sample目錄說明數據同步成功
cd sample
ls -R ./ 發現有conf目錄,說明git服務器上的數據已經更新了。
下面開始實戰。
首先,我們創建dev分支,然後切換到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout命令加上-b參數表示創建並切換,相當於以下兩條命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然後,用git branch命令查看當前分支:
$ git branch
* dev 
master
然後提交:
$ git add readme.txt 
$ git commit -m "branch test"[dev fec145a] branch test 
1 file changed, 1 insertion(+)
現在,dev分支的工作完成,我們就可以切換回master分支:
$ git checkout master
Switched to branch 'master'
切換回master分支後,再查看一個readme.txt文件,剛纔添加的內容不見了!因爲那個提交是在dev分支
上,而master分支此刻的提交點並沒有變:
現在,我們把dev分支的工作成果合併到master分支上:
$ git merge dev
Updating d17efd8..fec145a
Fast-forward 
readme.txt | 1 + 
1 file changed, 1 insertion(+)
git merge命令用於合併指定分支到當前分支。合併後,再查看readme.txt的內容,就可以看到,和dev分
支的最新提交是完全一樣的。
注意到上面的Fast-forward信息,Git告訴我們,這次合併是“快進模式”,也就是直接把master指向dev的當
前提交,所以合併速度非常快。
當然,也不是每次合併都能Fast-forward,我們後面會講其他方式的合併。
20/28
合併完成後,就可以放心地刪除dev分支了:
$ git branch -d dev
Deleted branch dev (was fec145a).
刪除後,查看branch,就只剩下master分支了:
$ git branch
* master
添加遠程倉庫
現在的情景是,你已經在本地創建了一個Git倉庫後,又想在GitHub創建一個Git倉庫,並且讓這兩個倉庫進
行遠程同步,這樣,GitHub上的倉庫既可以作爲備份,又可以讓其他人通過該倉庫來協作,真是一舉多
得。
首先,登陸GitHub,然後,在右上角找到“Create a new repo”按鈕,創建一個新的倉庫:
在Repository name填入learngit,其他保持默認設置,點擊“Create repository”按鈕,就成功地創建了一個
新的Git倉庫:
21/28
目前,在GitHub上的這個learngit倉庫還是空的,GitHub告訴我們,可以從這個倉庫克隆出新的倉庫,也可
以把一個已有的本地倉庫與之關聯,然後,把本地倉庫的內容推送到GitHub倉庫。
現在,在本地的gittest倉庫下運行命令:換掉用戶名
[root@ansible gittest]# git remote add origin https://github.com/yanqiang20172017/test1.git
origin 遠程庫的名字,是Git默認的叫法,也可以改成別的
下一步,就可以把本地庫的所有內容推送到遠程庫上:
[root@ansible gittest]# git push -u origin master
Username for 'https://github.com': yanqiang20172017
Password for 'https://[email protected]': 
Counting objects: 3, done.
Writing objects: 100% (3/3), 202 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/yanqiang20172017/test1.git
 * [new branch] master -> master
分支 master 設置爲跟蹤來自 origin 的遠程分支 master。
把本地庫的內容推送到遠程,用git push命令,實際上是把當前分支master推送到遠程。
-u 我們第一次推送master分支時,Git不但會把本地的master分支內容推送的遠程新的master分支,還會
把本地的master分支和遠程的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。
查看遠程add的庫:
[root@ansible gittest]# git remote -v
刪除遠程add:
[root@ansible gittest]# git remote remove haha
推送成功後,可以立刻在GitHub頁面中看到遠程庫的內容已經和本地一模一樣:
從現在起,只要本地作了提交,就可以通過命令:
# git push origin master
22/28
把本地master分支的最新修改推送至GitHub
部署遠程倉庫
遠程倉庫實際上和本地倉庫沒啥不同,純粹爲了7x24小時開機並交換大家的修改。
GitHub就是一個免費託管開源代碼的遠程倉庫。但是對於某些視源代碼如生命的商業公司來說,既不想公
開源代碼,又捨不得給GitHub交保護費,那就只能自己搭建一臺Git服務器作爲私有倉庫使用。
搭建Git服務器需要準備一臺運行Linux的機器
第一步,安裝git:
#yum install git
第二步,創建一個git用戶,用來運行git服務:
#adduser git
第三步,創建證書登錄:
收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導入到/home/git/.ssh/
authorized_keys文件裏,一行一個。
第四步,初始化Git倉庫:
選定一個目錄作爲Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令:
# git init --bare sample.git
Git就會創建一個裸倉庫,裸倉庫沒有工作區,因爲服務器上的Git倉庫純粹是爲了共享,所以不讓用戶直接
登錄到服務器上去改工作區,並且服務器上的Git倉庫通常都以.git結尾。然後,把owner改爲git:
# chown -R git:git sample.git
第五步,禁用shell登錄:
出於安全考慮,第二步創建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成。找到類似
下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改爲:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣,git用戶可以正常通過ssh使用git,但無法登錄shell,因爲我們爲git用戶指定的git-shell每次一登錄就
自動退出。
第六步,克隆遠程倉庫:
現在,可以通過git clone命令克隆遠程倉庫了,在各自的電腦上運行:
# git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就簡單了。
[root@tomcat gittest4]# git push -u origin master
[email protected]'s password: 
Counting objects: 3, done.
Writing objects: 100% (3/3), 213 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/gittest3/teslaProject.git
 * [new branch] master -> master
23/28
分支 master 設置爲跟蹤來自 origin 的遠程分支 master。
Git分支管理
git分支管理
在版本回退裏,你已經知道,每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到
目前,只有一條時間線,在Git裏,這個分支叫主分支(即master)。HEAD嚴格來說不是指向提交,而是指
向master,master纔是指向提交的,所以,HEAD指向的就是當前分支。
git branch命令會列出所有分支,當前分支前面會標一個*號。
查看分支:git branch
說明:默認主分支爲master
創建分支:git branch 分支名
取出分支版本:git chkeckout -b 分支名
 說明:git checkout -b表示創建並切換到分支,相當於以下兩條命令
git branch dev
git checkout dev
分支管理實例
cd /a/test
git branch 查看分支
git branch dev 創建名稱爲dev的分支
git checkout dev 切換到dev分支
cp /etc/yum.conf ./
git add yum.conf
git commit -m 'yum.conf bak‘
git branch -a
git push origin dev 上傳更新分支
驗證:在碼雲平臺查看test倉庫中的master節點和dev分支的區別。
分支管理實例(合併分支)
 git branch
git checkout master
git merge dev 合併dev分支到master主分支中
git push origin master
git push origin :dev 刪除遠程的dev分支
驗證:在碼雲平臺查看test倉庫中的master節點。
刪除本地git倉庫中的dev分支:
git branch -d dev
git合併分支
合併完成後,刪除dev分支
git branch -d dev
git branch
分支
 分支是用來將特性開發絕緣開來的。在你創建倉庫的時候,master 是“默認的”。在其他分支上進行開
發,完成後再將它們合併到主分支上。 
24/28

創建一個叫做“feature_x”的分支,並切換過去:
#git checkout -b feature_x
查看分支:
[root@ansible gittest]# git branch -a
* feature_x //帶*號的代表你當前工作目錄所處的分支
 master
 remotes/origin/master
切換回主分支:
# git checkout master
再把新建的分支刪掉:
# git branch -d feature_x
除非你將分支推送到遠端倉庫,不然該分支就是 不爲他人所見的:
# git push origin <branch> 

更新與合併
要更新你的本地倉庫至最新改動,執行:
#git pull
以在你的工作目錄中 獲取(fetch) 並 合併(merge) 遠端的改動。
要合併其他分支到你的當前分支(例如 master),執行:
git merge <branch>
兩種情況下,git 都會嘗試去自動合併改動。不幸的是,自動合併並非次次都能成功,並可能導致 衝突
(conflicts)。 這時候就需要你修改這些文件來人肉合併這些 衝突(conflicts) 了。改完之後,
你需要執行如下命令以將它們標記爲合併成功:
git add <filename>
在合併改動之前,也可以使用如下命令查看:
git diff <source_branch> <target_branch> 

標籤
在軟件發佈時創建標籤,是被推薦的。這是個舊有概念,在 SVN 中也有。
25/28
創建一個叫做 1.0.0 的標籤:
# git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要標記的提交 ID 的前 10 位字符。使用如下命令獲取提交 ID:
# git log
顯示的標籤按字母順序排列,所以標籤的先後並不表示重要程度的輕重。
可以用特定的搜索模式列出符合條件的標籤。在 Git 自身項目倉庫中,有着超過 240 個標籤,如果你只對
1.4.2 系列的版本感興趣,可以運行下面的命令:
# git tag -l 'v1.4.2.*'
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4
含附註的標籤
創建一個含附註類型的標籤非常簡單,用 -a (譯註:取 annotated 的首字母)指定標籤名字即可:
 -m 選項則指定了對應的標籤說明,Git 會將此說明一同保存在標籤對象中。如果沒有給出該選項,Git 會
啓動文本編輯軟件供你輸入標籤說明。
# git tag -a v1.4 -m 'my version 1.4'
# git tag
v0.1
v1.3
v1.4
[root@ansible gittest]# git show 1.0.0
commit 5b83380e818f44c850dc4fe96a29148744903ff2
Author: wing <[email protected]>
Date: Sun Feb 25 23:09:09 2018 +0800
 my version 1.4
diff --git a/a.txt b/a.txt
new file mode 100644
index 0000000..ce01362
--- /dev/null
+++ b/a.txt
@@ -0,0 +1 @@
+hello
分享標籤
默認情況下,git push 並不會把標籤傳送到遠端服務器上,只有通過顯式命令才能分享標籤到遠端倉庫。
其命令格式如同推送分支,運行 git push origin [tagname] 即可:
# git push origin v1.5
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To [email protected]:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
如果要一次推送所有本地新增的標簽上去,可以使用 --tags 選項:
# git push origin --tags
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
26/28
Total 44 (delta 18), reused 8 (delta 1)
To [email protected]:schacon/simplegit.git
 * [new tag] v0.1 -> v0.1
 * [new tag] v1.2 -> v1.2
 * [new tag] v1.4 -> v1.4
 * [new tag] v1.4-lw -> v1.4-lw
 * [new tag] v1.5 -> v1.5
現在,其他人克隆共享倉庫或拉取數據同步後,也會看到這些標籤。
Git練習
測試
cd /mydoc
git init
git status
cp /etc/hosts ./cp 
/etc/group ./git status
git add hosts group
git status
git commit -m ‘備註’
git log 查git日誌
Git 更新文件,提交新版本
測試:cd /mydoc
git status
echo 127.0.0.5 ddd >> hosts
echo 127.0.0.6 kk >> hosts
git status
git add hosts
git commit -m 'hosts change1'
git status
git log
創建/mygit目錄,並對此目錄用git進行版本控制。複製/etc/yum.conf和/etc/sysctl.conf文件到/mygit目
錄。用git status查狀態,然後提交當前的版本,-m 的備註信息爲’my conf file v1.’將lsblk、free命令的
結果覆蓋寫入到/mygit/sysctl.conf文件中。再次提交這個版本, -m 的備註信息爲’my conf file v2.’用
git status查狀態。查看當前的/mygit/sysctl.conf文件內容,然後checkout取出v1這個版本,再看/
mygit/sysctl.conf文件內容。
mkdir /mygit
cd /mygit
git init
cp -v /etc/yum.conf /etc/sysctl.conf ./
git status
git add *
git commit -m 'my conf file v1. '
git statuslsblk > sysctl.conf
free >> sysctl.conf
git status
27/28
git commit -a -m 'my conf file v2. '
git status
git log
cat sysctl.conf
git log
git checkout 
Git總結
git小結
git版本控制系統
git安裝、全局環境配置
rpm -q git
yum install -y git
git config --global user.email "[email protected]"
git config --global user.name "tom“
git config --list
git config push.default simple
Git checkout取所需的版本
git log 查看版本日誌,複製其中的commit的MD5值的左邊6個字符
git checkout 粘貼第1版本的commit的MD5值c
at hosts 發現內容爲第1個版本的
git log 查看當前狀態以前的的日誌
git reflog 查看參考日誌(即所有日誌)
cat .git/logs/HEAD 查看所有日誌
git checkout 用第2版的commit的MD5值cat hosts
Git刪除文件
1、本地刪除文件rm README
2、從git中刪除文件 文件依然記錄在git倉庫歷史中git rm README
3、提交操作git commit -m "delete README"
測試:cd /mydoc
git status
rm hosts
git rm hosts
git commit -m 'del hosts'
git status 
git log 查看當前日誌; 
git reflog 查看所有日誌
git分支管理小結
Git鼓勵大量使用分支:
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
28/28
刪除分支:git branch -d <name>
刪除遠程分支:git push origin :分支名
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章