1. 程式人生 > >Centos7 yum安裝git

Centos7 yum安裝git

Git簡介

1、VCS的歷史

VCS版本控制系統(Version Control System),是一種記錄一個或若干檔案內容變化,以便將來查閱特定版本修訂情況的系統;版本控制系統不僅可以應用於軟體原始碼的文字檔案,而且可以對任何型別的檔案進行版本控制,用的比較多的如svn、git等
本地版本控制
Centos7 yum安裝git

通過儲存並管理檔案補丁的方式,來記錄對應檔案修訂前後的內容變化;目前最為流行的一種本地版本控制系統是rcs,根據每次修訂後的補丁,rcs可以通過不斷打補丁,計算出各個版本的檔案內容;當然這樣做之後,對於本機被管理檔案可以做到版本回滾或者回退,但是對於處在不同系統上的開發者要進行協同工作就遇到了問題,於是也就有了"集中式版本控制工具"
集中式版本控制
Centos7 yum安裝git

集中式版本控制系統(Centralized Version Control Systems,簡稱CVCS),版本庫集中存放在中央伺服器,而幹活的時候,用的都是自己的電腦,所以要先從中央伺服器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央伺服器。

這麼做最顯而易見的缺點是中央伺服器的單點故障,如果維修一小時,那麼在這一小時內,誰都無法提交更新,也就無法協同工作;如果中心資料庫所在的磁碟發生損壞,又沒有做恰當備份,毫無疑問你將丟失所有資料,包括專案的整個變更歷史,只剩下人們在各自機器上保留的單獨快照。

相比老式的VCS,每個人能看到專案中其他人在幹嘛,管理員也可以控制每個開發者的許可權,但是一個致命的缺點就是中央伺服器的單點故障,如果發生,誰都無法提交更新,無法協同工作,甚至有丟失資料的風險,至此,後來產生了"分散式版本控制工具"
分散式版本控制
Centos7 yum安裝git

客戶端並不是提取最新版本的檔案快照,而是把原始的程式碼倉庫完整地映象下來,分散式,當我們連線共享版本庫時,可以先將伺服器上的專案克隆到本地,相當於每一臺電腦上都有整個專案的檔案備份,在沒有網時也可以開發,完成開發後可以先提交到本地倉庫,當有網的時候再提交到共享版本庫,這樣一來當伺服器或者自己電腦出故障,也沒有任何擔心

2、Git的歷史

起初參與Linux開源專案的程式碼是由Linus Torvalds本人通過"diff"和"patch"命令來手動為別人整合程式碼的,隨著專案越做越大,程式碼庫之大讓Linus很難繼續通過手工方式管理了,社群的弟兄們也對這種方式表達了強烈不滿

diff簡介

比較檔案中的不同點:
格式:diff 檔案A 檔案B >檔案C
diff命令用於比較文字檔案,能比較單個檔案或者目錄內容,但只有當輸入為文字檔案時才有效
如果指定了Directory1和Directory2引數,diff命令比較兩個目錄下名字相同的文字檔案,並列出不同的二進位制檔案、公共子目錄和只在一個目錄出現的檔案
diff命令主要用於比較兩個檔案的差異,並製作成補丁檔案,然後使用patch命令對相應的檔案打補丁
於是Linus選擇了一個商業的版本控制系統BitKeeper,BitKeeper的東家BitMover公司出於人道主義精神,授權Linux社群免費使用這個版本控制系統
直到2005年,Linux社群牛人聚集,不免沾染了一些梁山好漢的江湖習氣,開發Samba的Andrew試圖破解BitKeeper的協議(這麼幹的其實也不只他一個),被BitMover公司發現了(監控工作做得不錯),於是BitMover公司怒了,要收回Linux社群的免費使用權
於是Linus向BitMover公司道個歉,保證以後嚴格管教弟兄們(嗯,這是不可能的)隨後,Linus花了兩週時間自己用C寫了一個分散式版本控制系統,這就是Git,一個月之內,Linux系統的原始碼已經由Git管理了,Git也由此誕生了。
有人說:"Git的出現,使得其他國家和美國的計算機水平差距拉近了30年"。

3、Git和SVN的區別

Git是分散式,SVN是集中式
Git的每個歷史版本儲存的是完整的檔案,而SVN只是儲存檔案的差異
Git可以離線完成大部分操作,SVN不可以
Git有著更優雅的分支和合並實現
Git有更強的撤銷修改和修改版本歷史的能力
Git速度更快,效率更高

4、Git和Github的關係

Git是一個分散式的版本控制系統
GitHub是一個基於Git的專案託管平臺,它提供了web介面,我們可以在上面建立資源倉庫來存放你的專案,在本地或伺服器建立一個資源倉庫通過shell命令或圖形使用者介面可以和遠端的GitHub進行專案同步更新,實現對專案的管理。
安裝環境:
系統:Centos7-3.10.0-514.el7.x86_64
Git:git-1.8.3x86_64
關閉防火牆並禁止開機自啟
systemctl stop firewalld.service
systemctl disable firewalld
關閉selinux 
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
重啟 reboot
注:預設使用yum安裝git目前最高版本就到1.8,如果想安裝更高或者更新的git版本,可以瞭解一下Git原始碼安裝

二、Git的安裝

1、檢視系統是否安裝git

Centos7 yum安裝git

2、yum安裝git yum -y install git

Centos7 yum安裝git

3、設定使用者名稱和郵箱

1)設定使用者名稱 git config --global user.name 設定使用者名稱
Centos7 yum安裝git

2)設定郵箱地址 git config --global user.email 設定郵箱
Centos7 yum安裝git
注:該使用者名稱、郵箱應為Github網站註冊填寫的使用者名稱及郵箱

3)檢視git配置 git config --list
Centos7 yum安裝git

4)刪除使用者資訊(如果有多個使用者,想刪除指定的使用者可以使用)
git config --global --unset user.name 使用者名稱

4、建立版本庫

版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
所以,建立一個版本庫非常簡單,首先,選擇一個合適的地方,遞迴建立一個空目錄:
mkdir -p /opt/git
Centos7 yum安裝git

5、通過git init命令把這個目錄變成Git可以管理的倉庫

Centos7 yum安裝git
Centos7 yum安裝git

6、用命令git add告訴Git,把檔案將檔案提交到暫存區。(自己隨意寫一個txt檔案)

1)編寫一個檔案 vi /opt/git/nihao.txt
Centos7 yum安裝git
注:這個檔案一定要放在/opt/git/目錄下才能找到(git的子目錄也行)

2)將檔案提交到暫存區 git add 檔名 (在同路徑下執行)
git add nihao.txt
Centos7 yum安裝git

3)檢視當前倉庫檔案狀態(沒有提交和新增檔案,但有跟蹤到新檔案) git status
Centos7 yum安裝git

4)將檔案提交到git倉庫 git commit -m “ wrote a new file”
Centos7 yum安裝git 
注:簡單解釋一下git commit命令,-m後面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄裡方便地找到改動記錄。此命令一定要在上一條命令git add執行完,繼續執行,否則可能提交失敗。

5)再次檢視倉庫狀態後,可以看見無任何內容 git status
Centos7 yum安裝git
注:所有新增或更改的檔案都會先放在暫存區,但確認無誤時,在使用commit提交(這樣的好處在於,如果更改錯誤隨時可以回退)

7、為什麼Git新增檔案需要add,commit一共兩步呢?因為commit可以一次提交很多檔案,所以你可以多次add不同的檔案,比如:

1)同時建立三個檔案 file1.txt file.2txt file3.txt 
Centos7 yum安裝git

2)都提交到暫存區 git add (file1.txt、file.2txt、file3.txt) 
Centos7 yum安裝git

三、時光穿梭機

1、版本回退

1)修改nihao.txt檔案 vi nihao.txt
Centos7 yum安裝git

2)將修改的nihao.txt檔案提交到git版本庫 git commit -m "more a file"
Centos7 yum安裝git
注:當前有兩個nihao.txt版本,分別是wrote a file和more a file。當然了,在實際工作中,我們腦子裡怎麼可能記得一個幾千行的檔案每次都改了什麼內容,不然要版本控制系統幹什麼。
版本控制系統肯定有某個命令可以告訴我們歷史記錄,在Git中,我們用git log命令檢視:
Centos7 yum安裝git
git log命令顯示從最近到最遠的提交日誌,我們可以看到3次提交,如果是上千行輸出資訊太多,看得眼花繚亂的,可以試試加上--pretty=oneline引數:
Centos7 yum安裝git
注:友情提示看到的每個檔案前一大串字母加數字,這個是commit id版本號。

3)將nihao.txt回退到wrote a file版本 git reset --hard HEAD^^
Centos7 yum安裝git
注:首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。
//檢視版本 git log
Centos7 yum安裝git

4)到這一步可能有的童鞋就會問了?最新的版本more a file或者wrote three new file第二版本已經看不到了,我想再回到這其中的一個版本腫麼辦?辦法其實還是有的,只要上面的命令列視窗還沒有被關掉,你就可以順著往上找啊找啊,找到其中一個版本的commit id號然後就可以直接回到那個版本。(本文回到最新的版本more a file)
Centos7 yum安裝git
版本號沒必要寫全,前幾位就可以了,Git會自動去找。當然也不能只寫前一兩位,因為Git可能會找到多個版本號,就無法確定是哪一個了。再小心翼翼地看看nihao.txt的內容:
Centos7 yum安裝git

5)如果現在你回退到了某個版本,關掉了電腦,第二天早上就後悔了,想恢復到新版本怎麼辦?找不到新版本的commit id怎麼辦?
在git中,總是有後悔藥可以吃的。當你用$ git reset --hard HEAD^回退到wrote a file版本時,再想恢復到more a file版本,就必須找到more a file版本的commit id。Git提供了一個命令git reflog用來記錄你的每一次命令:
Centos7 yum安裝git
注:這樣是不是解決了你的擔憂呢?這樣也就不用害怕有哪個版本找不回來了!

2、工作區和暫存區

Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。
先來看名詞解釋。
1)工作區(Working Directory)
就是你在電腦裡能看到的目錄,比如我的/opt/git/資料夾就是一個工作區:
Centos7 yum安裝git

2)版本庫(Repository)
工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。
Centos7 yum安裝git

3)因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。
你可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。對nihao.txt做個修改,比如加上一行內容:
Centos7 yum安裝git
然後,在工作區新增一個666文字檔案(內容隨便寫)先用git status檢視一下狀態:
Centos7 yum安裝git
Git非常清楚地告訴我們,nihao.txt被修改了,而666文字還從來沒有被新增過,所以它的狀態是Untracked。現在,使用兩次命令git add,把nihao.txt和666都新增後,用git status再檢視一下:
Centos7 yum安裝git
現在,暫存區的狀態就變成這樣了:
Centos7 yum安裝git
所以,git add命令實際上就是把要提交的所有修改放到暫存區(Stage),然後,執行git commit就可以一次性把暫存區的所有修改提交到分支。
Centos7 yum安裝git
一旦提交後,如果你又沒有對工作區做任何修改,那麼工作區就是“乾淨”的:
Centos7 yum安裝git
現在版本庫變成了這樣,暫存區就沒有任何內容了:
Centos7 yum安裝git

3、管理與修改

1)修改nihao.txt檔案 vi nihao.txt
Centos7 yum安裝git

2)將修改的nihao.txt檔案新增到暫存區 git add nihao.txt
Centos7 yum安裝git

3)繼續修改nihao.txt檔案 vi nihao.txt
Centos7 yum安裝git

4)這次不新增到暫存區,直接提交 git commit -m "four new file"
Centos7 yum安裝git
是不是發現第二次修改沒有被提交?我們修改操作:(第二次修改沒有新增到暫存區)
第一次修改 -> git add -> 第二次修改 -> git commit
當你用git add命令後,在工作區的第一次修改被放入暫存區,準備提交,但是,在工作區的第二次修改並沒有放入暫存區,所以,git commit只負責把暫存區的修改提交了,也就是第一次的修改被提交了,第二次的修改不會被提交。
用git diff HEAD -- nihao.txt命令可以檢視工作區和版本庫裡面最新版本的區別:
Centos7 yum安裝git
注:由上截圖可看出第二次修改,並沒有被提交,那麼在這裡也再次警告大家,每次修改,如果不用git add到暫存區,那就不會加入到commit中。

4、撤銷修改

撤銷修改方式:
方式一:檔案修改後還沒有被放到暫存區,撤銷修改就能回到版本庫未修改前狀態;
方式二:檔案修改後新增到暫存區,撤銷暫存區的修改就回到新增到暫存區後的狀態,需要繼續執行撤銷檔案操作,才能完全撤銷成功;

1)檢視原nihao.txt檔案內容 cat nihao.txt 
Centos7 yum安裝git

//修改nihao.txt檔案並檢視 vi nihao.txt
Centos7 yum安裝git
Centos7 yum安裝git

//撤銷nihao.txt檔案修改 git checkout 檔名
Centos7 yum安裝git

//檢視nihao.txt檔案 cat nihao.txt
Centos7 yum安裝git
注:以上截圖驗證了使用方式一撤銷修改成功。

2)檢視原nihao.txt檔案內容 cat nihao.txt 
Centos7 yum安裝git

//修改nihao.txt檔案並檢視 vi nihao.txt
Centos7 yum安裝git
Centos7 yum安裝git

//將修改的nihao.txt檔案提交到暫存區 git add nihao.txt
Centos7 yum安裝git

//撤銷已提交到暫存區的nihao.txt檔案的修改 git checkout nihao.txt
Centos7 yum安裝git
注:已提交到暫存區的修改過的檔案,不能用git checkout命令撤銷,如果想撤銷,那麼也不是沒有辦法,需要兩個命令結合使用,如下:

//先取消nihao.txt檔案暫存區的更改 git reset HEAD 檔名
Centos7 yum安裝git

//在執行撤銷檔案操作 git checkout nihao.txt
Centos7 yum安裝git

5、刪除檔案

刪除方式:
(1)誤刪除工作區的檔案
(2)直接刪除不需要的檔案

1)誤刪除工作區檔案 rm -rf nihao.txt
Centos7 yum安裝git

//檢視倉庫狀態 git status
Centos7 yum安裝git

//撤銷檔案刪除操作 git checkout nihao.txt
Centos7 yum安裝git
注:以上操作將誤刪除的檔案已經還原了。

2)從倉庫中刪除nihao.txt檔案 git rm 檔案
Centos7 yum安裝git

//將刪除操作提交到倉庫 git commit -m "delete nihao.txt"
Centos7 yum安裝git

//檢視檔案是否被刪除 ls
Centos7 yum安裝git

//再次檢視倉庫狀態 git status
Centos7 yum安裝git
注:檢視狀態,就是檢視暫存區裡的東西如果已經提交,則如上截圖為空。

四、遠端倉庫

1、在本地生成ssh key

ssh-keygen -t rsa -C "郵箱地址"
Centos7 yum安裝git

2、github中新增公鑰

Centos7 yum安裝git
Centos7 yum安裝git
Centos7 yum安裝git
Centos7 yum安裝git
注:github中新增伺服器公鑰完成!

3、在GitHub中建立一個遠端倉庫

Centos7 yum安裝git
Centos7 yum安裝git
Centos7 yum安裝git
注:複製遠端倉庫地址https://github.com/W-F-Y/test.git

4、本地clone遠端倉庫

git clone https://github.com/W-F-Y/test.git
Centos7 yum安裝git
注:如出現:"fatal: HTTP request failed",則可能是git版本太低,需要安裝更高版本。
如出現:"fatal: unable to access 'https://github.com/Paintinge/Test.git/': SSL connect error ",需更新系統軟體包,然後重啟。

5、本地修改程式碼之後提交到遠端倉庫

1)新建程式碼檔案 vi remote_data.txt
Centos7 yum安裝git

2)將檔案新增到暫存區 git add remote_data.txt
//提交到遠端倉庫 git commit -m "第一個遠端檔案"
Centos7 yum安裝git

//檢視遠端倉庫狀態,提示需提交到遠端倉庫 git status
Centos7 yum安裝git

//在本地倉庫新增一個遠端倉庫 
git remote add git(遠端倉庫標識名稱可自定義) https://github.com/W-F-Y/test.git
Centos7 yum安裝git

//將本地倉庫內容提交到遠端倉庫master分支(第一次-u必須使用,之後提交操作可以忽略),注意輸入使用者名稱、密碼。 git push -u git master 
Centos7 yum安裝git

//檢視GitHub上master分支是否有上傳的檔案
Centos7 yum安裝git

//可以使用命令"git remote rm git"刪除關聯的遠端倉庫

//使用"git remote show git"來檢視git遠端倉庫的具體資訊
Centos7 yum安裝git

//使用"git remote –v"來檢視與當前本地倉庫相關聯的遠端倉庫
Centos7 yum安裝git

五、分支管理

1、分支的引入

Master 是主分支,主要作為程式的釋出,可以理解為是專案的最終版本,所以不能在master上進行開發,所以應該建立子分支進行開發。
團隊中多個人開發一下專案,一同事在開發一個新的功能,需要一週時間完成,他寫了其中的50%還沒有寫完,如果他提交了這個版本,那麼團隊中的其它人就不能繼續開發了,但是等到他全部寫完再全部提交,又存在每天進度丟失的風險,這如何是好呢? 
對於上面的這個問題,我們就可以用分支管理的辦法來解決,一同事開發新功能他可以建立一個屬於他自己的分支,其它同事暫時看不到,繼續在開發分支(一般都有多個分支)上幹活,他在自己的分支上幹活,等他全部開發完成,再一次性的合併到主分支上,這樣我們既可知道他的開發進度,又不影響大家幹活,其他的版本控制器也有分支的概念,只不過切換,刪除分支的時候非常慢、效率低下,而git切換或者刪除分支幾乎就是一瞬間的事

2、檢視分支 git branch

Centos7 yum安裝git

3、建立分支 git branch 分支名

Centos7 yum安裝git

4、切換分支 git checkout 分支名

Centos7 yum安裝git

5、建立並切換分支

git checkout -b 分支名稱
Centos7 yum安裝git

6、刪除分支 git branch -d分支名稱

Centos7 yum安裝git
注:如果要刪除的分支,正處於當前工作分支,必須切換到其餘分支中才能刪除。

7、合併分支

1)檢視當前所處分支 git branch
Centos7 yum安裝git

2)在當前分支下新建test2.txt檔案 vi test2.txt
Centos7 yum安裝git

3)將檔案提交到暫存區 git add test2.txt
Centos7 yum安裝git

4)將暫存區內容提交到本地倉庫 git commit -m "test2分支新檔案"
Centos7 yum安裝git

5)切換到master分支 git checkout master
Centos7 yum安裝git

6)檢視test2分支檔案 ls
Centos7 yum安裝git
注:不能跨分支檢視其他分支的檔案
7)將test2分支合併到當前分支 git merge test2
Centos7 yum安裝git

8、分支衝突

程式碼衝突如何產生的:當在分支上進行開發的時候,難免遇到別的開發人員和我們自己向倉庫中提交相同的程式碼

1)切換到test分支 git checkout test
Centos7 yum安裝git

2)編輯當前分支test.txt檔案新增一行456789 vi test.txt 
Centos7 yum安裝git

3)新增檔案到暫存區 git add test.txt
Centos7 yum安裝git

4)將暫存區內容提交到test分支 git commit -m "test 第二次修改"
Centos7 yum安裝git

5)切換到master分支 git checkout master
Centos7 yum安裝git

6)修改test.txt檔案 vi test.txt
Centos7 yum安裝git

7)新增檔案到暫存區 git add test.txt
Centos7 yum安裝git

8)將暫存區內容提交到master分支 git commit -m "test 第二次改版"
Centos7 yum安裝git

9)將test分支合併到當前分支 git merge test
Centos7 yum安裝git
注:提示合併衝突,需要手動解決重新合併。

10)檢視倉庫狀態 git status
Centos7 yum安裝git

11)檢視合併後文件內容(這時能看見兩個分支更改內容,將衝突刪除或修改)
Centos7 yum安裝git

12)手動修改當前text.txt檔案,然後進行合併。
Centos7 yum安裝git

13)將修改完的檔案提交併合併 
Centos7 yum安裝git
注:以上已經解決了分支衝突問題,並且完成了合併。

六、標籤管理

標籤就是版本庫的一個快照,在釋出新版本的時候,一般都會給老的版本打個標籤,方便後續直接使用指定的版本

1、建立標籤並查詢標籤 git tag

Centos7 yum安裝git

2、建立帶有描述的標籤

git tag -a 標籤名稱 -m 描述資訊
Centos7 yum安裝git

//給未打標籤的檔案設定標籤 git tag 標籤名稱 commitID

1)檢視當前分支所有已提交檔案id git log --pretty=oneline 
Centos7 yum安裝git

2)給指定commit id建立標籤 git tag 666_3 84f0
Centos7 yum安裝git

3、查詢標籤說明 git show 標籤名稱

Centos7 yum安裝git

4、刪除本地標籤 git tag -d 標籤名稱

Centos7 yum安裝git

5、提交標籤到遠端倉庫(指定的版本號)

git push 遠端倉庫名 標籤名稱
Centos7 yum安裝git
Centos7 yum安裝git
//提交本地倉庫所有標籤 git push https://github.com/W-F-Y/test.git --tags
Centos7 yum安裝git

6、刪除遠端倉庫的標籤

//先刪除本地標籤 git tag -d 666
Centos7 yum安裝git

//再刪除遠端標籤 git push https://github.com/W-F-Y/test.git :refs/tags/666
Centos7 yum安裝git
Centos7 yum安裝git