首先咱們要知道Git是什麼git
他是一個基於差別的版本控制器,主要是儲存基本文件隨時間逐步積累的差別 他大部分操做都是本地執行,通常只添加數據,而不是刪除修改 有已提交,已暫存,已修改,三個狀態,修改後保存到已暫存區等待一次性提交github
設置用戶名和郵件地址,每個Git提交都會使用,會被記錄到每一次提交中且不可更改windows
若是不想使用默認文本編輯器,能夠這樣^1^,好比更改爲Emacs,在windows系統上使用別的編輯器必須提供可執行文件^2^markdown
1. $ git config --global core.editor emacs
2. $ git config --global core.editor "url"
複製代碼
當你須要獲取幫助時使用,使用時無需聯網,超方便less
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
複製代碼
同時使用-h能夠得到更簡潔的幫助,以上命令展示的時全面的幫助編輯器
$ cd /c/user/my_project
//繼續
$ git init
//將建立一個.git的子目錄,裏面包含着全部的初始化的git必須文件
複製代碼
使用git clone url命令,克隆git倉庫近乎全部的數據svn
$ git clone https://github.com/libgit2/libgit2
//在當前目錄下建立一個libgit2的目錄,並在其下初始化一個.git的文件夾
複製代碼
已跟蹤文件:被歸入了版本控制的文件,Git已知曉的文件函數
使用git status命令oop
//獲得這個說明工做目錄自上次提交後不曾更改
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
//試圖在我建立的"My Project"項目下添加一個文件夾"README"
$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/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開始跟蹤一個文件flex
$ git add README
複製代碼
再次查看當前文件狀態
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: README
複製代碼
Changes to be committed:如下的說明是已暫存狀態
Changes not staged for committed:已跟蹤文件內容發生了變化但未放到暫存區,即更新,暫存此次更新時須要運行gir add命令,這是一個多功能命令
git add : 能夠用於跟蹤新文件,用於將已跟蹤文件放到暫存區,用於合併時吧衝突文件標記爲已解決狀態
此時文件已暫存,若是咱們在該文件未提交時再次進行修改會發生什麼呢? 答案就是他同時出如今了暫存區和非暫存區 可是提交時仍舊提交的上一個運行過git add的版本 因此不管如何,在作了修改之後要記得暫存
git status命令輸出十分詳細,可是咱們也有一種更爲簡潔的查看方式
git status -s
//或者
git status -short
//輸出
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
複製代碼
其中
?? 新添加的未跟蹤文件
A 新添加到暫存區
M 修改過的文件
咱們能夠建立一個.gitignore結尾的文件,來列出要忽略的文件的模式 通常狀況下,一個倉庫只有根目錄下有一個.gitignore文件,他被遞歸地應用到整個倉庫中,而子目錄下也能夠有額外的該文件,子目錄下的文件只應用到他的目錄中
GitHub有一個十分詳細的.gitignore文件列表: github.com/github/giti…
格式規範以下:
全部空行或者以 # 開頭的行都會被 Git 忽略。
可使用標準的 glob 模式匹配,它會遞歸地應用在整個工做區中。
匹配模式能夠以(/)開頭防止遞歸。
匹配模式能夠以(/)結尾指定目錄。
要忽略指定模式之外的文件或目錄,能夠在模式前加上歎號(!)取反。
# 忽略全部的 .a 文件
*.a
# 但跟蹤全部的 lib.a,即使你在前面忽略了 .a 文件
!lib.a
# 只忽略當前目錄下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目錄下名爲 build 的文件夾
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目錄及其全部子目錄下的 .pdf 文件
doc/**/*.pdf
複製代碼
若是你想知道具體修改了說明地方,可使用git diff命令,他可讓咱們知道,當前哪些更新未暫存,哪些更新已暫存正在等待提交.
git diff相較於git status是以文件補丁的格式來展現更新,能讓咱們更加具體的瞭解具體在哪裏發生了變化
咱們先輸入git status查看狀態
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: 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: CONTRIBUTING.md
複製代碼
咱們能夠知道README文件已修改暫存,而CONTRIBUING.md文件已修改未暫存 此時咱們要查看還沒有暫存的文件更新了哪部分,使用git diff
$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.
If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's
複製代碼
git diff比較的是工做目錄中當前文件和暫存區快照之間的差別,即未暫存的變化內容
要查看下次提交的內容,可使用git diff --staged或者git diff --cached(同義詞) 他會對比已暫存的文件和最後一次提交的文件的差別
$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project
複製代碼
可是git diff自己只顯示未暫存的改動
和status同樣,若是已暫存文件未提交又修改且未再次保存,在git diff命令下和git diff --staged命令下都會出現該文件的名字,一樣提交也只會提交先前已暫存的部分.
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
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
# new file: README
# modified: CONTRIBUTING.md
# (在這裏輸入你的提交說明)
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C
複製代碼
推出編輯器時,Git會丟棄註釋行,用提交說明生成一次提交
也能夠用commit -m命令,將提交信息與命令放在同一行
$ git commit -m "(提交信息)Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README
//提交信息中會告訴你,當前是哪一個分支(master)提交的
複製代碼
使用git commit -a命令,將全部已跟蹤過的文件暫存起來一併提交,跳過git add暫存步驟
可是這也會加入一些不須要的文件
若是隻是從工做目錄簡單刪除文件,運行git status時會在未暫存區看到他
咱們能夠經過將已跟蹤文件從暫存區移除,而後提交,使用git rm命令完成
將以前修改過或已經放到暫存區的文件刪除,可使用強制刪除,不可被修復,使用git rm -f
若是忘記使用.gitignore,不當心將一堆註釋添加到暫存區可使用git rm --cached命令,後可接文件或目錄的名字,也可使用glob模式
//刪除全部名字以~結尾的文件
$ git rm \*~
//刪除log/目錄下擴展名爲.log的全部文件
$ git rm log/\*.log
複製代碼
若是在Git中發生了重名,他不會具體地顯示是一次更名操做
若是要在Git中更名能夠這樣使用git mv
$ git mv file1_from file2_to
複製代碼
他至關於將文件1移入文件2,而後刪除原文件1,暫存文件2
$ mv README.md README
$ git rm README.md
$ git add README
複製代碼
使用git log命令,會按時間順序列出全部提交
$ 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
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
複製代碼
使用git log -p或git log -patch能夠看到每次提交所引入的差別(即補丁),咱們可使用一些選項來限制顯示日誌數量,如-2只顯示最近的兩次提交
使用git log --stat能夠看到每次提交的簡略統計信息,好比全部被修改過的文件,有多少文件被修改以及哪些被修改文件是被移除或添加了
使用git log --pretty能夠用其餘風格展現提交歷史,其內部還包含其餘子選項, 好比 oneline 會將每一個提交放在一行顯示
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
複製代碼
使用git log --format定製記錄的顯示格式,輸出的格式不會隨着Git的更新而發生改變
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit
複製代碼
%H--提交的完整哈希值
%h--提交的簡寫哈希值
%T--樹的完整哈希值
%t--樹的簡寫哈希值
%P--父提交的完整哈希值
%p--父提交的簡寫哈希值
%an--做者名字
%ae--做者的電子郵件地址
%ad--做者修訂日期(能夠用 --date=選項 來定製格式)
%ar--做者修訂日期,按多久之前的方式顯示
%cn--提交者的名字
%ce--提交者的電子郵件地址
%cd--提交日期
%cr--提交日期(距今多長時間)
%s--提交說明
-p
按補丁格式顯示每一個提交引入的差別。
--stat
顯示每次提交的文件修改統計信息。
--shortstat
只顯示 --stat 中最後的行數修改添加移除統計。
--name-only
僅在提交信息後顯示已修改的文件清單。
--name-status
顯示新增、修改、刪除的文件清單。
--abbrev-commit
僅顯示 SHA-1 校驗和全部 40 個字符中的前幾個字符。
--relative-date
使用較短的相對時間而不是完整格式顯示日期(好比「2 weeks ago」)。
--graph
在日誌旁以 ASCII 圖形顯示分支與合併歷史。
--pretty
使用其餘格式顯示歷史提交信息。可用的選項包括 oneline、short、full、fuller 和 format(用來定義本身的格式)。
--oneline
--pretty=oneline --abbrev-commit 合用的簡寫。
就像上述過的-2選項,限制顯示最新的兩條更新
還有按時間做限制的選項,好比 --since 和 --until
//列出最近兩週的全部的提交
$ git log --since=2.weeks
//列出具體某一天的提交
$ git log --since=2008-01-15
//列出一個相對日期的提交
$ git log --since="2 years 1 day 3 minutes ago"
複製代碼
還有按指定條件做限制的提交
用 --author 選項顯示指定做者的提交,用 --grep 選項搜索提交說明中的關鍵字。其中可指定多個 --author 和 --grep 爲搜索條件,也能夠添加 --all-match 輸出全部匹配 --grep 模式的提交
-S 接收一串字符串參數,只會顯示那些添加或刪除了該字符串的提交
//尋找刪除或添加了對某一個函數的引用的提交
$ git log -S function_name
複製代碼
若是隻關心某些文件或者目錄的歷史提交,能夠在log選項後指定他們的路徑,要記得用 -- 將前面選項和路徑分開
-
僅顯示最近的 n 條提交。
--since, --after
僅顯示指定時間以後的提交。
--until, --before
僅顯示指定時間以前的提交。
--author
僅顯示做者匹配指定字符串的提交。
--committer
僅顯示提交者匹配指定字符串的提交。
--grep
僅顯示提交說明中包含指定字符串的提交。
-S
僅顯示添加或刪除內容匹配指定字符串的提交。
--no-merges能夠將包含信息很少的提交合並起來,以避免弄亂歷史記錄