Git 起源
同生活中的許多偉大事件一樣,Git 誕生於一個極富紛爭大舉創新的年代。Linux 內核開源項目有著為數眾廣的參與者。絕大多數的 Linux 內核維護工作都花在了提交補丁和保存歸檔的繁瑣事務上(1991-2002年間)。到 2002 年,整個項目組開始啟用分布式版本控制系統 BitKeeper 來管理和維護代碼。到了 2005 年,開發 BitKeeper 的商業公司同 Linux 內核開源社區的合作關系結束,他們收回了免費使用 BitKeeper 的權力。這就迫使 Linux 開源社區(特別是 Linux 的締造者 Linus Torvalds )不得不吸取教訓,只有開發一套屬於自己的版本控制系統才不至於重蹈覆轍。他們對新的系統制訂了若干目標:
Git 和其他版本控制系統的主要差別在於,Git 只關心文件數據的整體是否發生變化,而大多數其他系統則只關心文件內容的具體差異。這類系統(CVS,Subversion,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新,以及都更新了哪些行的什麼內容.
Git 並不保存這些前後變化的差異數據。實際上,Git 更像是把變化的文件作快照後,記錄在一個微型的文件系統中。每次提交更新時,它會縱覽一遍所有文件的指紋信息並對文件作一快照,然後保存一個指向這次快照的索引。為提高性能,若文件沒有變化,Git 不會再次保存,而只對上次保存的快照作一鏈接.這是 Git 同其他系統的重要區別。它完全顛覆了傳統版本控制的套路,並對各個環節的實現方式作了新的設計。Git 更像是個小型的文件系統
1、創建新倉庫
git init
touch test.txt
git add --a
git commit -m "fist commit"
初始化新倉庫,在當前目錄下由一個.git的目錄,所有git需要的數據和資源都放在這個目錄中,在當面目錄下添加文件後,需要通過git add 添加到文件追蹤管理(添加到暫存區,數據存放在.git/index 目錄索引,數據內部保存在.git/objects 中), git commit -m "提交說明備注" 提交的信息會提交到數據倉庫,數據提交到正式倉庫,具體保存在.git/objects 中,如以上提交會包含一個commit,tree ,blob 對象。
2、從現有倉庫克隆
git clone url
git clone [email protected]:torvalds/linux.git
如從gitHub上克隆一份linux的源碼,不僅是克隆最新版本的源碼,還克隆了所有數據倉庫的歷史版本,每個文件的每一個版本,這個時候及時服務器github 發生故障,可以用本地數據倉庫重建服務器上的倉庫。可以回復到從服務器克隆或最後更一次從服務器拉去的狀態。在.git 目錄中,已經保存了所有版本記錄,本地文件夾即工作目錄的所有文件刪除了,然後從中取出最新版本的文件拷貝。
3、檢查文件更新狀態
要求確定當前工作區和暫存區文件的狀態,可以通過git status 命令。在工作區和暫存區的目錄狀態可以查看。
git status
On branch master nothing to commit, working directory clean
當前在默認master 分支,當前工作目錄和暫存區沒有任何跟蹤的文件,也沒有任何文件提交後更改,也沒有新增加,未被跟蹤的文件。
notepad test.txt
notepad t.txt
修改test.txt文件,新添加一個t.txt 文件,查看當前文件狀態。
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working di
#
# modified: test.txt
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
# t.txt
no changes added to commit (use "git add" and/or "git commit -a")
新增加的文件t.txt 在未跟蹤文件范圍Untracked files 范圍,需要通過git add 把改文件添加的暫存區,歸入的版本跟蹤管理。
4、 添加文件到暫存區
$ git add .
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: h.txt
# new file: test.txt
git add . 把當前所有目錄文件所有新文件和修改文件添加到暫存區,如果test.txt 文件提示是 Changes not staged for commit ,說明此跟蹤文件已經發生修改,但是還未添加到暫存區,把修改的文件通過git add 命令添加到暫存區後。提示Changes to be committed. 文件已經暫存,隨時可以提交到倉庫 。h.txt 新添加文件從未跟蹤狀態Untracked files ,通過git add命令添加到暫存區,已加入跟蹤文件的范圍。
5、版本提交
$ git commit -m "this is test commit"
[master d4a498a] this is test commit
git commit --amend --reset-author
2 files changed, 3 insertions(+)
create mode 100644 t.txt
通過git commit -m "xxx" 將當前暫存區的內容提交到倉庫,本次commit 提交文件是在默認master分支,提交commit 對象存放在.git/objects 的d4/1498a... 的文件中,該文件指向一個樹tree對象。
6、查看當前提交日志記錄
$ git log
commit d4a498a197c24421acee5c5ff96cfbc7e5c3be9e
Author: andy
Date: Sat Mar 8 14:23:37 2014 +0800
this is test commit
commit 80071e48614361dc282473d6482e3faa9fec17d9
Author:andy
Date: Sat Mar 8 13:35:13 2014 +0800
1st commit
git log 命令查看當前版本
7、文件差異比較
工作區和暫存區文件比較用git diff 命令,暫存區和最近一天提交版本之間的差異,可以用git diff --cached/staged. 如下:
目前在test.txt 文件只有1111111 文件內容,我在文件test.txt中添加22222222等內容,比較當前暫存區和工作文件差異
$ notepad test.txt
$ git diff
diff --git a/test.txt b/test.txt
index 0147537..f33d264 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,4 @@
11111111111111
+22222222222222
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working d
#
# modified: test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git diff --staged
可以發現工作區比暫存區test.txt文件多增加了22222222222222 內容。暫存區和數據倉庫內容是完全相同的。同時看看當前工作區狀態。現在我們吧剛剛修改的內容添加到暫存區,同時比較暫存區和數據倉庫文件差異。
$ git add test.txt
$ git diff
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: test.txt
#
把工作區修改的內容更新到暫存區後,可以看出此時暫存區和工作區文件完全相同。狀態是是已暫存,帶提交狀態。與此同時,我們可以比較暫存區和數據殘酷之間的差異和比較。
$ git diff --staged
diff --git a/test.txt b/test.txt
index 0147537..f33d264 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,4 @@
11111111111111
+22222222222222
我們可以很清楚的看到當前暫存區和數據倉庫版本比較。暫存區test.txt 內容比最近一次提交內容多22222222222222 一行數據。提交數據到數據倉庫。我們現在可以把工作區目錄和數據倉庫比較,看看test.txt 直接的文件內容差異。
$ git diff head
diff --git a/test.txt b/test.txt
index 0147537..f33d264 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,4 @@
11111111111111
+22222222222222
可以很立即看出工作區文件內容比較倉庫有新修改的內容。此時我們提交更新所有文件都沒有差異了。看看文件差異。
$ git commit -m "test git diff "
[master fc0166f] test git diff
Committer: andy
git commit --amend --reset-author
1 file changed, 1 insertion(+)
$ git diff
$ git diff --staged
$ git diff head
8、文件刪除和移動
所有的工作區rm xxx刪除後,可以直接從數據倉庫獲取最近一次提交版本的內容 git rm xxx。直接從數據倉庫刪除此文件內容。
$ ls
h.txt test.txt<