Git 的正確打開方式?拿來吧你!!!🐱💻 最全教程持續更新

Git的正確打開方式

首先咱們要知道Git是什麼git

他是一個基於差別的版本控制器,主要是儲存基本文件隨時間逐步積累的差別 他大部分操做都是本地執行,通常只添加數據,而不是刪除修改 有已提交,已暫存,已修改,三個狀態,修改後保存到已暫存區等待一次性提交github

Git初次運行前的配置

  1. 設置用戶名和郵件地址,每個Git提交都會使用,會被記錄到每一次提交中且不可更改windows

  2. 若是不想使用默認文本編輯器,能夠這樣^1^,好比更改爲Emacs,在windows系統上使用別的編輯器必須提供可執行文件^2^markdown

    1. $ git config --global core.editor emacs
     2. $ git config --global core.editor "url"
    複製代碼

Git 命令的綜合手冊(manpage)

當你須要獲取幫助時使用,使用時無需聯網,超方便less

$ git help <verb>
$ git <verb> --help
$ man git-<verb>
複製代碼

同時使用-h能夠得到更簡潔的幫助,以上命令展示的時全面的幫助編輯器

2.1 Git 倉庫

建立新的 Git 倉庫

$ cd /c/user/my_project

//繼續
$ git init

//將建立一個.git的子目錄,裏面包含着全部的初始化的git必須文件
複製代碼

克隆現有的倉庫

使用git clone url命令,克隆git倉庫近乎全部的數據svn

$ git clone https://github.com/libgit2/libgit2

//在當前目錄下建立一個libgit2的目錄,並在其下初始化一個.git的文件夾
複製代碼

2.2 記錄更新到倉庫

已跟蹤文件:被歸入了版本控制的文件,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
複製代碼

2.3 查看提交歷史

查看提交歷史

使用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 -pgit 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
複製代碼
  1. %H--提交的完整哈希值

  2. %h--提交的簡寫哈希值

  3. %T--樹的完整哈希值

  4. %t--樹的簡寫哈希值

  5. %P--父提交的完整哈希值

  6. %p--父提交的簡寫哈希值

  7. %an--做者名字

  8. %ae--做者的電子郵件地址

  9. %ad--做者修訂日期(能夠用 --date=選項 來定製格式)

  10. %ar--做者修訂日期,按多久之前的方式顯示

  11. %cn--提交者的名字

  12. %ce--提交者的電子郵件地址

  13. %cd--提交日期

  14. %cr--提交日期(距今多長時間)

  15. %s--提交說明

git log的經常使用選項

-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選項後指定他們的路徑,要記得用 -- 將前面選項和路徑分開

限制 git log 輸出的選項(總結)

-

僅顯示最近的 n 條提交。

--since, --after

僅顯示指定時間以後的提交。

--until, --before

僅顯示指定時間以前的提交。

--author

僅顯示做者匹配指定字符串的提交。

--committer

僅顯示提交者匹配指定字符串的提交。

--grep

僅顯示提交說明中包含指定字符串的提交。

-S

僅顯示添加或刪除內容匹配指定字符串的提交。

隱藏合併提交

--no-merges能夠將包含信息很少的提交合並起來,以避免弄亂歷史記錄

2.4 撤銷操做

撤銷操做

相關文章
相關標籤/搜索