git 是最先進的開源分布式版本控制系統,最初由 linus 為解決 linux 的**管理而發明。版本控制系統(version control system, vcs)有很多實現,比如早期的 cvs,主要用於控制、協調檔案的一致性。目前使用最多的主要是 svn 和 git。
svn 是 subversion 的縮寫,使用乙個**版本庫來進行集中控制並記錄檔案變更歷史,支援多個分支並行開發,採用了客服端/伺服器模式,檔案的各個版本、分支都儲存在伺服器上。svn 採用的是 copy-modify-merge(拷貝-修改-合併)模式對檔案進行管理。
在 copy-modify-merge 模式下,當使用者想修改檔案時,先將伺服器檔案 update 到本地,然後在本地對副本進行修改,修改完成後,再將副本 commit 到伺服器。如果 commit 前其他使用者修改了檔案,則檔案版本號發生衝突,需要先 update 到本地進行合併,才能繼續 commit。
與 svn 不同,git 是分布式版本管理系統。從 git 伺服器 clone 檔案到本地,成為本地倉庫,包含了全部檔案和變更記錄,與之相對的伺服器倉庫被稱為遠端倉庫。當使用者想修改檔案時,直接對本地副本進行修改,修改完成後把改動 commit 到本地倉庫,需要同步時再 push 改動到遠端倉庫。由於使用本地倉庫,git 減少了很多網路開銷,使得效能比 svn 有極大的提公升,即使在斷網情況下也能繼續工作。
大多數 vcs 應用是基於增量的版本控制,即儲存了檔案資訊和對每個檔案所做的更改。而 git 是基於快照的版本控制,在每個版本都記下檔案的快照,並儲存對快照的引用。為了提高效率,如果檔案沒有更改,git 不會再次儲存該檔案,而只是指向它已經儲存的先前相同檔案的鏈結。因此,本質上,git 是一套內容定址(content-addressable)檔案系統。
git 中的檔案和操作都以 git 物件來儲存。git物件分為 blob、tree 和 commit 三種型別,blob物件可以儲存幾乎所有的檔案型別,tree物件是用來組織blob物件的一種資料型別,commit物件表示每一次的提交操作。commit物件儲存了對tree物件的引用,tree物件儲存了對blob物件的引用。進行版本控制所需要的所有資料都在 .git 資料夾中,如圖所示。
.git 資料夾核心檔案包括:config檔案、objects資料夾、head檔案、index檔案以及refs資料夾。
git 的檔案有已提交(committed)、已修改(modified) 和已暫存(staged)三種狀態。
與之對應,git 中還有工作區(working directory)和暫存區(staging area)。工作區存放從倉庫 checkout 出來的檔案,使用者可以進行修改。下次將要 commit 的檔案資訊儲存在暫存區。commit 操作實際上是從暫存區 commit 到本地倉庫中。
在 git 中,包括 porcelain 命令(高層命令)和 plumbing 命令(底層命令)兩種型別。按照最初的設計,git 是乙個工具集,底層命令用於以 unix 風格使用或由指令碼呼叫。高層命令用於方便使用者進行操作。我們平時使用的都是高層命令,內部實際上封裝了底層命令的呼叫。
git 的常用命令如圖所示。首次從遠端倉庫建立本地倉庫使用 clone 命令;使用 checkout 命令從本地倉庫切換分支到工作區;增加檔案後,使用 add 命令提交變更到暫存區;修改完成後,使用 commit 命令提交變更到本地倉庫;需要同步時,使用 push 命令推送變更到遠端倉庫;遠端倉庫變化後,使用 pull 命令拉取變更到工作區。以上這些命令都是高層命令。
當我們執行 git add 高層命令時,內部實際上封裝了 git hash-object 和 git update-index 兩個底層命令。其中 git hash-object 將需要暫存的檔案進行 key-value 轉化生成 git 物件,儲存到 objects 資料夾中,獲取了這些檔案的 key,git update-index 命令把這些檔案儲存到暫存區。
當我們執行 git commit 高層命令時,內部實際上封裝了 git commit-tree key –p key2 底層命令。該命令建立 commit 物件,並掛載到前繼物件之後。
微.信.搜.一.搜.程.序.之.心,更.多.原.創.更.新。
bat移動指定型別檔案到指定資料夾
有些時候需要把指定的檔案型別批量移動或複製到指定的資料夾,檔案多的時候手動處理效率太低,可以使用bat處理。echo off 獲取當前日期 set now data date 0,4 date 5,2 date 8,2 以當前日期建立資料夾 mkdir now data 遍歷資料夾的mp4檔案並移動...
列舉資料夾,列舉指定資料夾
一 列舉資料夾函式 void specialfolder browse hwnd hwnd clean up.g pmalloc free pidlspecialfolder g pmalloc free lpbuffer release the shell s allocator.g pmallo...
linux 刪除指定資料夾指定大小指定型別的檔案
背景 最近,需要將所開發的專案。在本地弄乙個,試驗專案,來測試自己的想法。將 拷貝到另乙個目錄後發現,目錄數中有svn的檔案。為了防止自己一不小心將 提交,導致 庫混亂。需要將 svn 的目錄全部刪掉。乙個乙個的刪太費事了。所以,有了本次的試驗。並且把我知道的分享給大家。切換到專案主目錄下,輸入如下...