一、版本控制系統簡介
版本控制系統(VCS)是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。使用版本控制系統通常還意味着,就算你亂來一氣把整個項目中的文件改的改刪的刪,你也照樣可以輕鬆恢復到原先的樣子。 但額外增加的工作量卻微乎其微。版本控制系統通常分爲本地版本控制系統、集中式版本控制系統、分佈式版本控制系統。
本地版本控制系統
許多人習慣用複製整個項目目錄的方式來保存不同的版本,或許還會改名加上備份時間以示區別。這麼做唯一的好處就是簡單,但是特別容易犯錯。有時候會混淆所在的工作目錄,一不小心會寫錯文件或者覆蓋意想外的文件。
爲了解決這個問題,人們很久以前就開發了許多種本地版本控制系統,大多都是採用某種簡單的數據庫來記錄文件的歷次更新差異。
其中最流行的一種叫做 RCS,現今許多計算機系統上都還看得到它的蹤影。 甚至在流行的 Mac OS X 系統上安裝了開發者工具包之後,也可以使用 rcs 命令。 它的工作原理是在硬盤上保存補丁集(補丁是指文件修訂前後的變化);通過應用所有的補丁,可以重新計算出各個版本的文件內容。
集中式版本控制系統
對於如何讓不同系統上的開發者協同工作,本地版本控制系統顯然力不從心。於是,集中化的版本控制系統(Centralized Version Control Systems,簡稱 CVCS)應運而生。 這類系統,諸如 CVS、Subversion 以及Perforce 等,都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的人們都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。多年以來,這已成爲版本控制系統的標準做法。
這種做法帶來了許多好處,特別是相較於老式的本地 VCS 來說。 現在,每個人都可以在一定程度上看到項目中的其他人正在做些什麼。 而管理員也可以輕鬆掌控每個開發者的權限,並且管理一個 CVCS 要遠比在各個客戶端上維護本地數據庫來得輕鬆容易。事分兩面,有好有壞。 這麼做最顯而易見的缺點是中央服務器的單點故障。 如果宕機一小時,那麼在這一小時內,誰都無法提交更新,也就無法協同工作。 如果中心數據庫所在的磁盤發生損壞,又沒有做恰當備份,毫無疑問你將丟失所有數據——包括項目的整個變更歷史,只剩下人們在各自機器上保留的單獨快照。 本地版本控制系統也存在類似問題,只要整個項目的歷史記錄被保存在單一位置,就有丟失所有歷史更新記錄的風險。
分佈式版本控制系統
分佈式版本控制系統(Distributed Version Control System,簡稱 DVCS)的面世解決了CVCS單點故障的缺陷。在這類系統中,像Git、Mercurial、Bazaar 以及 Darcs 等,客戶端並不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來。 這麼一來,任何一處協同工作用的服務器發生故障,事後都可以用任何一個鏡像出來的本地倉庫恢復。因爲每一次的克隆操作,實際上都是一次對代碼倉庫的完整備份。
更進一步,許多這類系統都可以指定和若干不同的遠端代碼倉庫進行交互。籍此,你就可以在同一個項目中,分別和不同工作小組的人相互協作。 你可以根據需要設定不同的協作流程,比如層次模型式的工作流,而這在以前的集中式系統中是無法實現的。
我們今天就來學習以下Git:
二、git簡介
Git是目前世界上最先進的分佈式版本控制系統。
自誕生於 2005 年以來,Git 日臻成熟完善,在高度易用的同時,仍然保留着初期設定的目標。 它的速度飛快,極其適合管理大項目,有着令人難以置信的非線性分支管理系統。
Git必看祕籍:https://git-scm.com/book/zh/v2
Git特點
- 速度
- 簡單的設計
- 對非線性開發模式的強力支持(允許成千上萬個並行開發的分支) 完全分佈式
- 有能力高效管理類似 Linux 內核一樣的超大規模項目(速度和數據量)
Git狀態
Git 有三種狀態:已提交(committed)、已修改(modified) 和 已暫存(staged)。
已修改表示修改了文件,但還沒保存到數據庫中。
已暫存表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。
已提交表示數據已經安全地保存在本地數據庫中。
這會讓我們的 Git 項目擁有三個階段:工作區、暫存區以及 Git 目錄。
三、git安裝
git爲rhel7自帶,因此可以直接安裝:
安裝Git:
# yum install -y git
獲取 Git 倉庫通常有兩種方式:
- 將尚未進行版本控制的本地目錄轉換爲 Git 倉庫。
- 從其它服務器克隆 一個已存在的 Git 倉庫。比如: git clone
初始化版本庫:
$ mkdir demo
$ git init
Initialized empty Git repository in /home/git/demo/.git/
$ ls .git/
branches config description HEAD hooks info objects refs
.git目錄是git跟蹤管理版本庫的,沒事別瞎溜達!
用戶信息:
用戶信息
$ git config --global user.name "cl"
$ git config --global user.email cl@redhat.org
四、git使用
注意: git目錄必須在倉庫目錄中執行
檢查當前文件狀態
$ git status
$ git status -s //簡化輸出
狀態簡覽
$ git status -s
M README #文件修改
MM Rakefile #表示對暫存區的文件做了修改
A lib/git.rb #以添加的文件,處於暫存區
M lib/simplegit.rb #對MM狀態的文件進行了添加操作後的狀態
?? LICENSE.txt #未添加的新文件
添加新文件
$ git add testfile
添加後文件就處於暫存區了,查看文件的狀態未A
如在目錄中有一些文件我們不希望其放在倉庫中,就可以編輯忽略文件:
$ cat .gitignore
.* //忽略所有隱藏文件
/test //只忽略當前目錄下的test文件
build/ //忽略任何目錄下名爲 build 的文件夾
忽略文件的內容就是想要忽略的文件或目錄名。
查看已暫存和未暫存的修改
$ git diff
提交更新
$ git commit -m
git commit的-m
選項表示文件的描述。
跳過使用暫存區域
$ git commit -a -m 'added new benchmarks'
正常將文件保存到倉庫的步驟就是先創建文件,再add,最後commit。
移除文件
$ git rm PROJECTS.md
$ git rm --cached README
重命名文件
$ git mv README.md README
其實,運行 git mv 就相當於運行了下面三條命令:
$ mv README.md README
$ git rm README.md
$ git add README
查看提交歷史
$ git log
$ git log -p -2 #查看前兩個
$ git log --stat
$ git log --pretty=oneline #顯示爲id和文件名
取消暫存的文件
$ git reset HEAD README.md
撤消對文件的修改,也可以在使用rm -rf
或git rm
刪除文件後撤銷刪除。
$ git checkout -- README.md
版本回退:
$ git reflog #查看歷史版本
$ git reset --hard efa267a #其中最後爲版本id
五、git結合github
遠程倉庫:註冊github帳號,並新建一個倉庫:
可以看出有兩種方式飢可以推送本地倉庫內容到github:https和ssh
使用https方式推送每次需要輸入用戶名和密碼,如果不想麻煩的話採用ssh方式:
# ssh-keygen #生成本地密鑰
# cd
# cd .ssh/
# cat id_rsa.pub #複製公鑰
進入設置:
選擇添加ssh key:
填入公鑰:
添加成功:
添加遠程倉庫:
# git remote add origin [email protected]:CL82/demo.git
添加後可以使用git remote -v
查看遠程倉庫的列表。
添加後進行推送:
# git push origin master
推送後就可以在github看到倉庫中的內容了:
此時如果在本地把倉庫目錄刪除了,可以通過以下命令克隆github裏的內容:
# rm -rf demo/
# git clone [email protected]:CL82/demo.git
注意這裏是我的地址,每個人地址不同。