曾經聽到過這樣一句話:不會git
就不要敲代碼了。細細品味確實有其中的道理,多是當事人代碼被強行覆蓋後的嘆息吧!javascript
所以,爲了不這種狀況,接下來咱們就一塊兒來好好學習git
的相關知識吧!不怕你不會,就怕你不看!vue
git
的三個分區working directory
)stage
)它們之間的關係爲:java
經過git status
查看git
狀態時,紅色的文件表示在工做區;綠色的文件表示在暫存區:node
工做區中的文件只要經過git add
命令添加進了Git
倉庫,就會被追蹤。git
暫存區也稱爲
index
,不過常使用stage
表示。正則表達式
git
經常使用命令建立版本庫 | 版本控制 | 遠程協做 | 查看信息 |
---|---|---|---|
git init |
git add |
git pull |
git help |
git clone |
git commit |
git push |
git log |
* | git rm |
* | git diff |
git
配置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
查看相關操做命令以及提示:
user.name
與user.email
user.name
和user.email
指的是用戶名和郵箱,這些兩個配置會被添加到提交信息中,能夠搭配上述命令配置到三種做用域中:
--local
命令配置,做用域爲當前版本庫,配置寫入.git/config
文件中,優先度第一;git config --local user.name "張三" git config --local user.email test1@git.com
以上爲配置特定版本庫(mygit
)的用戶和郵箱:這樣配置就能夠經過兩個版本庫來進行多人操做的模擬;
--global
命令配置,做用域爲當前系統用戶,配置寫入~/.gitconfig
文件,優先度第二;git config --global user.name "張三哥哥" git config --global user.email test2@git.com
--system
命令配置,做用域爲當前操做系統全部用戶,配置寫入/etc/gitconfig
文件,優先度第三;這裏須要管理員身份運行git bash
纔有修改權限:git config --system user.name "張三爸爸" git config --system user.email test3@git.com
直接查看配置文件(可經過cat
指令查看):
.git/config
~/,gitconfig
/etc/gitconfig
經過git config --list
:能夠批量查看配置信息:
git config user.name/email
查看:能夠看到輸出的配置信息是倉庫配置張三,驗證了倉庫配置的優先級最高;
刪除config
配置
git config --unset <參數名>
首先設置錯誤參數,隨後查看該配置:
刪除該配置:
修改user.name/email
配置
--unset
命令刪除指定的配置信息:咱們以該方式繼續刪除用戶配置--global user.name
:張三哥哥,和倉庫配置--local user.email
:test1@git.com
:
此時再次經過git config user.name/email
查看配置信息user.name/email
:
能夠發現user.name
顯示的是系統配置:張三爸爸,user.email
顯示的是用戶配置:test2@git.com
,驗證了用戶配置優先級第二和系統配置優先級第三;
.gitignore
咱們能夠經過git
提供的.gitignore
文件配置不被git
跟蹤的文件。被添加到.gitignore
文件中的文件名,將不會被git
追蹤。以下圖中的新增文件setting.properties
:
可見在.gitignore
(注意文件是官方規定好了的不能隨便亂改)文件中添加了文件名setting.properties
後,git
便再也不追蹤setting.properties
這個文件了;
一般用來忽略本地開發中的下列文件:
.idea
、.settings
、.classpath
等無用配置;IDE
的配置文件,項目依賴文件等;如vue-cli
建立項目中node_modules
目錄下的各類依賴文件;只要與.gitignore
中內容相匹配的目錄或文件就會被git
忽略;再如:
.gtiignore
文件很是重要,通常放在建立項目的根目錄上。
注意在.gitignore
文件中一行寫一個文件名;.gitignore
文件也支持正則表達式好比:
*.a
:忽略全部以 .a
結尾的文件;!lib.a
:表示除了lib.a
文件,其他都會被忽略;/TODO
:僅僅忽略項目根目錄下的TODO
文件,不包括subdir/TODO
(TODO
爲示例文件);
/*/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/
在輸入框中輸入相關語言標籤,就能夠自動生成忽略文件列表。能夠將它做爲參考,選擇其中須要的添加到.gitignore
文件中:
git status
查看工做區的狀態,該命令常用;每執行一條指令後,都應使用該命令查看工做區和暫存區的狀態;紅色表示對文件的更改還沒提交到暫存區;綠色表示已提交到暫存區;
->
暫存區git add <file>
將工做區中的文件提交到暫存區:
git add test.txt
:將工做區中的test.txt
提交到暫存區;git add test.txt test2.txt
:將工做區中的test.txt
和test2.txt
提交到暫存區;git add .
:將當前目錄及其子目錄下的全部文件從工做區提交到暫存區中;->
版本庫git commit -m '註釋'
將暫存區中的文件提交到版本庫,必定要添加註釋,不然不讓提交:當註釋很短時採用-m
方式(m
爲message
的意思):
git commit
當註釋很長時,能夠直接執行git commit
,進入vim
編輯器界面,在此處編寫較長的註釋,添加完註釋後,經過wq
保存並退出便可:
git commit -am '註釋'
表示添加當前目錄下全部已被git
追蹤的文件到暫存區中並提交,即至關因而git add .
與 git commit
兩步操做的合成。
該方式只適用於已被git
追蹤的文件(即文件至少提交過一次),當文件第一次提交到暫存區時(此時該文件並未被git
追蹤)不可使用該命令,而是要分開寫,不然會報錯:
<-
暫存區簡單來講,就是將git status
指令顯示出來的文件,從綠色變爲紅色,大概有以下三種方法:
git rm --cached <file>
刪除緩存區中的<file>
文件,並將其還原到工做區。該指令須要對暫存區刪除的文件進行一次提交操做,因此建議用第二種方法;
git restore --stage <file>
經過該指令,將文件從緩存區中移動到工做區,這裏的參數--stage
寫成--staged
效果是同樣的:
小貼士:可使用
tab
鍵補全命令;
git reset HEAD <file>
將文件從緩存區中移到工做區,做用與方法2
同樣:
這裏指的是撤銷工做區中對文件的操做,包括新增、修改、刪除等,配合着前面第七點所講的指令使用。大概有如下兩種方法:
git checkout -- <file>
能夠撤銷工做區中對flie
文件的改動操做(包括刪除):注意--
後面要跟上空格:若是修改已經經過git add
提交到暫存區,該指令無效。
git restore <file>
能夠撤銷工做區中對file
文件的操做,效果與方法1
相同;
git
的日誌記錄了git
倉庫對文件的全部操做,主要分爲三大類:分支的提交日誌、文件的修改日誌、git
的操做日誌。經過查看這些日誌信息,能夠很好地瞭解git
倉庫的歷史記錄,並根據須要進行版本回退。
使用的主要命令爲git log
,經過添加不一樣的參數,能夠顯示不一樣形式的提交日誌,下面主要介紹其中經常使用的幾種:
git log
查看版本庫的提交(commit
)歷史:
提交歷史是倒敘的,最新的提交排在最前面;
Git
的提交id
(commit id
)是一個摘要值,這個摘要值其實是經過sha1
算法計算出來的不重複字符串。由此保證了每次提交id
的惟一性;
Author
顯示的是提交時優先級最高的配置,好比提交時有--local
配置就顯示它,沒有就顯示--global
的配置;如上圖中:第二次提交時使用的是修改事後的config
李四,也就是優先級更高的--local
配置;
git log -n
能夠查看最近的n
次的提交歷史,好比經過git log -3
查看最近3
次的提交歷史:
git log --graph
以圖形化的形式顯示提交歷史:
git log --pretty=oneline
以一行的形式顯示提交歷史:
git log --graph --abbrev-commit
經過--abbrev-commit
對提交信息進行簡化:
還能夠結合--pretty=oneline
進行簡寫:
git log --pretty=oneline --abbrev-commit
git log --pretty=oneline:"%h - %an, %ar : %s"
還能夠按照規定的格式顯示日誌內容:%h
:表示commit id
;%an
:表示提交人;%ar
:表示提交時間;%s
:表示提交信息;
git log --all --decorate --oneline --graph
該命令比較厲害,是StackOverflow
上網友組裝的命令,能夠一次性查看全部分支及其提交記錄,很是實用:
如上圖所示,三個分支dev
、master
、test
以及每一個分支的提交記錄都一次性顯示出來了。因爲該命令十分經常使用,可是又很長,很差記憶。因此,咱們能夠給該命令設置別名(alias
),好比取該命令的首字母組成別名dog
,在全局下進行配置:
git config --global alias.dog 'log --all --decorate --oneline --graph'
設置好別名以後,就能夠經過git dog
來執行這條指令了。有關別名的內容,以後會詳細進行講解。
git blame file_name
如圖所示,經過該命令能夠清楚查看指定的文件的每次修改。包括修改用戶,修改時間等;
git reflog
經過該指令能夠詳細地查看,每次操做所在提交節點的commit id
,以及在此提交節點上所執行的操做(指令);而且是倒敘顯示的,即最近一次操做的序號爲{0}
:
git log
:只能顯示當前分支的提交歷史,若是進行版本回退,會丟失較後版本的提交信息,以下圖所示:
能夠看到經過reset
進行版本回退,丟失了4th commit
的提交信息,此時可經過git reflog
查看操做日誌的相關操做信息來回到最新的版本。
總結:
整體上來講,操做日誌包含了修改日誌和提交日誌,是最全的
git
日誌;注意:不是經過
git
命令,而是手動修改文件,這些修改記錄不會被git
日誌記錄。因此,推薦使用git
指令進行操做;