首頁 > 軟體

Git介紹及安裝設定

2020-06-16 16:57:32

一、概述

1.1git概念

Git是一個開源的分散式版本控制系統,用於敏捷高效處理任意規模的專案,其作者為Linux創造者Linus Torvalds為管理Linux核心而開放的一個開源的版本控制柔軟劑與其他版本控制工具例如:CVS,Subversion 等不同,它可採用分散式版本,不必依賴於伺服器端軟體支援。

1.2Git與SVN區別

Git不僅僅是版本控制系統,也是一個內容管理系統相比與SVN的區別如下:
1.GIT為分散式,SVN則不是;
2.GIT按照後設資料形式儲存內容,講所有資源孔子系統都是把檔案的後設資料隱藏在一個類似.svn,.cvs的資料夾內,而SVN是按檔案;
3.GIT分支與SVN不同,分支在SVN內的另一個目錄;
4.GIT沒有全域性版本號,SVN有全域性版本號;
5.GIT內容完整性優於SVN,GIT的內容儲存使用的是SHA-1雜湊演算法。這能確保程式碼內容的完整性,確保在遇到磁碟故障和網路問題時降低對版本庫的破壞。

1.3 GIT工作流程

1.克隆Git資源作為工作目錄
2.在克隆的資源上新增或修改檔案
3.如果他人修改,你可以進行資源更新
4.在提前檢視修改
5.提交修改
6.在修改完成後,如果發現錯誤,可撤回提交並再次修改提交
流程圖:

1.4 基本概念

工作區:本地PC可以看到的目錄
暫存區:英文名稱stage,或index,一般存放在“.git目錄”下的index檔案(.git/index)中,所以我們把暫存區有時也稱作索引(index)
版本庫:工作區有一個隱藏的目錄.git,此為Git的版本庫

圖中左側為工作區,右側為版本庫,在版本庫中標記為“index”的區域為暫存區(stage,index),標記為“master”的是master分支所代表的目錄樹。
圖中可以看到“HEAD”實際指向的是master分支的一個“游標”,所以途中的HEAD的地方可以用master來替換。
圖中的 objects 標識的區域為 Git 的物件庫,實際位於 ".git/objects" 目錄下,裡面包含了建立的各種物件及內容。
當對工作區修改(或新增)的檔案執行 "git add" 命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的檔案內容被寫入到物件庫中的一個新的物件中,而該物件的ID被記錄在暫存區的檔案索引中。
當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(物件庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
當執行 "git reset HEAD" 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。
當執行 "git rm --cached <file>" 命令時,會直接從暫存區刪除檔案,工作區則不做出改變。
當執行 "git checkout ." 或者 "git checkout -- <file>" 命令時,會用暫存區全部或指定的檔案替換工作區的檔案。這個操作很危險,會清除工作區中未新增到暫存區的改動。
當執行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時,會用 HEAD 指向的 master 分支中的全部或者部分檔案替換暫存區和以及工作區中的檔案。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

二、安裝設定

2.1 Git安裝

yum 安裝

yum install git
git --version           #檢視版本

原始碼安裝

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc-c++ perl-ExtUtils-MakeMaker wget -y
wget https://www.kernel.org/pub/software/scm/git/git-2.7.3.tar.gz
tar xf git-2.7.3.tar.gz
cd git-2.7.3
make configure
./configure --prefix=/usr/local/git
make profix=/usr/local/git
make install
echo "export PATH=$PATH:/usr/local/git/bin" > /etc/profile.d/git.sh      #新增環境變數
source /etc/profile.d/git.sh

2.2 Git設定

Git 提供了一個叫做 git config 的工具,專門用來設定或讀取相應的工作環境變數。
設定使用者資訊

git config --global user.name "kaliarch"
git config --global user.email kaliarch@anchnet.com
git config --list     #檢視設定

2.3 建立倉庫

Git 使用 git init 命令來初始化一個 Git 倉庫,Git 的很多命令都需要在 Git 的倉庫中執行,所以git init是使用 Git 的第一個命令。
在執行完成 git init 命令後,Git 倉庫會生成一個 .git 目錄,該目錄包含了資源的所有後設資料,其他的專案目錄保持不變(不像 SVN 會在每個子目錄生成 .svn 目錄,Git 只在倉庫的根目錄生成 .git 目錄)。
該命令執行完後會在當前目錄生成一個 .git 目錄。
使用我們指定目錄作為Git倉庫。
初始化後,會在 newrepo 目錄下會出現一個名為 .git 的目錄,所有 Git 需要的資料和資源都存放在這個目錄中。
如果當前目錄下有幾個檔案想要納入版本控制,需要先用 git add 命令告訴 Git 開始對這些檔案進行跟蹤,然後提交:

git add *.c
git add README
git commit -m '初始化專案版本'
git clone

三、基礎操作

3.1 建立目錄初始化

mkdir /workspace
cd /workspace
git init

此時Git倉庫就建立完成了,此時為一個空倉庫(empty Git repository),可以發現當前目錄下有一個隱藏的目錄.git,此目錄為Git來跟蹤管理版本庫,建議不要修改內部檔案,以免Git倉庫遭到破壞。
使用git clone拷貝一個Git倉庫到本地,可以進行專案檢視與修改

git add    接下來我們執行 git add 命令來新增檔案:
git status -s     git status 以檢視在你上次提交之後是否有修改。

3.2 版本回退

連續新增多個檔案後,執行commit提交後,使用git log檢視不同版本
可以使用--oneline選項檢視歷史記錄簡潔版本,也可用--graph選項,檢視歷史中什麼時候出現了分支、合併,
也可用--reverse引數逆向顯示所有紀錄檔。

新增檔案第一步使用git add是將檔案新增進暫存區,第二部git commit提交更改,實際上為講暫存區的所有內容提交到當前分支。
git reset HEAD 命令用於取消快取的內容。
HEAD指向的版本,因此,Git允許回退版本,使用命令git reset --hard commit_id
回退前,可使用git log檢視歷史提交記錄,以便確回退到那個版本
重新返回回退前的,使用git reflog檢視歷史命令,回到到未來的某個版本。
Git 跟蹤並管理的是修改,而非檔案,當使用git add命令後,在工作區的第一次修改給放如暫存區,但是 ,在工作區的第二次修改沒放入暫存區,用git commit只負責把暫存區的修改提交,也就是第一次的修改被提交了,第二次的修改未被提交。

3.3 刪除檔案

直接在工作區刪除,對暫存區和版本庫沒有任何影響。本地刪除如果要反映在暫存區中應該用git rm命令,對不想刪除的檔案執行git checkout -- <file>,可以讓檔案在工作區重現。用git rm命令執行刪除後,刪除動作加入了暫存區,這時執行提交動作就從真正意義上執行了檔案刪除,不過檔案只是在版本庫的最新提交中被刪除了,在歷史提交中尚在。

3.4 移動檔案(改名操作)

改名操作相當於對舊檔案執行刪除,對新檔案執行新增

git mv可以由git rm和git add兩條命令取代
$ git mv oldname newname 完成改名操作

3.5 恢復刪除檔案

git checkout -- readme.txt
命令git checkout -- readme.txt意思就是,把readme.txt檔案在工作區的修改全部復原,這裡有兩種情況:
一種是readme.txt自修改後還沒有被放到暫存區,現在,復原修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經新增到暫存區後,又作了修改,現在,復原修改就回到新增到暫存區後的狀態。
總之,就是讓這個檔案回到最近一次git commit或git add時的狀態。
用命令git reset HEAD file可以把暫存區的修改復原掉(unstage),重新放回工作區:

一般情況下,你通常直接在檔案管理器中把沒用的檔案刪了,或者用rm命令刪了:
1.一是確實要從版本庫中刪除該檔案,那就用命令git rm刪掉,並且git commit
2.一種情況是刪錯了,因為版本庫裡還有呢,所以可以很輕鬆地把誤刪的檔案恢復到最新版本:
git checkout -- test.txt

四、分支管理

幾乎所有的版本控制系統都存在某種意義上的分支支援,使用分支意味這可以從開放主線來分離出來,可以在不影響主線的情況下繼續工作

建立分支:

git branch (branchname)
git checkout -b (branchname) #建立並切換到該分支下

檢視分支

git branch

切換分支

git checkout (branchname)

當切換分支時,Git會用該分支的最後提交快照替換工作目錄的內容,所以分支不需要多個目錄

合併分支

git merge

當執行git init時,預設情況下Git會建立master分支

刪除分支

git branch -d (branchname) -D #強制刪除

五、搭建GIT伺服器

GitHub就是一個免費託管開原始碼的遠端倉庫。但是對於某些視原始碼如生命的商業公司來說,既不想公開原始碼,又捨不得給GitHub交保護費,那就只能自己搭建一台Git伺服器作為私有倉庫使用。
搭建Git伺服器需要準備一台執行Linux的機器。

5.1 安裝GIT

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel git -y
groupadd git
adduser git -g git

5.2 建立證書登入

收集所有需要登入的使用者的公鑰,公鑰位於id_rsa.pub檔案中,把我們的公鑰匯入到/home/git/.ssh/authorized_keys檔案裡,一行一個。
如果沒有該檔案建立它:

cd /home/git/
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys

5.3 初始化Git倉庫

首先我們選定一個目錄作為Git倉庫,假定是/home/gitrepo/runoob.git,在/home/gitrepo目錄下輸入命令:

su - git
mkdir gitrepo && cd gitrepo
git init --bare kaliarch.git

5.4 克隆倉庫

git clone git@172.20.6.11:/home/git/gitrepo/kiliarch.git     #172.20.6.11為本地git伺服器的地址

注意:git伺服器建立git使用者,如果使用ssh登入拉去,不可進行git使用者的登入shell,確保git用戶端的公鑰已經寫入git伺服器的authorized_keys內。

六、遠端倉庫(github)

註冊GitHub帳號後,從本地GIT參考和GitHub倉庫建傳輸是SSH加密的。

建立SSH KEY,在使用者主目錄下,如果沒有.ssh目錄及裡面的id_rsa.pub檔案,需進行公鑰建立。
ssh-keygen -t rsa -C "youremail@example.com"
後面的 your_email@youremail.com 改為你在 github 上註冊的郵箱,之後會要求確認路徑和輸入密碼,我們這使用預設的一路回車就行。成功的話會在~/下生成.ssh資料夾,進去,開啟 id_rsa.pub,複製裡面的 key。
回到 github 上,進入 Account => Settings(賬戶設定)。

在用戶端驗證是否已經新增成功
ssh -T git@github.com

以下命令說明我們已成功連上 Github。
之後登入後點選" New repository "

建立成功後初始化本地

mkdir /dirgit                     # 建立測試目錄
cd /dirgit                       # 進入測試目錄
echo "# project" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:RedHatxl/project.git
git push -u origin master

新增遠端地址

git remote add origin git@github.com:redhatxl/project.git

新增第二個倉庫
git remote add origin2 git@github.com:redhatxl/test.git
上傳到第二個倉庫
it push -f origin2

如果你在建立 repository 的時候,加入了 README.md 或者 LICENSE ,那麼 github 會拒絕你的 push 。你需要先執行 git pull origin master
執行 git push -u origin master 將本地倉庫上傳至Github的倉庫並進行關聯:
以後想在commit後同步到Github上,只要直接執行 git push 就可以。

檢視當前遠端庫
git remote -v
1、從遠端倉庫下載新分支與資料:
git fetch
2、從遠端倉庫提取資料並嘗試合併到當前分支:
git merge
3、刪除遠端倉庫你可以使用命令:
git remote rm
4、 推播到 Github
git push origin master

更多Git 教學系列文章: 

Git常用命令整理  http://www.linuxidc.com/Linux/2017-12/149316.htm

GitHub 使用教學圖文詳解  http://www.linuxidc.com/Linux/2014-09/106230.htm 

Git使用圖文詳細教學  http://www.linuxidc.com/Linux/2016-11/136781.htm

Ubuntu Git安裝與使用 http://www.linuxidc.com/Linux/2016-11/136769.htm

分享實用的GitHub 使用教學 http://www.linuxidc.com/Linux/2014-04/100556.htm 

Git從入門到學會 http://www.linuxidc.com/Linux/2016-10/135872.htm

Git基本操作詳解 http://www.linuxidc.com/Linux/2016-10/135691.htm

Git部署與常用基本命令詳解   http://www.linuxidc.com/Linux/2017-06/144961.htm

分散式版本控制系統 Git 詳細教學  http://www.linuxidc.com/Linux/2017-05/143747.htm

Git命令和設定技巧  http://www.linuxidc.com/Linux/2017-11/148423.htm


IT145.com E-mail:sddin#qq.com