1. 程式人生 > >第一講:Git分割槽,配置與日誌

第一講:Git分割槽,配置與日誌

前言

曾經聽到過這樣一句話:不會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.nameuser.email

新增配置

user.nameuser.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/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?

四、檢視狀態

1.git status

檢視工作區的狀態,該命令經常使用;每執行一條指令後,都應使用該命令檢視工作區和暫存區的狀態;紅色表示對檔案的更改還沒提交到暫存區;綠色表示已提交到暫存區;

五、工作區 ->暫存區

1.git add <file>

將工作區中的檔案提交到暫存區:

  • git add test.txt:將工作區中的test.txt提交到暫存區;
  • git add test.txt test2.txt:將工作區中的test.txttest2.txt提交到暫存區;
  • git add .:將當前目錄及其子目錄下的所有檔案從工作區提交到暫存區中;

六、暫存區 ->版本庫

1.git commit -m '註釋'

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

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的提交idcommit 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指令進行操作;