Git應用詳解第一講:Git分區,配置與日誌

前言

曾經聽到過這樣一句話:不會git就不要敲代碼了。細細品味確實有其中的道理,多是當事人代碼被強行覆蓋後的嘆息吧!javascript

image-20200411113956725

所以,爲了不這種狀況,接下來咱們就一塊兒來好好學習git的相關知識吧!不怕你不會,就怕你不看!vue

1、git的三個分區

  • 工做區(working directory
  • 暫存區(stage
  • 版本庫

它們之間的關係爲:java

image-20200409211750551

經過git status查看git狀態時,紅色的文件表示在工做區綠色的文件表示在暫存區node

image-20200405154401706

工做區中的文件只要經過git add命令添加進了Git倉庫,就會被追蹤。git

暫存區也稱爲index,不過常使用stage表示。正則表達式

2、git經常使用命令

建立版本庫 版本控制 遠程協做 查看信息
git init git add git pull git help
git clone git commit git push git log
* git rm * git diff

3、git配置

1.git config

能夠經過三個地方的三個文件設置git配置參數,分別表明三個不一樣的做用域:算法

  • /etc/gitconfig:做用域:一臺計算機(操做系統)上的全部用戶,幾乎不會使用,優先度低於--global;設置方法:vue-cli

    git config --system
  • ~/.gitconfig:做用域:計算機中的某用戶建立的全部項目,經常使用,優先度低於--local;設置方法:npm

    git config --global
  • .git/config :做用域:某一特定的版本庫,不經常使用,是最具體的,優先度最高;設置方法:vim

    git config --local

可以使用git config 查看相關操做命令以及提示:

image-20200309233143320

2.user.nameuser.email

添加配置

user.nameuser.email指的是用戶名和郵箱,這些兩個配置會被添加到提交信息中,能夠搭配上述命令配置到三種做用域中:

  • 倉庫配置:經過--local命令配置,做用域爲當前版本庫,配置寫入.git/config文件中,優先度第一;
git config --local user.name "張三"
git config --local user.email test1@git.com

以上爲配置特定版本庫(mygit)的用戶和郵箱:這樣配置就能夠經過兩個版本庫來進行多人操做的模擬;

image-20200309232701432

  • 用戶配置:經過--global命令配置,做用域爲當前系統用戶,配置寫入~/.gitconfig文件,優先度第二;
git config --global user.name "張三哥哥"
git config --global user.email test2@git.com

image-20200405164632583

  • 系統配置:經過--system命令配置,做用域爲當前操做系統全部用戶,配置寫入/etc/gitconfig文件,優先度第三;這裏須要管理員身份運行git bash纔有修改權限:
git config --system user.name "張三爸爸"
git config --system user.email test3@git.com

image-20200405165203785

查看配置
  • 直接查看配置文件(可經過cat指令查看):

    • 倉庫配置.git/config

    image-20200405165547199

    • 用戶配置~/,gitconfig

    image-20200405165649327

    • 系統配置/etc/gitconfig

    image-20200405170052757

  • 經過git config --list能夠批量查看配置信息:

image-20200405170219389

  • 經過git config user.name/email查看:

image-20200405170326841

能夠看到輸出的配置信息是倉庫配置張三,驗證了倉庫配置的優先級最高

修改配置

刪除config配置

git config --unset <參數名>

首先設置錯誤參數,隨後查看該配置:

image-20200407114958537

image-20200407115017637

刪除該配置:

image-20200407115135434

image-20200407115148715

修改user.name/email配置

  • 能夠經過添加配置的方式對原有配置進行覆蓋,從而達到修改的效果:

image-20200309233745256

  • 經過--unset命令刪除指定的配置信息:

image-20200405170707745

咱們以該方式繼續刪除用戶配置--global user.name張三哥哥,和倉庫配置--local user.emailtest1@git.com

image-20200405171112517

此時再次經過git config user.name/email查看配置信息user.name/email

image-20200405171226783

能夠發現user.name顯示的是系統配置:張三爸爸user.email顯示的是用戶配置:test2@git.com,驗證了用戶配置優先級第二和系統配置優先級第三

3..gitignore

做用

咱們能夠經過git提供的.gitignore文件配置不被git跟蹤的文件。被添加到.gitignore文件中的文件名,將不會被git追蹤。以下圖中的新增文件setting.properties

image-20200310140332647

可見在.gitignore(注意文件是官方規定好了的不能隨便亂改)文件中添加了文件名setting.properties後,git便再也不追蹤setting.properties這個文件了;

應用場景

一般用來忽略本地開發中的下列文件:

  • .idea.settings.classpath等無用配置;
  • 系統自動生成的文件:各類IDE的配置文件,項目依賴文件等;如vue-cli建立項目中node_modules目錄下的各類依賴文件;
  • 編譯生成的中間文件,可執行文件;
  • 敏感的配置文件和本地不想提交的腳本文件等;
實戰演示

只要與.gitignore中內容相匹配的目錄或文件就會被git忽略;再如:

image-20200310140958531

.gtiignore文件很是重要,通常放在建立項目的根目錄上

注意在.gitignore文件中一行寫一個文件名;.gitignore文件也支持正則表達式好比:

  • *.a:忽略全部以 .a 結尾的文件;
  • !lib.a:表示除了lib.a文件,其他都會被忽略;
  • /TODO:僅僅忽略項目根目錄下的TODO文件,不包括subdir/TODOTODO爲示例文件);
    • 能夠經過/*/TODO使一層目錄下的TODO文件被忽略;
    • 經過 /**/TODO 使全部層目錄下的TODO文件都被忽略;
  • build/ 表示忽略build目錄下的全部文件;
  • doc/*.txt 表示忽略doc目錄下全部的.txt文件,包括doc/notes.txt 但不包括 doc/server/.arch.txt
    • doc/*/*.txt 會忽略doc目錄及其任何一個子目錄下的全部.txt文件,好比doc/bin/2.txt/ * 表示一層目錄);
    • doc/**/*.txt 則會把doc任何一層目錄及其子目錄下的.txt文件忽略;即 /**/ 兩顆星表示全部層目錄;

如下爲某個使用vue-cli3建立項目下的.gitignore文件內容:

.DS_Store
node_modules
/dist

# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
配置技巧

其實咱們不須要每次都手寫一遍.gitignore文件,能夠經過這個網站自動生成不一樣語言項目的忽略文件:http://gitignore.io/

image-20200413175031278

在輸入框中輸入相關語言標籤,就能夠自動生成忽略文件列表。能夠將它做爲參考,選擇其中須要的添加到.gitignore文件中:

image-20200413175324108

4、查看狀態

1.git status

查看工做區的狀態,該命令常用;每執行一條指令後,都應使用該命令查看工做區和暫存區的狀態紅色表示對文件的更改還沒提交到暫存區;綠色表示已提交到暫存區;

image-20200309225807040

5、工做區 ->暫存區

1.git add <file>

工做區中的文件提交到暫存區

  • git add test.txt:將工做區中的test.txt提交到暫存區;
  • git add test.txt test2.txt:將工做區中的test.txttest2.txt提交到暫存區;
  • git add .:將當前目錄及其子目錄下的全部文件從工做區提交到暫存區中;

image-20200405173551441

6、暫存區 ->版本庫

1.git commit -m '註釋'

將暫存區中的文件提交到版本庫,必定要添加註釋,不然不讓提交:當註釋很短時採用-m方式(mmessage的意思):

image-20200405173938192

2.git commit

當註釋很長時,能夠直接執行git commit,進入vim編輯器界面,在此處編寫較長的註釋,添加完註釋後,經過wq保存並退出便可:

image-20200405160208232

image-20200405160252663

3.git commit -am '註釋'

表示添加當前目錄下全部已被git追蹤的文件到暫存區中並提交,即至關因而git add .git commit 兩步操做的合成。

image-20200311094351942

該方式只適用於已被git追蹤的文件(即文件至少提交過一次),當文件第一次提交到暫存區時(此時該文件並未被git追蹤)不可使用該命令,而是要分開寫,不然會報錯:

image-20200311105537874

7、工做區<-暫存區

簡單來講,就是將git status指令顯示出來的文件,從綠色變爲紅色,大概有以下三種方法:

1.git rm --cached <file>

刪除緩存區中的<file>文件,並將其還原到工做區。該指令須要對暫存區刪除的文件進行一次提交操做,因此建議用第二種方法;

image-20200405175500995

2.git restore --stage <file>

經過該指令,將文件從緩存區中移動到工做區,這裏的參數--stage寫成--staged效果是同樣的:

image-20200405173026361

小貼士:可使用tab鍵補全命令;

3.git reset HEAD <file>

將文件從緩存區中移到工做區,做用與方法2同樣:

image-20200405202356893

8、撤銷操做

這裏指的是撤銷工做區中對文件的操做,包括新增、修改、刪除等,配合着前面第七點所講的指令使用。大概有如下兩種方法:

1.git checkout -- <file>

能夠撤銷工做區中對flie文件的改動操做(包括刪除):注意--後面要跟上空格:若是修改已經經過git add提交到暫存區,該指令無效。

image-20200405172537981

2.git restore <file>

能夠撤銷工做區中對file文件的操做,效果與方法1相同;

image-20200405222228836

9、日誌

git的日誌記錄了git倉庫對文件的全部操做,主要分爲三大類:分支的提交日誌、文件的修改日誌git操做日誌。經過查看這些日誌信息,能夠很好地瞭解git倉庫的歷史記錄,並根據須要進行版本回退。

1.查看提交日誌

使用的主要命令爲git log,經過添加不一樣的參數,能夠顯示不一樣形式的提交日誌,下面主要介紹其中經常使用的幾種:

git log

查看版本庫的提交(commit)歷史:

image-20200310000630352

  • 提交歷史是倒敘的,最新的提交排在最前面;

  • Git的提交idcommit id)是一個摘要值,這個摘要值其實是經過sha1算法計算出來的不重複字符串。由此保證了每次提交id的惟一性;

  • Author顯示的是提交時優先級最高的配置,好比提交時有--local配置就顯示它,沒有就顯示--global的配置;如上圖中:第二次提交時使用的是修改事後的config李四,也就是優先級更高的--local配置;

git log -n

能夠查看最近的n次的提交歷史,好比經過git log -3 查看最近3次的提交歷史:

image-20200310102202167

git log --graph

以圖形化的形式顯示提交歷史:

image-20200310202444991

git log --pretty=oneline

以一行的形式顯示提交歷史:

image-20200310102422277

git log --graph --abbrev-commit

經過--abbrev-commit對提交信息進行簡化:

image-20200311094731124

還能夠結合--pretty=oneline進行簡寫:

git log --pretty=oneline  --abbrev-commit

image-20200311094856556

git log --pretty=oneline:"%h - %an, %ar : %s"

還能夠按照規定的格式顯示日誌內容:%h:表示commit id%an:表示提交人;%ar:表示提交時間;%s:表示提交信息;

image-20200310102703035

git log --all --decorate --oneline --graph

該命令比較厲害,是StackOverflow上網友組裝的命令,能夠一次性查看全部分支及其提交記錄,很是實用:

image-20200413170158604

如上圖所示,三個分支devmastertest以及每一個分支的提交記錄都一次性顯示出來了。因爲該命令十分經常使用,可是又很長,很差記憶。因此,咱們能夠給該命令設置別名(alias),好比取該命令的首字母組成別名dog,在全局下進行配置:

git config --global alias.dog 'log --all --decorate --oneline --graph'

image-20200413171109680

設置好別名以後,就能夠經過git dog來執行這條指令了。有關別名的內容,以後會詳細進行講解。

2.查看修改日誌

git blame file_name

image-20200311144605370

如圖所示,經過該命令能夠清楚查看指定的文件的每次修改。包括修改用戶,修改時間等;

3.查看操做日誌

git reflog

經過該指令能夠詳細地查看,每次操做所在提交節點的commit id,以及在此提交節點上所執行的操做(指令);而且是倒敘顯示的,即最近一次操做的序號爲{0}

image-20200311100922744

git log:只能顯示當前分支的提交歷史,若是進行版本回退,會丟失較後版本的提交信息,以下圖所示:

image-20200406174222429

能夠看到經過reset進行版本回退,丟失了4th commit的提交信息,此時可經過git reflog查看操做日誌的相關操做信息來回到最新的版本。

總結:

  • 整體上來講,操做日誌包含了修改日誌和提交日誌,是最全的git日誌;

  • 注意:不是經過git命令,而是手動修改文件,這些修改記錄不會被git日誌記錄。因此,推薦使用git指令進行操做;

相關文章
相關標籤/搜索