Git是一款免費、開源的分布式版本控制系統,用于敏捷高效地處理任何或小或大的項目,為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。
GitHub網站為開源項目免費提供Git存儲。
GitLab 是一個用于倉庫管理系統的開源項目。使用 Git作為代碼管理工具,并在此基礎上搭建起來的web服務。
Git 和其他版本控制系統的主要差別在于,Git 只關心文件數據的整體是否發生變化,而大多數其他系統則只關心文件內容的具體差異。這類系統(CVS,Subversion,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內容,Git 是把變化的文件作快照后,記錄在一個微型的文件系統中。每次提交更新時,它會縱覽一遍所有文件的指紋信息并對文件作一快照,然后保存一個指向這次快照的索引。為提高性能,若文件沒有變化,Git 不會再次保存,而只對上次保存的快照作一鏈接。Git 的工作方式如下圖。

Git的優點:
處理速度快
操作都只需要訪問本地文件和資源,不用連網
時刻保持數據完整性
在保存到 Git 之前,所有數據都要進行內容的校驗和(checksum)計算,并將此結果作為數據的唯一標識和索引。如果文件在傳輸時變得不完整,或者磁盤損壞導致文件數據缺失,Git 都能立即察覺。 實際上,所有保存在 Git 數據庫中的東西都是用此哈希值來作索引的,而不是靠文件名。
多數操作僅添加數據
常用的 Git 操作大多僅僅是把數據添加到數據庫。因為任何一種不可逆的操作,比如刪除數據,都會使回退或重現歷史版本變得困難重重,在 Git 里,一旦提交快照之后就完全不用擔心丟失數據,特別是養成定期推送到其他倉庫的習慣。
Git文件的三種狀態:
對于任何一個文件,在 Git 內都只有三種狀態:已提交(committed),已修改(modified)和已暫存(staged)。已提交表示該文件已經被安全地保存在本地數據庫中了;已修改表示修改了某個文件,但還沒有提交保存;已暫存表示把已修改的文件放在下次提交時要保存的清單中。 由此我們看到 Git 管理項目時,文件流轉的三個工作區域:Git 的工作目錄,暫存區域,以及本地倉庫。我們可以從文件所處的位置來判斷狀態:如果是 Git 目錄中保存著的特定版本文件,就屬于已提交狀態;如果作了修改并已放入暫存區域,就屬于已暫存狀態;如果自上次取出后,作了修改但還沒有放到暫存區域,就是已修改狀態。
每個項目都有一個 Git 目錄(如果 git clone 出來的話,就是其中 .git 的目錄;如果 git clone --bare 的話,新建的目錄本身就是 Git 目錄。),它是 Git 用來保存元數據和對象數據庫的地方。該目錄非常重要,每次克隆鏡像倉庫的時候,實際拷貝的就是這個目錄里面的數據。
從項目中取出某個版本的所有文件和目錄,用以開始后續工作的叫做工作目錄。這些文件實際上都是從 Git 目錄中的壓縮對象數據庫中提取出來的,接下來就可以在工作目錄中對這些文件進行編輯。
所謂的暫存區域只不過是個簡單的文件,一般都放在 Git 目錄中。有時候人們會把這個文件叫做索引文件,不過標準說法還是叫暫存區域。
基本的 Git 工作流程如下:
在工作目錄中修改某些文件。
對修改后的文件進行快照,然后保存到暫存區域。
提交更新,將保存在暫存區域的文件快照永久轉儲到 Git 目錄中。
Git的安裝過程(CentOS)
1.檢查Git的版本號,CentOS默認安裝的是git 1.7.X版本,可將其更新到2.0.5
# git --version
2.安裝所需的軟件包
# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# yum -y install gcc perl-ExtUtils-MakeMaker
3.刪除現有的git(yum remove 命令盡可能不要使用)
# yum -y remove git
4.使用軟件包安裝
# wget httos://www.kerenl.org/pub/software/scm/git/git-2.0.5.tar.gz
# tar zxf git-2.0.5.tar.gz -C /usr/src
# cd /usr/src/git-2.0.5/
# make prefix=/usr/local/git all
# make prefix=/usr/local/git install
# echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/exprofile
# source /etc/exprofile
5.再檢查Git的版本號
# git --version
版本庫的創建及使用
版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
# mkdir /data/git //倉庫路徑
# git init //通過git init命令把這個目錄變成Git可以管理的倉庫
初始化空的 Git 版本庫于 /data/git/.git/
# ll -ah //可看到隱藏的.get目錄,用來跟蹤管理版本庫
總用量 12K
drwxr-xr-x. 3 root root 4.0K 3月 18 15:53 .
drwxr-xr-x. 3 root root 4.0K 3月 18 15:53 ..
drwxr-xr-x. 7 root root 4.0K 3月 18 15:53 .git
因為Git是分布式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址。
配置設置:
# git config --global user.name "pansy" //設置名字
# git config user.email "pansy@example.com" //Email地址
注意git config命令的--global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。
把文件放到Git倉庫
# cd /data/git //文件要放到倉庫目錄下或子目錄下
# cat a.txt
this is a txt
# git add a.txt //把文件添加到倉庫
# git add a.txt b.txt //也可以添加多個文件
# git commit -m "add 2 files" //提交文件,-m后面輸入的是本次提交的說明
[master(根提交) e450576] add 2 files
2 files changed, 2 insertions(+)
create mode 100644 a.txt
create mode 100644 b.txt
我們已經成功地添加并提交了一個a.txt文件,如修改a.txt文件
# cat a.txt
this is one txt
# git status //git status時刻掌握倉庫當前的狀態,它告訴我們
位于分支 master a.txt被修改過了,但還沒有準備提交的修改,但不能看修改的內容
尚未暫存以備提交的變更:
(使用 "git add <file>..." 更新要提交的內容)
(使用 "git checkout -- <file>..." 丟棄工作區的改動)
修改: a.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
# git diff a.txt //可以查看修改的內容
diff --git a/a.txt b/a.txt
index 7f38737..3cc29a4 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-this is a txt
+this is one txt
版本回退
# git log //查看歷史記錄,提交日志
commit bb52f061bae3978b2a72244d23d5133d38e37efe //commit id
Author: pansy <pansy@example.com>
Date: Sat Mar 18 17:08:53 2017 +0800
修改
commit e450576a118e88aea0953e384b19f3a1abd1ed9f
Author: pansy <pansy@example.com>
Date: Sat Mar 18 16:50:01 2017 +0800
add 2 files
現在把a.txt回退到上一個版本,也就是“add 2 files”的那個版本
Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交id,上一個版本就是HEAD^,上上一個版本就是HEAD^^,往上100個版本寫100個^數不過來時,可寫成HEAD~100。
# git reset --hard HEAD^ //回退到上個版本
# git log //查看日志
commit e450576a118e88aea0953e384b19f3a1abd1ed9f
Author: pansy <pansy@example.com>
Date: Sat Mar 18 16:50:01 2017 +0800
add 2 files
# git reset --hard HEAD^ a.txt //回退到上一個版本,把版本庫、暫存區和工作區都
# git log 回退到HEAD的前一個版本。
commit e450576a118e88aea0953e384b19f3a1abd1ed9f
Author: pansy <pansy@example.com>
Date: Sat Mar 18 16:50:01 2017 +0800
add 2 files
此時如果想恢復那個版本,可用 git reset --hard id
# git reset --hard bb52f061bae //id不用寫全,會自動查找
HEAD 現在位于 bb52f06 修改
# git log
commit bb52f061bae3978b2a72244d23d5133d38e37efe
Author: pansy <pansy@example.com>
Date: Sat Mar 18 17:08:53 2017 +0800
修改
commit e450576a118e88aea0953e384b19f3a1abd1ed9f
Author: pansy <pansy@example.com>
Date: Sat Mar 18 16:50:01 2017 +0800
add 2 files
如果找不到commit id,git reflog記錄了你的每一次命令
# git reflog //可以查看到commit id
e450576 HEAD@{0}: reset: moving to HEAD^
bb52f06 HEAD@{1}: reset: moving to bb52f061bae
e450576 HEAD@{2}: reset: moving to HEAD^
bb52f06 HEAD@{3}: commit: 修改
e450576 HEAD@{4}: commit (initial): add 2 files
當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout file。
當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,第二步用git checkout --file。
當你已經提交了不合適的修改到版本庫時,想要撤銷本次提交,前提是沒有推送到遠程庫時用上面的版本回退。
刪除文件
1.完全刪除文件(需要提交)
# cat b.txt
this is another txt
# git rm b.txt
rm 'b.txt'
# git status
位于分支 master
要提交的變更:
(使用 "git reset HEAD <file>..." 撤出暫存區)
刪除: b.txt
# git commit -m "刪除b.txt"
[master e380c9f] 刪除b.txt
1 file changed, 1 deletion(-)
delete mode 100644 b.txt
# cat b.txt
cat: b.txt: 沒有那個文件或目錄
2.誤刪除文件
# git rm b.txt
rm 'b.txt'
# git reset
重置后撤出暫存區的變更:
Db.txt
# ls
a.txt
# git checkout b.txt
# ls
a.txt b.txt
遠程倉庫
1.使用提供Git倉庫托管服務的網站(GitHub)
GitHub網址:https://github.com/
(1)注冊(密碼至少7位數,且至少有一個為小寫字母)
(2)選擇付費或是免費(此處選免費)
(3)使用
a.ssh免密碼
# ssh-keygen -t rsa -C "pansy@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
b.將ssh公鑰傳到GitHub
# cd ~/.ssh //用戶的家目錄下
# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0y8b25WTVzcZccZCTD8b/4RGAPq6BqbJh0Qe4/o1/IJZqAywusH8FdAL/n0qWE6jhKxHj2g8qgL0GJudyAyyV9Fnbs0XAyjaLeJZ9Y0xS/lVCYcA669gVbZefrsjwxQhpeK4zcuZGkcUJcq8RVA7rRGOIlO+juhGE/B8UqkNrOdCFnoaWTn7CvcGhCeEnXKf4VJoiH6HpYiRl0D2s3qIo2CGtsg/lPd3nsnP73bmf/OsfsUva2CZEMLELWQR193oN8J6VbUkVAqdxRJTi8DlsU/rVxCFfYpxCVqXAh5gvukuGluAZhymV30bw3o+vrQ85gS2XZMq6a02EjxgE97FZw== pansy@example.com
登陸網站 (將id_rsa.pub上傳到Key上,添加即可)
添加好的樣子
c.在網站上添加遠程庫(需要打開郵件同意)

注:遠程庫是公開的,私有的需要交錢~~~~
d.在本地倉庫目錄下,上傳到gitHub遠程庫
# cd /data/git
# git remote add origin git@github.com:pansypansy/pansy.repo.git
# git push -u origin master //將本地庫上傳的命令 -u第一次時要輸入
查看
https://github.com/用戶名/遠程庫名

e.從遠程庫上克隆到本地

# git clone git@github.com:pansypansy/two.repo.git //遠程庫克隆
正克隆到 'two.repo'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收對象中: 100% (3/3), 完成.
檢查連接... 完成。
# cd two.repo/
# ls
README.md
2.本地的git服務器
GitHub就是一個免費托管開源代碼的遠程倉庫。但是對于某些視源代碼如生命的商業公司來說,既不想公開源代碼,又舍不得給GitHub交保護費,那就只能自己搭建一臺Git服務器作為私有倉庫使用。
(1)安裝git
# yum -y install git 或 用源碼裝
(2)創建用戶
# useradd git
(3)創建證書登錄
收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導入 到/home/git/.ssh/authorized_keys文件里,一行一個。
(4)初始化Git倉庫
先選定一個目錄作為Git倉庫,假定是/data/sample.git,在/data目錄下輸入命令:
# cd /data
# git init --bare sample.git
# chown -R git:git /data/sample.git/
(5)禁用shell登錄
出于安全考慮,git用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成
git:x:500:500::/home/git:/bin/bash
改為:
git:x:500:500::/home/git:/usr/bin/git-shell
(6)克隆遠程倉庫
git clone git@server:/data/sample.git
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。