第一講:Git分區,配置與日誌
- 2020 年 4 月 11 日
- 筆記
前言
曾經聽到過這樣一句話:不會git
就不要敲程式碼了。細細品味確實有其中的道理,可能是當事人程式碼被強行覆蓋後的嘆息吧!
因此,為了避免這種情況,接下來我們就一起來好好學習git
的相關知識吧!不怕你不會,就怕你不看!
一、git
的三個分區:
- 工作區(
working directory
) - 暫存區(
stage
) - 版本庫
它們之間的關係為:
通過git status
查看git
狀態時,紅色的文件表示在工作區;綠色的文件表示在暫存區:
工作區中的文件只要通過git add
命令添加進了Git
倉庫,就會被追蹤。
二、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 [email protected]
以上為配置特定版本庫(mygit
)的用戶和郵箱:這樣配置就可以通過兩個版本庫來進行多人操作的模擬;
- 用戶配置:通過
--global
命令配置,作用域為當前系統用戶,配置寫入~/.gitconfig
文件,優先度第二;
git config --global user.name "張三哥哥" git config --global user.email [email protected]
- 系統配置:通過
--system
命令配置,作用域為當前作業系統所有用戶,配置寫入/etc/gitconfig
文件,優先度第三;這裡需要管理員身份運行git bash
才有修改許可權:
git config --system user.name "張三爸爸" git config --system user.email [email protected]
查看配置
-
直接查看配置文件(可通過
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
:[email protected]
:
此時再次通過git config user.name/email
查看配置資訊user.name/email
:
可以發現user.name
顯示的是系統配置:張三爸爸,user.email
顯示的是用戶配置:[email protected]
,驗證了用戶配置優先順序第二和系統配置優先順序第三;
3..gitignore
我們可以通過git
提供的.gitignore
文件配置不被git
跟蹤的文件。被添加到.gitignore
文件中的文件名,將不會被git
追蹤。如下圖中的新增文件setting.properties
:
可見在.gitignore
(注意文件是官方規定好了的不能隨便亂改)文件中添加了文件名setting.properties
後,git
便不再追蹤setting.properties
這個文件了;
**應用場景:**通常將不需要提交的項目依賴文件(如
modules
目錄下文件)添加到.gitignore
文件中,這樣每次提交都會自動忽略這些文件;
**只要與.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?
四、查看狀態
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
:表示提交資訊;
2.查看修改日誌
git blame file_name
如圖所示,通過該命令可以清楚查看指定的文件的每次修改。包括修改用戶,修改時間等;
3.查看操作日誌
git reflog
通過該指令可以詳細地查看,每次操作所在提交節點的commit id
,以及在此提交節點上所執行的操作(指令);並且是倒敘顯示的,即最近一次操作的序號為{0}
:
git log
:只能顯示當前分支的提交歷史,如果進行版本回退,會丟失較後版本的提交資訊,如下圖所示:
可以看到通過reset
進行版本回退,丟失了4th commit
的提交資訊,此時可通過**git reflog
**查看操作日誌的相關操作資訊來回到最新的版本。
總結:
總體上來說,操作日誌包含了修改日誌和提交日誌,是最全的
git
日誌;**注意:**不是通過
git
命令,而是手動修改文件,這些修改記錄不會被git
日誌記錄。所以,推薦使用git
指令進行操作;