1. 程式人生 > >Git學習筆記(一)

Git學習筆記(一)

編譯 缺點 watermark 索引 規範 存在 alt 回退 dsm

版本號控制系統簡單介紹

版本號控制系統是一種記錄若幹文件內容變化。以便將來查閱特定版本號修訂情況的系統。該系統不僅能夠度軟件源碼的文本文件進行版本號控制管理。也能夠對不論什麽其它類型的文件進行版本號控制。有了版本號控制系統,我們便能夠將某個文件回溯到之前的狀態,甚至將整個項目都回溯到過去的某個時間點的狀態。我們能夠比較文件的變化細節。查出最後是誰改動了哪個地方,從而導致出現怪異的問題,又是誰在何時報告了某個功能缺陷等等。

版本號控制系統的種類

1. 集中化版本號控制系統CVCS(Centralized Version Control Systems): 如CVS, Subversion, Perforce等。

這類系統有一個單一的集中管理的server,保存全部文件的修訂版本號,而協同工作的人都通過client連接到這臺server,取出最新的文件或者提交更新。

長處:每一個人都能夠在一定程度上看到項目中其它人正在做些什麽,而管理員也能夠輕松掌控每一個開發人員的權限,而且管理一個CVCS遠比在各個client上維護本地數據庫easy。

缺點: 中央server的單點故障。假設中央server出現問題,如中央server磁盤發生問題、死機等。都可能導致無法提交更新和數據丟失等問題。

2. 分布式版本號控制系統DVCS(Distributed Version Control System): 如Git, Mercuril, Bazaar, Darcs等。client不僅僅是提取最新版本號的文件快照,而是把原始的代碼倉庫完整地鏡像下來。這樣以來,不論什麽一處協同工作用的server發生問題,事後都能夠用不論什麽一個鏡像出來的本地倉庫恢復。由於每一次的提取操作,實際上都是一次對代碼倉庫的完整備份。

Git簡單介紹

Git是由Linux鼻祖Linus Torvalds開發的,用於管理Linux的內核代碼,並具有速度飛快、設計簡單、對非線性開發模式強力支持(同意上千個並行開發的分支)、全然分布式、有能力高效管理類似Linux內核一樣的超大規模的項目。

Git特性

1. 直接記錄快照。而非差異比較: Git僅僅關心文件數據的總體是否發生變化,而大多數其它系統僅僅關心文件內容的詳細差異,這類系統(CVS, Subversion, Perforce, Bazaar等)每次記錄哪些文件做了哪些更新。

而Git並不保存這些前後變化的數據差異。而是把變化的文件作快照後,記錄在一個微型的文件系統中。每次提交更新時,它會縱讓覽以便全部文件的指紋信息並對文件作以快照,然後保存一個指向這次快照的索引。

為提高性能,若文件沒有變化,Git不會再次保存。而僅僅對上次保存的快照作一鏈接。Git工作方式例如以下:

技術分享

svn工作方式例如以下:

技術分享

2. 近乎全部操作都是本地運行: Git的絕大多數操作都僅僅須要訪問本地文件和資源。不用連網。由於Git在本地磁盤

上就保存這全部當前項目的歷史更新,所以處理起來速度飛快。

用CVCS的話,沒有網絡或者斷開VPN便無法做和不論什麽事。

但用Git的話,沒有網絡時能夠頻繁地提交,到有網絡時再上傳到遠程倉庫。

3.時刻保持數據完整性: 在保存到 Git 之前,全部數據都要進行內容的校驗和(checksum)計算。並將此結果作為

數據的唯一標識和索引。

換句話說,不可能在你改動了文件或文件夾之後,Git 一無所知。這項特性作為 Git 的設計哲學,建在總體架構的最底層。所以假設文件在傳輸時變得不完整。或者磁盤損壞導致文件數據缺失。Git 都能馬上察覺。

4. 多數操作僅加入數據: 經常使用的Git操作大多不過把數據加入到數據庫中。由於不論什麽一種不可逆的操作。比方刪除數據,都會使回退或重現歷史版本號變得困難重重。在別的VCS中。若還未提交更新,就有可能丟失或者混淆一些改動的內容,但在Git裏。一旦提交快照後就全然不用操心丟失數據,特別是養成定期推送到其它倉庫的習慣的話。

主要的Git工作流程

1. 在工作文件夾中改動某些文件

2. 對改動後的文件進行快照,然後保存到暫存區域

3. 提交更新,將保存在暫存區域的文件快照永久轉儲到Git文件夾中

獲取項目的Git倉庫的兩種方法

1. 在現存的文件夾下。通過導入全部文件來創建新的Git倉庫。即進入到項目所在的文件夾,運行$git init語句。

初始化後,在當前文件夾下會出現一個名為.git的文件夾。全部Git須要的數據和資源都存在這個文件夾中。不過眼下。不過依照既有的結構框架初始化了裏邊全部的文件和文件夾,但還沒有開始跟蹤管理項目中的不論什麽一個文件。當用git add命令add項目中的文件數據時,Git便開始對這些文件數據進行跟蹤管理。

2. 從遠程server現有倉庫中克隆,使用的命令格式為git clone<url>,如: $git clonegit://github.com/schacon/grit.git。這便會當前文件夾下創建一個名為“grit”的文件夾,當中包括一個.git的文件夾。用於保存下載下來的全部版本號記錄。然後從中取出最新版本號的文件拷貝。同一時候,gerit文件夾下還包括該項目中的全部文件。須要註意的是。剛從遠程server中clone出代碼倉庫時,git處於本地master分支上,而該本地master分支上是沒有數據的,要獲得數據(遠程代碼倉庫中的數據),須要切換到遠程代碼倉庫中的分支上。或者,將遠程代碼倉庫上的分支合並到本地master分支上,這樣以來。本地master分支便有了項目的全部文件數據。假設希望在克隆的時候,自己要定義新建的項目的文件夾名稱。能夠在clone命令後面指定新的名字。如:$git clone git://github.com/schacon/grit.git MyGrit。

忽略某些文件

假設不希望某些文件總出如今未跟蹤的文件列表中。如自己主動生成的日誌文件、編譯過程中創建的暫時文件等。我們能夠將這些文件不納入Git的管理中。這可通過定義一個名為.gitignore的文件。文件裏列出要忽略的文件模式。文件愛你.gitignore的格式規範例如以下:

● 全部空行或者以凝視符號#開頭的行都會被Git忽略。

● 能夠使用標準的glob模式匹配。*匹配模式最後跟反斜杠(/)說明要忽略的是文件夾。*要忽略指定模式以外的文件或文件夾,能夠在模式前加上感嘆號(!)取反。

比如:

# 此為凝視 – 將被 Git 忽略

*.a # 忽略全部 .a 結尾的文件

!lib.a # 但 lib.a 除外

/TODO # 只忽略項目根文件夾下的 TODO 文件。不包含 subdir/TODO

build/ # 忽略 build/ 文件夾下的全部文件

doc/*.txt # 會忽略 doc/notes.txt 但不包含 doc/server/arch.txt

gitdiff簡單介紹

git diff用於查看已暫存和未暫存的更新。不僅能列出哪些文件被改動過,還能列出當前做的哪些更新還沒有暫存,哪些更新已經暫存起來準備好了下次提交,同一時候還會以文件補丁的格式顯示詳細加入和刪除的行。

&git diff比較工作文件夾中當前文件和暫存區域快照之間的差異,&git diff –cached 或 $git diff –staged比較已經暫存起來的文件和上次提交時的快照之間的差異。

Git學習筆記(一)