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

因此,為了避免這種情況,接下來我們就一起來好好學習git的相關知識吧!不怕你不會,就怕你不看!
一、git的三個分區
- 工作區(
working directory) - 暫存區(
stage) - 版本庫
它們之間的關系為:

通過git status查看git狀態時,紅色的文件表示在工作區;綠色的文件表示在暫存區:

工作區中的文件只要通過git add命令添加進了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配置
1.git config
可以通過三個地方的三個文件設置git配置參數,分別代表三個不同的作用域:
-
/etc/gitconfig:作用域:一台計算機(操作系統)上的所有用戶,幾乎不會使用,優先度低於--global;設置方法:git config --system -
~/.gitconfig:作用域:計算機中的某用戶創建的所有項目,常用,優先度低於--local;設置方法:git config --global -
.git/config:作用域:某一特定的版本庫,不常用,是最具體的,優先度最高;設置方法:git config --local
可使用git config 查看相關操作命令以及提示:

2.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,驗證了用戶配置優先級第二和系統配置優先級第三;
3..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文件中:

.gitignore失效
原因:.gitignore只能忽略那些原來沒有被追蹤(untrack)的文件,如果某些文件已經被納入了版本管理中,則修改.gitignore是無效的。
解決方案:清除git本地緩存,將文件轉變為untrack狀態,然后再提交:
git rm -r --cached .
git add .
四、查看狀態
1.git status
查看工作區的狀態,該命令經常使用;每執行一條指令后,都應使用該命令查看工作區和暫存區的狀態;紅色表示對文件的更改還沒提交到暫存區;綠色表示已提交到暫存區;

五、工作區 ->暫存區
1.git add <file>
將工作區中的文件提交到暫存區:
git add test.txt:將工作區中的test.txt提交到暫存區;git add test.txt test2.txt:將工作區中的test.txt和test2.txt提交到暫存區;git add .:將當前目錄及其子目錄下的所有文件從工作區提交到暫存區中;

六、暫存區 ->版本庫
1.git commit -m '注釋'
將暫存區中的文件提交到版本庫,一定要添加注釋,否則不讓提交:當注釋很短時采用-m方式(m為message的意思):

2.git commit
當注釋很長時,可以直接執行git commit,進入vim編輯器界面,在此處編寫較長的注釋,添加完注釋后,通過wq保存並退出即可:


3.git commit -am '注釋'
表示添加當前目錄下所有已被git追蹤的文件到暫存區中並提交,即相當於是git add . 與 git commit 兩步操作的合成。

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

七、工作區<-暫存區
簡單來說,就是將git status指令顯示出來的文件,從綠色變為紅色,大概有如下三種方法:
1.git rm --cached <file>
刪除緩存區中的<file>文件,並將其還原到工作區。該指令需要對暫存區刪除的文件進行一次提交操作,所以建議用第二種方法;

2.git restore --stage <file>
通過該指令,將文件從緩存區中移動到工作區,這里的參數--stage寫成--staged效果是一樣的:

小貼士:可以使用
tab鍵補全命令;
3.git reset HEAD <file>
將文件從緩存區中移到工作區,作用與方法2一樣:

八、撤銷操作
這里指的是撤銷工作區中對文件的操作,包括新增、修改、刪除等,配合着前面第七點所講的指令使用。大概有以下兩種方法:
1.git checkout -- <file>
可以撤銷工作區中對flie文件的改動操作(包括刪除):注意--后面要跟上空格:如果修改已經通過git add提交到暫存區,該指令無效。

2.git restore <file>
可以撤銷工作區中對file文件的操作,效果與方法1相同;

九、日志
git的日志記錄了git倉庫對文件的所有操作,主要分為三大類:分支的提交日志、文件的修改日志、git的操作日志。通過查看這些日志信息,可以很好地了解git倉庫的歷史記錄,並根據需要進行版本回退。
1.查看提交日志
使用的主要命令為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來執行這條指令了。有關別名的內容,之后會詳細進行講解。
2.查看修改日志
git blame file_name

如圖所示,通過該命令可以清楚查看指定的文件的每次修改。包括修改用戶,修改時間等;
3.查看操作日志
git reflog
通過該指令可以詳細地查看,每次操作所在提交節點的commit id,以及在此提交節點上所執行的操作(指令);並且是倒敘顯示的,即最近一次操作的序號為{0}:

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

可以看到通過reset進行版本回退,丟失了4th commit的提交信息,此時可通過git reflog查看操作日志的相關操作信息來回到最新的版本。
總結:
總體上來說,操作日志包含了修改日志和提交日志,是最全的
git日志;注意:不是通過
git命令,而是手動修改文件,這些修改記錄不會被git日志記錄。所以,推薦使用git指令進行操作;
