以下内容翻譯自《progit》一書,加上我個人的一些了解。因為英語水準有限,難免有錯。。。
原書的pdf可去下載下傳中心下載下傳。。。
一、關于版本控制系統
記錄檔案的改變,以便可以回調特殊的版本的系統。
1、本地的版本控制系統
最原始的版本控制就是複制檔案到另一個不同的檔案夾,一次來與之前的進行區分。但是這樣做卻很麻煩,而且容易出錯。為了解決這一問題,早期的程式員開發了擁有資料庫的本地的版本控制系統(VCS)。這個資料庫用來儲存檔案的更改。其中一個有名的VCS是RCS。它儲存一個更新檔集(更新檔指檔案之間的不同之處)。通過給檔案打上更新檔,它可以重新生成任何時刻的檔案。
2、集中版本控制系統
在開發的過程中,人們遇到的另一個問題是人們之間需要共同進行開發。像CVS、SVN、Perforce等系統,擁有一個包含所有版本檔案的伺服器,許多可以從伺服器處檢視檔案的用戶端。這友善了人們之間的共同開發,但是也有缺點。如果伺服器當機了,那麼在當機的這段時間内任何的修改都無法儲存,甚至若硬碟遭到了所壞,則一切成果都白費。
3、分布式版本控制系統
像Git、Mercurial、Bazaar、Darcs,用戶端無需時時從伺服器處檢視最新的檔案,它們映射整個檔案倉庫(repository)。如果伺服器當機,用戶端上的倉庫可以用來恢複伺服器上的所有檔案。分布式版本控制系統不僅可以讓你和不同的人同步進行項目開發,而且允許你建立工作流程(workflow)。
二、
了解什麼是Git以及Git是如何工作的,對于有效使用Git很有幫助。在學習Git時,試着忘記關于其他VCS的内容,例如SVN和Perforce。因為Git存儲資訊和其他的系統不同,這麼做有助于避免混亂。
Git和其他VCS的主要不同在于對資料的認識不同。其他的版本控制系統将資訊作為一個基于檔案更改的清單進行存儲。它們儲存初始檔案集以及每一次每一個檔案的更改情況。而Git将資料當作是一系列的“快照”。每一次送出,Git都拍了一張那個時候所有檔案的“快照”,然後存儲一個指向這個快照的引用。為了更加有效,如果檔案沒有改變,Git不會再一次存儲檔案,而是隻有一個指向前一個已經存儲的相同檔案的連結。
Git中幾乎每一個操作都是本地的。例如為了檢視項目的進展狀況,Git不需要聯網去伺服器上擷取,它僅僅從本地的資料庫中讀取,這意味這可以即時地檢視項目進展。同時在不聯網的情況下,也不時什麼都幹不了。在沒有聯網的情況下,可以随時随地地對項目進行修改,然後送出到資料庫。
Git是保持資料完整性的。Git在存儲前對每個檔案都進行檢驗和運算,然後用檢驗和來代表那個檔案。這意味着不可能在Git不知情的情況下對檔案進行修改并儲存。Git使用的機制是SHA-1,這是一個由十六進制的字元組成的40個字元串。這些hash值在Git中的很多地方都用到,例如Git存儲檔案不時通過檔案名而是通過hash值。
無論你在Git中做什麼操作,通常隻是往Git資料庫中增加資料,無法删除資料庫中的資料。即使做的是删除的操作,也隻是往資料庫中增加了一個沒有那個檔案的快照。是以可以對誤删的内容進行恢複。這意味着我們可以在Git上盡情地實驗而無需擔心對檔案造成無法撤銷的損壞。
樹狀态
在Git中檔案所處的狀态有三種:Committed、Modified、Staged。Committed意味着檔案被安全地存儲在本地資料庫。Modified意味着對檔案進行了更改但沒有送出到資料庫。Staged意味着标志了一個目前的版本中修改的檔案将要送出到下一個版本。這三種狀态帶來了Git中三種主要的section:Git directory、Staging area、Working directory。Git directory是Git存儲中繼資料和對象資料庫的地方。這也是當你從其他地方克隆一個倉庫所存放檔案的地方。Working directory是對目前版本進行操作的地方,也就是工作目錄。Staging area存儲要送出的檔案,類似于緩存。
基本的Git工作流程有三個步驟:
1、在Working directory修改檔案
2、Stage檔案,增加它們的快照到Staging area
3、送出到Git directory,永久儲存
三、安裝Git
關于安裝步驟就不多說了,具體可以看文檔。。。
四、配置Git:git config
/etc/gitconfig:系統配置,适用于所有使用者,通過傳入 --system 參數來設定
~/.gitconfig:某個使用者的配置,傳入--global參數
.git/config:某個倉庫的配置,傳入 --local參數
配置身份資訊:git config --global user.name "...";git config --global user.email "..."
配置編輯器:git config --global core.editor vim
配置diff工具:git config --global merge.tool vimdiff
列出配置:git config --list
幫助:git help <verb>或man git-<verb>或git <verb> --help
五、建立Git倉庫
有兩種方法可以建立Git倉庫:1、把已有的項目目錄載入到Git中。2、克隆已存在的倉庫
把已有的項目目錄載入到Git中:
1、git init :初始化
2、git add <filename>
3、git commit -m "..."
克隆已存在的倉庫:
git clone <url> [project_name]
檢視狀态:git status [-s]
檔案的四種狀态:untracked、tracked、modified、staged。
untracked相當于是沒有在Git注冊的檔案的,是“野生的”。traced的即是注冊的。modified的顧名思義是修改的,staged是處于staging area的,相當于是緩存的。
通常來說,一開始建立了一個檔案是未注冊的。通過git status -s可以看到在檔案名前有兩個“?”。可以用git add注冊。這時在檢視狀态可以看到檔案名前第一位為A,第二位為空。第一位代表的就是檔案在Staging area中的狀态,第二位代表的是檔案在Working directory中的狀态。這時如果用git commit就可以進行送出,加入到Git資料庫中。
如果對這個檔案進行了修改,檢視狀态,可以看到第二位為M,這表示Working directory中的此檔案進行了修改,再git add <filename>可以看到第一位變成了M,表示Staging directory中的此檔案被修改了。再git commit可進行送出。
也可以使用git commit -a跳過stage檔案,直接送出。
.gitignore檔案:忽略要stage的檔案,使用通配符進行比對;在路徑名後加上“/”表示目錄;“!”表示排除某個檔案在忽略檔案之外。
git diff:檢視Working directory中的檔案與Staging area中的同一個檔案的差別。--cache(或--staged)參數檢視Staging area與Git directory中同檔案的差別。
git commit:送出檔案,若無參數會提示輸入message。可指定-m "..." 參數
移除檔案:git rm <filename>:從Working directory和Staging area中都移除,再git commit送出。git rm --cached <file>:從Staging area中移除,保留Working directory中檔案。通過在後面加"/"可以移除目錄。移除含通配符檔案需在 * 前加 \ 。
重命名:git mv <filename1> <filename2>。
檢視送出日志:git log。-p顯示每次送出的差異。--stat顯示簡要資訊。-n:僅顯示最近的n次送出。--pretty=format:"%h -%an , %ar : %s'定制要顯示的格式。
更多選項請看幫助或文檔
六、撤銷操作
注意,有些操作并不總是可以撤銷
1、修改最後一次送出:git commit --amend。此指令使用目前Staging area的快照送出,會覆寫上一次的送出。
2、撤銷Staged的檔案:git reset HEAD <file>
3、取消對檔案的修改:git checkout -- <file>。注意這條指令執行後對檔案的修改都将沒有了。
注意,任何已經送出到Git的檔案都可以被恢複,即使在已經删除的分支中的送出,或者用--amend重新改寫的送出,都可以被恢複,可能丢失的隻有還未送出的修改。
七、遠端倉庫的使用
遠端倉庫指托管在網絡上的項目倉庫
git remote:列出每個遠端庫的名字。在克隆完一個項目後至少可以看到一個名為origin的遠端庫。-v顯示對應的克隆位址
添加遠端倉庫:git remote add [shortname] <url>;
擷取遠端倉庫中有的,而本地沒有的資訊。git fetch [shortname]。注意fetch隻是擷取遠端的資料到本地倉庫,并不自動合并到目前工作分支。如果設定了某個分支用于跟蹤某個遠端倉庫的分支,可以使用git pull指令自動擷取資料下來,然後将遠端分支自動合并到本地倉庫中目前分支。
推送資料到遠端倉庫:git push [remote-name] [branch-name]。隻有在遠端有寫權限,或同一時刻沒有其他人在推送,才會成功。若在推送前,已經有人推送了若幹更新,推送操作就會被駁回,需先把他們的更新抓取到本地,并到自己的項目中才可以推送。
git remote show [remote-name]:檢視遠端倉庫詳細資訊.
移除本地對應的遠端倉庫:git remote rm <shortname>
重命名本地對應的遠端倉庫:git remote rename <shortname1> <shortname2>
八、打标簽
列出已有的标簽:git tag
建立标簽:輕量級标簽和含附注的标簽
含附注的标簽實際上是存儲在倉庫中的一個獨立對象,它有自身的校驗和資訊等。
建立含附注的标簽:git config -a <tag-name>