【愣錘筆記】能解決80%場景的Git必會知識點

愣錘發表於2019-03-10

GIt以其方便安全快捷的特點,在版本控制領域可謂是大放光彩,深受廣大開發者的喜愛。優點就不多說了,後面省去一大堆字……GIt常用的知識點不多,但是所有其他細節內容也絕對不少,本文旨在介紹/記錄常用的知識點,解決日常業務中絕大多數的問題。引用一句話,就是說:

我們可以使用20%的知識,解決80%的問題複製程式碼

如果你問我這句話是誰說的,咳咳~我只能給你個謎一樣的眼神!文章不會再提最最基本的內容,例如安裝等等,如果還不會的就去學學怎麼裝QQ吧。哦,不會!要講的是Git,裝什麼qq!還是學習裝個微信吧~~步入正題,基本的幾個命令:

  • 初始化git專案(前提你裝好git環境,然後在命令列或者類似vscode等編輯器的終端中執行如下指令。這個還不會的自行百度吧),兩種方式,注意區別:

// 在當前目錄新建一個Git程式碼庫
git init
// 在當前目錄新建一個目錄,並在新建的目錄中初始化Git程式碼庫 
git init 新建的資料夾名 // 例如 git init git-study複製程式碼
  • 將檔案提交到暫存區

// 將單個、多個檔案新增到暫存區
git add [file1] [file2]
// 將所有工作區所有改動,新增到暫存區,注意後面有個點
git add .複製程式碼
  • 將暫存區檔案提交到本地倉庫

// 需要新增-m新增備註資訊
git commit -m "備註的資訊"
// 如果不新增-m引數,則會調起編輯器編輯commit的備註資訊,預設是vim複製程式碼

上面這幾個命令相信大家都很熟悉,就先不做過多介紹。唯一值得一提的是vim這塊。vim可能對於很多小夥伴來說不知道怎麼回事,後端的可能一些小夥伴用過或者非常熟悉。

【愣錘筆記】能解決80%場景的Git必會知識點

一些小夥伴在提交本地倉庫的時候忘記加-m引數的時候,經常會遇到這個情況,然後使出九牛二虎之力也搞不好,也沒法刪也沒法改,最後只能默默關掉終端~有木有~

其實這個就是在commit的時候沒有加-m引數,從而調起的預設的vim編輯器。小夥伴們不知道如何解決就是因為對vim沒有了解。解決辦法,很簡單,這裡附上另一篇專門針對這個問題的解決辦法的小文章。如果小夥伴對vim非常感興趣的話,可以去系統的學習。

這裡,只希望對於vim的基本操作有所瞭解,後面還有一些高階操作,需要基於此。


  • commit之後發現提交錯了資訊怎麼辦?

// 當前的這一次提交出現了錯誤,可以通過下面這個命令進入vim進行修改
git commit --amend複製程式碼

例如下圖,我的commit資訊中打錯了一個字,我便可以通過此方式修改。

【愣錘筆記】能解決80%場景的Git必會知識點

然後按照vim的方式,儲存退出即可。此時你再git log檢視一下提交資訊,就會是你想要的了。


  • 檢視所有commit提交記錄

// 只包含提交資訊
git log

// 檢視所有提交記錄的詳細細節
// 包含了具體改動的程式碼
git log -p   // -p是--patch的縮寫

// 檢視簡要統計// 簡要包含了,哪個檔案被改動了
git log --stat複製程式碼

這個檢視commit記錄的命令,相對簡單,就不多說什麼了,可以自己執行一下試試具體的區別就知道了。而在工作中,我們更多的會配合一些視覺化工具,來更好的檢視分支情況/提交情況等等,諾諾~~看下圖紹:

【愣錘筆記】能解決80%場景的Git必會知識點


  • 版本回退

// 回退到上一次提交,一個^代表一次提交
git reset --hard HEAD^
// 回退上上次提交
git reset --hard HEAD^^
// 回退更多次的話,可以使用~符號,例如回退一百次
git reset --hard HEAD~100
// 回退到具體的某一次commit
git reset --hard 某次commit的SHA-1值
例如:git reset --hard ee368ca3aed3e34682859495616ced301bbece34

// 本質移動HEAD和當前branch的指向,並把移動後產生的新的差異放進暫存區
// 直接回退到某次commit,--hard是一個引數,表示指向移動後,重置工作區內容
git reset --hard 0E123213
git reset --hard dev
// 引數--soft會把回退後產生的新差異直接放進暫存區,並保留當前工作目錄
git reset --soft 02e21321
// 不加引數或者引數--mixed,會保留工作目錄,並把暫存區的內容和回退後產生的新差異都放進工作目錄,並清空暫存區
git reset 02e2131231
git reset --mixed 02e123123
複製程式碼

我們能通過git commit提交記錄,自然就能回退記錄。git中版本回退的命令是git reset,預設不加引數,和加引數git reset --mixed是一樣的。這種我們用的不多,更多的是加引數--hard,具體的命令都在上面,註釋也寫的比較詳細。

這裡提一點概念,HEAD在git中其實是指向當前commit的引用,就像js中的引用型別一樣,你也可以把它簡單理解為指標等。而一個^符號代表一次commit,HEAD^就是當前最新的這次commit,HEAD^^是再往前一次commit,以此類推。~n,表示從當前最新的這個commit開始,往前第n個commit,例如:HEAD~1是當前這次commit,等價於HEAD^HEAD~2是前一次commit,等價於HEAD^^

而一個分支branch,其實也只是一組commit記錄。


  • 將某次commit的改動,合併到當前分支

// 首先拷貝需要合併到當前分支的那個commit值的SHA-1值
// 然後在當前分支執行如下命令
git cherry-pick 某次提交的sha-1值 複製程式碼

這也是一個很有用的命令。例如你在dev分支上,突然你需要把beta上面的某次commit合併到當前分支上,那你就可以使用該命令。

這裡需要提一下SHA-1值,關於他更多的內容不去多說,只說一下他是從哪裡得到的,就是git log你可以看到的一長串字元。或者在類似sourceTree的視覺化工具中直接複製就可以了。不多介紹。

  • 儲存

// 儲存已跟蹤檔案的改動和暫存區的內容
// 未被跟蹤的檔案不會被暫存
// 所有的儲存都會被儲存在一個棧上,以期取出
git stash
或
git stash save
// 如果要儲存未被跟蹤的檔案
git stash -u

// 檢視所有暫存
git stash list

// 取出
git stash apply // 取出後棧內還儲存當前儲存記錄,下次可以再次取出當前儲存
git stash pop // 取出後,棧內便刪除當前儲存記錄,可以理解為陣列的pop方法

// 移除儲存記錄
git stash drop 儲存記錄的名字(即git stash list每條記錄開頭顯示的名字)

// 暫存除了暫存區以外的改動
git stash save --keep-index複製程式碼
  • 推送相關

// 如果本地已有專案,可以連線遠端庫
git remote add origin 遠端庫地址

// 檢視遠端庫
git remote
// 檢視遠端庫詳細資訊(包含名稱和地址)
git remote -v

// 推送到遠端分支
git push
// 強制推送,會覆蓋遠端分支;要確保是私有分支
git push -f 

複製程式碼
  • 標籤

// 檢視已打標籤
git tag

// 建立一個標籤,一般會起v1.0.0、 v2.1.1等等
git tag 標籤名
// 建立一個v1.0.0的tag同時,加上備註資訊
git tag v1.0.0 -m"備註資訊內容"

// 檢視標籤資訊
git show 標籤名

// 將本地某個tag上傳到遠端伺服器
git push origin v1.0.0
// 將遠端伺服器沒有的所有本地tag全部上傳
git push origin --tags複製程式碼
  • 分支

// 檢視分支:
git branch

// 建立分支:
git branch 

// 切換分支:
git checkout 
// 本質是簽出,將HEAD指向某個branch,然後簽出這個branch對應的工作目錄
// 因此如下都是可行的
git checkout HEAD^^
git checkout master~2
git checkout 0e2321312

// 建立+切換分支:
git checkout -b 
// 克隆遠端某個分支到本地的新分支
git checkout -b dev origin/dev

// 合併某分支到當前分支:
git merge 

// 刪除本地分支:
git branch -d 
// 刪除遠端分支
git push origin -d 要刪除的分支名 // 誤刪分支
git reflog // 檢視git倉庫引用的移動記錄
// 找到被刪除之前的那次移動記錄的SHA-1
// 切換到那次的commit記錄
// 然後切出一個新分支就好
git checkout 0123123123
git checkout -b 新分支

// 補:檢視某個分支的引用移動記錄
git reflog 分支名

// 檢視所有分支,包括遠端分支
git branch -a複製程式碼
  • 合併當前分支上的多個commit記錄

// 列出要操作的commit
git rebase -i HEAD~次數
// 在調起的vim編輯器中,編輯每條記錄前面的操作型別
// 最上面的是最老的提交
pick 5e187c7dbe8	提交內容1
pick 6d577eb3440	提交內容2
pick f9b9508a3ab	提交內容3
pick 111ab9cc261	提交內容4
// 先2-4的pick改成squash
pick 5e187c7dbe8	提交內容1
squash 6d577eb3440	提交內容2
squash f9b9508a3ab	提交內容3
squash 111ab9cc261	提交內容4
//然後儲存退出,會進入一個設定commit介面的入口
# This is a combination of 4 commits.
# The first commit’s message is:
提交內容1

# The 2nd commit’s message is:
提交內容2

# The 3rd commit’s message is:
提交內容3

# The 4th commit’s message is:
提交內容4# Please enter the commit message for your changes. Lines starting
# with ‘#’ will be ignored, and an empty message aborts the commit.

//這時候需要刪掉對應的commit資訊,設定一個合併後的commit資訊
// 然後儲存退出
// 最後可以git push -f 強推遠端分支複製程式碼
  • 去掉當前分支上的某些commit引用

// 列出當前分支上需要操作的幾次commit
git rebase -i HEAD~次數
// 直接刪除對應的commit
// 在vim中刪除複製程式碼
  • 將某次commit的改動,合併到當前分支

// 首先拷貝需要合併到當前分支的那個commit值的SHA-1值
// 然後在當前分支執行如下命令
git cherry-pick 某次提交的sha-1值複製程式碼
  • 對比區別

// 對比當前工作區與暫存區的內容,即如果你現在git add .的話暫存區會新增哪些內容
git diff

// 對比當前暫存區和本地倉庫的區別,即如果你現在git commit的話,本地倉庫會新增哪些內容
// 完全等價於git diff --cached  不僅意思相同,作用也相同
git diff --staged

// 對比當前工作區與本地倉庫的區別
// 是上面兩種區別的綜合
git diff HEAD複製程式碼
  • 檢視/修改使用者配置資訊

// 檢視
git config user.name
git config user.email

// 修改
git config --global user.name "xxx"
git config --global user.email "xxx"複製程式碼
  • .gitignore檔案規則

1) 空格不匹配任意檔案,可作為分隔符,可用反斜槓轉義
2)以“#”開頭的行都會被 Git 忽略。即#開頭的檔案標識註釋,可以使用反斜槓進行轉義。
3)可以使用標準的glob模式匹配。所謂的glob模式是指shell所使用的簡化了的正規表示式。
4)以斜槓"/"開頭表示目錄;"/"結束的模式只匹配資料夾以及在該資料夾路徑下的內容,但是不匹配該檔案;
"/"開始的模式匹配專案跟目錄;如果一個模式不包含斜槓,則它匹配相對於當前 .gitignore 檔案路徑的內容,
如果該模式不在 .gitignore 檔案中,則相對於專案根目錄。
5)以星號"*"通配多個字元,即匹配多個任意字元;
使用兩個星號"**" 表示匹配任意中間目錄,比如`a/**/z`可以匹配 a/z, a/b/z 或 a/b/c/z等。
6)以問號"?"通配單個字元,即匹配一個任意字元;
7)以方括號"[]"包含單個字元的匹配列表,即匹配任何一個列在方括號中的字元。
比如[abc]表示要麼匹配一個a,要麼匹配一個b,要麼匹配一個c;
如果在方括號中使用短劃線分隔兩個字元,表示所有在這兩個字元範圍內的都可以匹配。
比如[0-9]表示匹配所有0到9的數字,[a-z]表示匹配任意的小寫字母)。
8)以歎號"!"表示不忽略(跟蹤)匹配到的檔案或目錄,即要忽略指定模式以外的檔案或目錄,可以在模式前加上驚歎號(!)取反。
需要特別注意的是:如果檔案的父目錄已經被前面的規則排除掉了,那麼對這個檔案用"!"規則是不起作用的。
也就是說"!"開頭的模式表示否定,該檔案將會再次被包含,如果排除了該檔案的父級目錄,則使用"!"也不會再次被包含。
可以使用反斜槓進行轉義。
複製程式碼

可以通過設定.gitignore檔案的git匹配規則,告知git應該跟蹤哪些檔案和忽略哪些檔案。採用的是標準的glob匹配規則,上面參考網上場景的glob匹配規則,其實就是shell中簡化的正則。需要系統學習的小夥伴可以自行查閱glob相關文件。


通過這些內容:暫存/提交/標籤/分支/回退/變基,可以解決我們日常中絕大部分的版本管理的內容。特別是變基rebase,是非常常用的一個功能。靈活運用這些命令,相信一定能更好的幫助你開發。

如果覺得有用,不妨簡單收藏一下這些命令,忘了時候拿出來瞅一眼!怕啥,瞅一眼能咋滴!!


相關文章