[git學習:Pro git(2)]Git基礎

Getting a Git Repository(取得項目的Git倉庫)

一在工做目錄中初始化新倉庫: git

git init

初始化後,在當前目錄下會出現一個名爲.git的目錄,全部Git須要的數據和資源都存放在這個目錄下不過目前,僅僅是按照既有的結構框架初始化好了裏邊全部的文件和目錄,但咱們尚未開始跟蹤管理項目中任何一個文件。 github

$git add *.c #git add 開始跟蹤文件,begin to tracking a new file
$git add README
$git commit -m 'initial project version'
二從現有倉庫克隆

Git clone收取的是項目歷史的全部數據(每個文件的每個版本),服務器上有的數據克隆以後本地也都有了。克隆倉庫的命令格式:git clone [url] 正則表達式

$git clone git://github.com/schacon/grit.git
當前目錄下建立一個名爲grit的目錄,其中包含一個.git的目錄, 用於保存下載下來的全部版本記錄,而後從中取出最新版本的文件拷貝

若是但願在克隆的時候,本身定義要新建的項目目錄名稱,能夠在上面的命令末尾指定新的名字: shell

$ git clone git://github.com/schacon/grit.git mygrit
Git 支持許多數據傳輸協議。以前的例子使用的是 git://  協議,不過你也能夠用 http(s)://  或者user @server :/path.git  表示的 SSH 傳輸協議。

Recording changes to the Repository(記錄每次更新到倉庫)

檢查當前文件狀態(Checking the Status of Your Files) vim

$git status
On branch master
nothing to commit,working directory clean#master branch全部文件上次提交後未更改
跟蹤新文件(Tracking new files)
$ vim README
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        README

nothing added to commit but untracked files present (use "git add" to track)
$git add README  #開始跟蹤文件
$$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   README  #README已暫存,若是提交後,將會記錄在版本歷史
暫存已修改文件

修改以前已跟蹤過的文件benchmarks.rb,而後再次運行status 服務器

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   benchmarks.rb
$ git add benchmarks.rb #git add 把已跟蹤的文件放到暫存區
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   README
        modified:   benchmarks.rb
git add還能夠用於合併時把有衝突的文件標記爲已解決狀態

忽略某些文件(Ignoring Files) 框架

有些文件無需歸入Git的管理,也不但願它們總出如今未跟蹤文件列表。一般一些自動生成的文件,好比日誌文件或者編譯過程當中建立的臨時文件等。咱們能夠建立名爲.gitignorede的文件,列出要忽略的文件模式,文件格式規範以下: 編輯器

全部空行或者以註釋符號 # 開頭的行都會被 Git 忽略。
可使用標準的 glob 模式匹配。
匹配模式最後跟反斜槓(/)說明要忽略的是目錄。
要忽略指定模式之外的文件或目錄,能夠在模式前加上驚歎號(!)取反
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式。星號(*)匹配零個或多個任意字符;[abc] 匹配任何一個列在方括號中的字符(這個例子要麼匹配一個 a,要麼匹配一個 b,要麼匹配一個 c);問號(?)只匹配一個任意字符;若是在方括號中使用短劃線分隔兩個字符,表示全部在這兩個字符範圍內的均可以匹配(好比 [0-9] 表示匹配全部 0 到 9 的數字)。
查看已暫存和未暫存的跟新(Viewing your Staged and Unstaged Changes)

要查看還沒有暫存的文件更新了哪些部分,不加入參數直接輸入git diff,此命令比較是工做目錄中當前文件和暫存區域快照之間的差別,也就是修改後還沒暫存起來的內容。 url

$ git diff
diff --git a/benchmarks.rb b/benchmarks.rb
index 3cb747f..da65585 100644
--- a/benchmarks.rb
+++ b/benchmarks.rb
@@ -36,6 +36,10 @@ def main
           @commit.parents[0].parents[0].parents[0]
         end

+        run_code(x, 'commits 1') do
+          git.commits.size
+        end
+
         run_code(x, 'commits 2') do
           log = git.commits('master', 15)
           log.size

若要看已經暫存起來的文件和上次提交時的快照之間的差別,能夠用git diff --cached命令(Git 16.1及更高版本還可以使用git diff --staged) spa

提交更新(Committing Your Changes)

若暫存區已經準備穩當就能夠提交啦,經過git status查看確認後運行提交命令git commit提交。這會啓動文本編輯器以便輸入本次提交的說明。(默認會啓用shell的環境變量$EDITOR所指定的軟件,通常是vim或emacs,或使用git config --global core.editor命令設定你喜歡的編輯器)編輯器會顯示以下內容:


# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#       new file:   README
#       modified:   benchmarks.rb
#
~
~
~
".git/COMMIT_EDITMSG" 10L, 283C


默認的提交消息包含最後一次運行git status的輸出,放在註釋行裏,退出編輯器時,Git會丟掉註釋行,將說明內容和本次跟新提交到倉庫。

能夠用-m參數後跟提交說明,在一行命令中提交更新


$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed   
 2 files changed, 3 insertions(+)
 create mode 100644 README


#本次提交是在哪一個分支提交的,完整SHA-1校驗,有多少文件修訂過,多少行添加和刪除過。
提交時記錄的事放在暫存區的快照,任何還未暫存的仍然保持修改狀態。

跳過使用暫存區域(Skipping the Staging Area)

有時候使用暫存區域會顯得繁瑣,Git提供了跳過暫存區域的方式,只要在提交的時候,給git commit 加上-a選項,Git就會自動把全部已經跟蹤過的文件暫存起來一併提交,從而跳過git add步驟。

移除文件(Removing File)

要從Git中移除某文件,就必須從已跟蹤文件清單(確切說是暫存區域)中移除,而後提交,能夠用git rm完成,並連帶從工做目錄中刪除指定文件。

若是刪除以前修改過而且已經放到暫存區,則必須使用強制刪除選項-f,以防誤刪除文件後丟失修改內容。

若是想把文件從Git倉庫中刪除(亦即從暫存區移除),但仍然但願保留在當前工做目錄中。好比一些大型日誌或者一堆.a的文件不當心歸入到倉庫,要移除跟蹤但不刪除,以便稍後在.gitignore文件中不上,用--cached選項便可


$git rm --cached readme.txt #或 git rm log/\*.log



注意到星號 *  以前的反斜槓 \ ,由於 Git 有它本身的文件模式擴展匹配方式,因此咱們不用 shell 來幫忙展開(譯註:實際上不加反斜槓也能夠運行,只不過按照 shell 擴展的話,僅僅刪除指定目錄下的文件而不會遞歸匹配。上面的例子原本就指定了目錄,因此效果等同,但下面的例子就會用遞歸方式匹配,因此必須加反斜槓。)。此命令刪除全部 log/  目錄下擴展名爲 .log  的文件.

移動文件(Moving Files)

不像其餘的VCS系統,Git並不跟蹤文件移動操做。若是在Git中重命名了某個文件,倉庫存儲元數據並不能體現出此次更名操做,但能夠推斷出來。


$ git mv README.txt README
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    README.txt -> README
其實運行git mv至關於運行了下面三條命令:
$ mv README.txt README
$ git rm README.txt
$ git add README


Viewing the Commit History (查看提交歷史)


$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit



默認git log  會按提交時間列出全部的更新,每次更新都有一個 SHA-1 校驗和、做者的名字和電子郵件地址、提交時間,最後縮進一個段落顯示提交說明。 經常使用選項-p選項展開顯示每次提交的內容差別,-2則僅顯示最近的兩次更新。

--word-diff進行單詞層面,顯示默認上下文默認三行,-U1改成上下文默認一行。

--stat,僅顯示簡要的增改行數統計。

--pretty,指定使用徹底不一樣於默認格式的方式展現提交歷史

相關文章
相關標籤/搜索