Git 常用操作(1)- 配置、查看、添加、暂存和提交
1. Git 基本概念
Git 有三種狀態:已提交(committed)、已修改(modified)和已暫存(staged)。
-
已提交:表示數據已經安全的保存在本地數據庫中。
-
已修改:表示修改了文件,但還沒保存到數據庫中。
-
已暫存:表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。
由此引入 Git 項目的三個工作區域的概念:工作目錄、Git 倉庫、以及暫存區域。
-
工作目錄:
是對項目的某個版本獨立提取出來的內容。這些從 Git 倉庫的壓縮數據庫中提取出來的文件,放在磁盤上供你使用或修改。工作目錄也叫工作區,即本地倉庫的文件夾,肉眼可見的。 -
Git 倉庫目錄:
是 Git 用來保存項目的元數據和對象數據庫的地方。這是 Git 中最重要的部分,從其它計算機克隆倉庫時,拷貝的就是這里的數據。在工作區中存在一個隱藏的目錄 .git,它就是版本庫。 -
暫存區域:
是一個文件,保存了下次將提交的文件列表信息,一般在 Git 倉庫目錄中。有時候也被稱作‘索引’,不過一般說法還是叫暫存區域。.git 目錄下存在一個 index 文件,這就是 Git 的暫存區,也成為索引。
基本的 Git 工作流程如下:
- 在工作目錄中修改文件。
- 暫存文件,將文件的快照放入暫存區域。
- 提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄。
如果 Git 目錄中保存著的特定版本文件,就屬于已提交狀態。如果作了修改并已放入暫存區域,就屬于已暫存狀態。如果自上次取出后,作了修改但還沒有放到暫存區域,就是已修改狀態。
2. Git 初次配置
Git 自帶一個 git config 的工具來幫助設置控制 Git 外觀和行為的配置變量。這些變量存儲在三個不同的位置:
-
/etc/gitconfig 文件:
包含系統上每一個用戶及他們倉庫的通用配置。 如果使用帶有 --system 選項的 git config 時,它會從此文件讀寫配置變量。
-
~/.gitconfig 或 ~/.config/git/config 文件:
只針對當前用戶。 可以傳遞 --global 選項讓 Git 讀寫此文件。
-
當前使用倉庫的 Git 目錄中的 config 文件(就是 .git/config):
針對該倉庫
每一個級別覆蓋上一級別的配置,所以 .git/config 的配置變量會覆蓋 /etc/gitconfig 中的配置變量。
當安裝完 Git 應該做的第一件事就是設置你的用戶名稱與郵件地址。這樣做很重要,因為每一個 Git 的提交都會
使用這些信息,并且它會寫入到你的每一次提交中,不可更改:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
再次強調,如果使用了 --global 選項,那么該命令只需要運行一次,因為之后無論你在該系統上做任何事情, Git 都會使用那些信息。當你想針對特定項目使用不同的用戶名稱與郵件地址時,可以在那個項目目錄下運行沒有 --global 選項的命令來配置。
Git 保存密碼
https://blog.csdn.net/youanyyou/article/details/78992990
3. Git 基本操作
3.1 獲取 Git 倉庫
有兩種取得 Git 項目倉庫的方法。第一種是在現有項目或目錄下導入所有文件到 Git 中;第二種是從一個服務器克隆一個現有的 Git 倉庫。
1. 現有目錄初始化倉庫(git init)
要使用 Git 進行版本管理,必須先初始化倉庫。Git 是使用 git init 命令進行初始化的。
$ mkdir git-tutorial
$ cd git-tutorial
$ git init
Initialized empty Git repository in /Users/hirocaster/github/github-book
/git-tutorial/.git/
如果初始化成功,執行了git init 命令的目錄下就會生成.git 目錄。這個.git 目錄里存儲著管理當前目錄內容所需的倉庫數據。
2. 克隆現有的倉庫(git clone)
Git 克隆的是該 Git 倉庫服務器上的幾乎所有數據,而不是僅僅復制完成你的工作所需要文件。當你執行 git clone 命令的時候,默認配置下遠程 Git 倉庫中的每一個文件的每一個版本都將被拉取下來。
克隆倉庫的命令格式是 git clone [url]
$ git clone https://github.com/libgit2/libgit2
這會在當前目錄下創建一個名為 “libgit2” 的目錄,并在這個目錄下初始化一個 .git 文件夾,從遠程倉庫拉取下所有數據放入 .git 文件夾,然后從中讀取最新版本的文件的拷貝。
如果你想在克隆遠程倉庫的時候,自定義本地倉庫的名字,你可以使用如下命令:
$ git clone https://github.com/libgit2/libgit2 mylibgit
這將執行與上一個命令相同的操作,不過在本地創建的倉庫名字變為 mylibgit
3.2 查看倉庫的狀態(git status)
工作目錄下的每一個文件都不外乎這兩種狀態:已跟蹤或未跟蹤。
已跟蹤的文件是指那些被納入了版本控制的文件,在上一次快照中有它們的記錄,在工作一段時間后,它們的狀態可能處于未修改,已修改或已放入暫存區。
工作目錄中除已跟蹤文件以外的所有其它文件都屬于未跟蹤文件,它們既不存在于上次快照的記錄
中,也沒有放入暫存區。初次克隆某個倉庫的時候,工作目錄中的所有文件都屬于已跟蹤文件,并處于未修改狀態。
要查看哪些文件處于什么狀態,可以用 git status 命令
$ git status
On branch master
nothing to commit, working directory clean
結果顯示了我們當前正處于 master 分支下。接著還顯示了沒有可提交的內容。所謂提交(Commit),是指“記錄工作樹中所有文件的當前狀態”。這說明你現在的工作目錄相當干凈。換句話說,所有已跟蹤文件在上次提交后都未被更改過。
$ touch README.md
$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)READMEnothing added to commit but untracked files present (use "git add" to
track)
可以看到在Untracked files 中顯示了 README 文件。未跟蹤的文件意味著 Git 在之前的快照(提交)中沒有這些文件。
3.3 向暫存區中添加文件(git add)
要想讓文件成為 Git 倉庫的管理對象,就需要用 git add 命令將其加入暫存區(Stage 或者Index)中。暫存區是提交之前的一個臨時區域。
$ git add README.md
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file: README
#
只要在 Changes to be committed 這行下面的,就說明是已暫存狀態。git add 命令使用文件或目錄的路徑作為參數;如果參數是目錄的路徑,該命令將遞歸地跟蹤該目錄下的所有文件。
3.4 暫存已修改文件
如果修改了一個名為 CONTRIBUTING.txt 的已被跟蹤的文件,然后運行 git status 命令,會看到下面內容:
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file: READMEChanges 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: CONTRIBUTING.txt
文件 CONTRIBUTING.txt 出現在 Changes not staged for commit 這行下面,說明已跟蹤文件的內容發生了變化,但還沒有放到暫存區。要暫存這次更新,需要運行 git add 命令。
運行 git add 將 “CONTRIBUTING.txt” 放到暫存區,然后再看看 git status 的輸出:
$ git add CONTRIBUTING.txt
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file: READMEmodified: CONTRIBUTING.txt
現在兩個文件都已暫存,下次提交時就會一并記錄到倉庫。假設此時,你想要在 CONTRIBUTING.txt 里再加條注釋,重新編輯存盤后,準備好提交。不過且慢,再運行 git status 看看:
$ vim CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file: READMEmodified: CONTRIBUTING.mdChanges 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: CONTRIBUTING.md
現在 CONTRIBUTING.txt 文件同時出現在暫存區和非暫存區。這怎么可能呢?實際上 Git 只
不過暫存了你運行 git add 命令時的版本,如果你現在提交,CONTRIBUTING.txt 的版本是你最后一次運行 git add 命令時的那個版本,而不是你運行 git commit 時,在工作目錄中的當前版本。所以,運行了 git add 之后又作了修訂的文件,需要重新運行 git add 把最新版本重新暫存起來:
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file: READMEmodified: CONTRIBUTING.md
3.5 提交已修改文件 (git commit)
git commit 命令可以將當前暫存區中的文件實際保存到倉庫的歷史記錄中。
-
記述一行提交信息
$ git commit -m "First commit" [master (root-commit) 9f129ba] First commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md-m 參數后的"First commit"稱作提交信息,是對這個提交的概述。
-
記述詳細提交信息
如果想要記述得更加詳細,請不加-m,直接執行git commit命令。執行后編輯器就會啟動,并顯示如下結果。
# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: README.md #在編輯器中記述提交信息的格式如下:
- 第一行:用一行文字簡述提交的更改內容
- 第二行:空行
- 第三行以后:記述更改的原因和詳細內容
只要按照上面的格式輸入,今后便可以通過確認日志的命令或工具看到這些記錄。在以#(井號)標為注釋的Changes to be committed(要提交的更改)欄中,可以查看本次提交中包含的文件。將提交信息按格式記述完畢后,請保存并關閉編輯器,以 #(井號)標為注釋的行不必刪除。隨后,剛才記述的提交信息就會被提交。
-
終止提交
如果在編輯器啟動后想中止提交,請將提交信息留空并直接關閉編輯器,隨后提交就會被中止。
-
查看提交后的狀態
執行完git commit命令后再來查看當前狀態。
$ git status # On branch master nothing to commit, working directory clean當前工作樹處于剛剛完成提交的最新狀態,所以結果顯示沒有更改。
3.6 跳過暫存區直接提交
Git 提供了一個跳過使用暫存區域的方式,只要在提交的時候,給 git commit 加上 -a 選項,Git 就會自動把所有已經跟蹤過的文件暫存起來一并提交,從而跳過 git add 步驟:
3.7 忽略文件
一般我們總會有些文件無需納入 Git 的管理,也不希望它們總出現在未跟蹤文件列表。通常都是些自動生成的文件,比如日志文件,或者編譯過程中創建的臨時文件等。在這種情況下,我們可以創建一個名為 .gitignore
的文件,列出要忽略的文件模式。來看一個實際的例子:
$ cat .gitignore
*.[oa]
*~
第一行告訴 Git 忽略所有以 .o 或 .a 結尾的文件。一般這類對象文件和存檔文件都是編譯過程中出現的。第二行告訴 Git 忽略所有以波浪符(~)結尾的文件,此外,你可能還需要忽略 log,tmp 或者 pid 目錄,以及自動生成的文檔等等。
文件 .gitignore 的格式規范如下:
? 所有空行或者以 # 開頭的行都會被 Git 忽略。
? 可以使用標準的 glob 模式匹配。
? 匹配模式可以以(/)開頭防止遞歸。
? 匹配模式可以以(/)結尾指定目錄。
? 要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反。
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式。
星號(*)匹配零個或多個任意字符;
[abc] 匹配任何一個列在方括號中的字符(這個例子要么匹配一個 a,要么匹配一個 b,要么匹配一個 c);
問號(?)只匹配一個任意字符;如果在方括號中使用短劃線分隔兩個字符,表示所有在這兩個字符范圍內的都可以匹配(比如[0-9] 表示匹配所有 0 到 9 的數字)。
使用兩個星號(**) 表示匹配任意中間目錄,比如a/**/z 可以匹配 a/z,
a/b/z 或 a/b/c/z等。
3.8 查看提交日志(git log)
$ git log
commit 9f129bae19b2c82fb4e98cde5890e52a6c546922
Author: hirocaster <hohtsuka@gmail.com>
Date: Sun May 5 16:06:49 2013 +0900
First commit
默認不用任何參數的話,git log 會按提交時間列出所有的更新,最近的更新排在最上面。正如你所看到的,這個命令會列出每個提交的 SHA-1 校驗和、作者的名字和電子郵件地址、提交時間以及提交說明。
git log 有許多選項可以幫助你搜尋你所要找的提交,接下來我們介紹些最常用的。
-
只顯示提交信息的第一行
如果只想讓程序顯示第一行簡述信息,可以在git log命令后加上–pretty=short,有另外還
有 short,full 和 fuller 參數可以使用。$ git log --pretty=short commit 9f129bae19b2c82fb4e98cde5890e52a6c546922 Author: hirocaster <hohtsuka@gmail.com> First commit -
只顯示指定目錄、文件的日志
只要在git log命令后加上目錄名,便會只顯示該目錄下的日志。如果加的是文件名,就會只顯示與該文件相關的日志。
$ git log README.md -
顯示每次提交的內容差異
如果想查看提交所帶來的改動,可以加上 -p 參數,文件的前后差別就會顯示在提交信息之后。也可以加上 -2 來僅顯示最近兩次提交
$ git log -p -2 README.md -
git log --graph——以圖表形式查看分支
用git log --graph命令進行查看的話,能很清楚地看到特性分支(feature-A)提交的內容已被合并。除此以外,特性分支的創建以
及合并也都清楚明了。$ git log --graph * commit 83b0b94268675cb715ac6c8a5bc1965938c15f62 |\ Merge: fd0cbf0 8a6c8b9 | | Author: hirocaster <hohtsuka@gmail.com> | | Date: Sun May 5 16:37:57 2013 +0900 | | | | Merge branch 'feature-A' | | | * commit 8a6c8b97c8962cd44afb69c65f26d6e1a6c088d8 |/ Author: hirocaster <hohtsuka@gmail.com> | Date: Sun May 5 16:22:02 2013 +0900 | | Add feature-A | * commit fd0cbf0d4a25f747230694d95cac1be72d33441d | Author: hirocaster <hohtsuka@gmail.com> | Date: Sun May 5 16:10:15 2013 +0900 | | Add index | * commit 9f129bae19b2c82fb4e98cde5890e52a6c546922 Author: hirocaster <hohtsuka@gmail.com> Date: Sun May 5 16:06:49 2013 +0900 First commit
3.9 查看已暫存和未暫存的修改差異(git diff)
git diff 命令可以查看工作樹、暫存區、最新提交之間的差別。
-
查看工作樹和暫存區的差別
$ git diff diff --git a/README.md b/README.md index e69de29..cb5dc9f 100644 --- a/README.md +++ b/README.md @@ -0,0 +1 @@ +# Git教程由于我們尚未用git add命令向暫存區添加任何東西,所以程序只會顯示工作樹與最新提交狀態之間的差別。 “+”號標出的是新添加的行,被刪除的行則用“-”號標出。我們可以看到,這次只添加了一行。
-
查看工作樹和最新提交的差別
要查看與最新提交的差別,請執行以下命令
$ git diff HEAD diff --git a/README.md b/README.md index e69de29..cb5dc9f 100644 --- a/README.md +++ b/README.md @@ -0,0 +1 @@ +# Git教程不妨養成這樣一個好習慣:在執行git commit命令之前先執行 git diff HEAD命令,查看本次提交與上次提交之間有什么差別,等確認完畢后再進行提交。這里的 HEAD 是指向當前分支中最新一次提交的指針。
總結
以上是生活随笔為你收集整理的Git 常用操作(1)- 配置、查看、添加、暂存和提交的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python+OpenCV 图像处理系列
- 下一篇: Git 常用操作(2)- 创建标签