20個你(可能)不知道的Git命令

前端小智發表於2023-01-20
微信搜尋 【大遷世界】, 我會第一時間和你分享前端行業趨勢,學習途徑等等。
本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。

如果你曾經瀏覽過git手冊(或執行man git),那麼你會注意到git的內容比我們大多數人日常使用的多得多。這些命令中有很多是非常強大的,可以讓你的生活變得更輕鬆(其他的則有點小眾,但還是要知道的)。

這篇文章概述了我最喜歡的20個不常用的git功能,你可以使用它們來提升你的開發過程,給同事留下深刻印象,幫助你回答git面試問題,最重要的是 - 讓你有樂趣!

Git Web

執行 git instaweb 可以立即在 gitweb 中瀏覽你的工作儲存庫。

Git有一個內建的web-based visualiser的視覺化工具,用於瀏覽本地倉庫,讓你透過瀏覽器的GUI來檢視和管理你的倉庫。它有很多有用的功能,包括。

  • 瀏覽和瀏覽修訂版,檢查差異、檔案內容和後設資料
  • 直觀地檢視提交日誌、分支、目錄、檔案歷史和附件資料
  • 生成提交和版本庫活動日誌的RSS或Atom feeds
  • 搜尋提交、檔案、更改和差異

要開啟它,只需在你的版本庫中執行git instaweb。你的瀏覽器應該彈出,並載入http://localhost:1234。如果你沒有安裝Lighttpd,你可以用-d標誌指定一個替代的網路伺服器。其他選項可以透過標記(比如-p表示埠,-b表示瀏覽器開啟,等等),或者在你的git config中的[instaweb]塊下配置。

還有git gui命令,它可以開啟一個基於GUI的git應用

image.png

Git Notes

使用git notes為提交新增額外資訊

有時您需要為一個 git 提交附加額外的資料(不僅僅是更改、訊息、日期時間和作者資訊)。

這些註釋儲存在 .git/refs/notes 中,由於它與提交物件資料分開,您可以隨時修改與提交相關的註釋,而不會改變 SHA-1 雜湊值。

你可以用git log、大多數git GUI應用程式或git notes show命令來檢視註釋。一些git主機也在提交檢視中顯示註釋(儘管GH不再顯示註釋)。

Git Bisect

使用git bisect,您可以透過二進位制搜尋找到引入錯誤的提交。

這是最強大但又最容易使用的git命令之一--當涉及到除錯時,bisect絕對是個救星。啟動bisect後,它為你檢查提交,你告訴它該提交是好的(沒有bug),還是壞的(引入了bug),這可以讓你縮小出現bug的最早的提交。

要開始工作,先執行git bisect start,然後用git bisect good <commit-hash>傳遞一個已知的好的提交,用git bisect bad <optional-hash>傳遞一個已知的壞的提交(預設為當前)。然後它將檢查好的和壞的提交之間的提交,然後你用git bisect goodgit bisect bad來指定錯誤是否存在。然後它將重複這個過程,在壞和好的中間檢查出一個提交,一直到你找到引入該錯誤的確切提交。用git bisect reset隨時取消。

bisect命令還有很多內容,包括重放、檢視提交、跳過,所以下次除錯的時候值得看看文件。

Git Grep

》 使用git grep來搜尋程式碼、檔案、提交或其他任何東西,跨越你的 repo

有沒有發現自己需要在git專案的任何地方搜尋一個字串?使用git grep,您可以輕鬆地在整個專案中搜尋任何字串或RegEx,也可以跨分支搜尋(就像一個更強大的Ctrl + F!)。

git grep <regexp><ref></p><p>

它包括很多選項來縮小搜尋範圍,或指定結果格式。例如,使用 -l 只返回檔名,-c 指定每個檔案的匹配數量,-e 排除符合條件的結果,--and 指定多個條件,-n 用行號搜尋。

由於git grepregex相容,你可以對你搜尋的字串進行更高階的處理。
你也可以用它來指定檔案的副檔名,比如git grep 'console.log' *.js會顯示所有JavaScript檔案中的console.logs

第二個引數是ref,可以是分支名、提交、提交範圍,或者其他任何東西。例如,git grep "foo" HEAD~1 會搜尋前一個提交。

Git Archive

使用git archive把整個版本庫合併成一個檔案

當分享或備份一個版本庫時,通常傾向於將其儲存為一個單一的檔案。使用 git archive 將包括所有的 repo 歷史,所以它可以很容易地被提取回它的原始形式。該命令還包括很多額外的選項,所以你可以準確地定製哪些檔案包括在歸檔中,哪些不包括。

git archive --format=tar --output=./my-archive HEAD

Git Submodules

使用git submodule將任何其他倉庫拉入你的倉庫

git中,submodules 讓你把一個版本庫裝入另一個版本庫,通常用於核心依賴關係或把元件分割成獨立的版本庫。更多資訊,請看這個帖子

執行下面的命令將把一個模組拉到指定的位置,同時建立一個.gitmodules檔案,這樣當 repo 被克隆時就會一直下載它。使用 --recursive 標誌,在克隆 repo 時包括子模組。

Git Bug Report

使用git bugreport來編寫一份bug ticket,包括git和系統資訊

這個命令將捕獲系統資訊,然後開啟一個標準的bug模板(重現步驟,實際+預期輸出,等等)。完成的檔案應該是一個非常完整的bug報告,包括所有必要的資訊。

如果你是一個開源包的維護者,並要求使用者(開發者)提出一個bug報告,這就非常方便了,因為它可以確保包括所有必要的資料。

如果你要向核心git系統提出一個bug報告,你也可以執行git diagnose命令,然後在這裡提出你的問題。

Git Fsck

使用 git fsck 檢查所有物件,或恢復無法到達的物件

雖然不是經常需要,但有時你可能需要驗證git儲存的物件。這就是fsck(或稱檔案系統檢查)的作用,它測試物件資料庫,驗證所有物件的SHA-1 ID以及它們的連線。

它也可以和--unreachable標誌一起使用,以找到不再能從任何命名的引用中到達的物件(因為與其他命令不同,它包括.git/objects中的所有內容)。

Git Stripspace

使用git stripspace來格式化給定檔案中的空白處

最好的做法是避免在行尾留白,避免出現多個連續的空行,避免在輸入的開頭和結尾出現空行,並以新行結束每個檔案。有很多特定語言的工具可以自動做到這一點(比如prettier),但Git也有這個內建功能。

它主要用於後設資料(提交資訊、標籤、分支描述等),但如果你用管道將檔案輸送給它,然後再將響應輸送回檔案,它也能發揮作用。例如,cat ./path-to-file.txt | git stripspacegit stripspace < dirty-file.txt > clean-file.txt

你也可以用它來刪除註釋(用--strip-comments),甚至是註釋行(用--comment-lines)。

Git Diff

git diff 可以比較兩組程式碼之間的差異

您可能知道,您可以執行 git diff 來顯示自上次提交以來的所有更改,或者使用 git diff <commit-sha> 來比較 2 個提交,或 1 個提交到 HEAD。但你可以用diff命令做的事情還有很多。

你也可以用它來比較任意兩個檔案,比如 diff file-1.txt file-2.txt (不用再訪問 diffchecker.com 了!)。

或者用git diff branch1...branch2來比較兩個分支,或者相互參照。

注意,雙點(...)與空格相同,表示diff輸入應該是分支的頂端,但你也可以用三點(...)將第一個引數轉換成兩個diff輸入之間共享的共同祖先提交的ref--非常有用 如果你只想在不同分支間比較一個檔案,只需將檔名作為第三個引數傳入。

你可能想看某個日期範圍內的所有改動,為此使用git diff HEAD@{7.day.agree} HEAD@{0}(上週),這也可以與檔名、分支名、特定提交或任何其他引數配對。

還有git range-diff命令,它提供了一個比較提交範圍的簡單介面。

git diff工具還有很多功能(以及使用你自己的diff檢查器的選項),所以我建議你去看看文件

Git Hooks

當一個給定的獲取動作發生時,使用 hooks 來執行命令或執行指令碼。

Hooks 可以讓你實現幾乎任何事情的自動化。例如:確保符合標準(提交訊息、分支名稱、補丁大小),程式碼質量(測試、lint),為提交附加額外資訊(使用者、裝置、ticket ID),呼叫webhook記錄事件或執行管道,等等。

大多數git事件都有前鉤和後鉤,比如提交、重定位、合併、推送、更新、applypatch等。

鉤子儲存在.git/hooks中(除非你用git config core.hooksPath在其他地方配置它們),並且可以用git hook命令來測試。由於它們只是shell檔案,它們可以用來執行任何命令。

Hooks 不會被推送到遠端倉庫,所以要在你的團隊中分享和管理它們,你需要使用一個鉤子管理器,比如lefthookhusky。也有一些第三方工具,使管理 hooks 更容易,我推薦overcommit

記住,hooks 總是可以被跳過的(用--no-verify標誌),所以永遠不要純粹依賴鉤子,特別是與安全有關的東西。

Git Blame

使用git blame來顯示特定修訂和行的作者資訊

一個經典的方法,快速找出誰寫了一行特定的程式碼(也就是你的同事要為這個錯誤負責!)。但它也可以用來確定在哪個時間點改變了什麼,並檢查該提交和相關後設資料。

例如,要檢視index.rs第400至420行的作者和提交資訊,你需要執行。

git blame -L 400,420 index.rs

Git LFS

使用git lfs儲存大檔案,不拖累你的 repo

通常你的專案會包含較大的檔案(如資料庫、二進位制資產、檔案或媒體檔案),這將拖慢git的工作流程並超出使用限制。這就是大檔案儲存的作用--它使你能夠將這些大的資產儲存在其他地方,同時保持它們在git中的可追蹤性,並保持相同的訪問控制/許可權。LFS的工作原理是將這些大檔案替換成文字指標,在git中進行跟蹤。

要使用它,只需執行git lfs track <file glob>,它將更新你的.gitattributes檔案。你可以透過檔案的副檔名(比如*.psd)、目錄或單獨指定檔案。執行git lfs ls-files可以檢視被追蹤的LFS檔案的列表。

Git GC

使用 git gc 來最佳化你的版本庫

隨著時間的推移,git 倉庫會積累各種型別的垃圾,這些垃圾會佔用磁碟空間,並拖慢行動。這就是內建垃圾收集器的作用。執行git gc將刪除無主的和不可訪問的提交(用git prune),壓縮檔案修訂和儲存的git物件,以及其他一些一般的內務工作,如打包Refs、修剪reflog、revere metadata或陳舊的工作樹和更新索引。

新增 --aggressive 標誌將積極地最佳化版本庫,丟棄任何現有的deltas並重新計算,這需要更長的執行時間,但如果你有一個大的版本庫,可能會需要。

Git Show

使用 git show 可以輕鬆檢查任何 git 物件。

輸出物件(blob、樹、標籤或提交)以易於閱讀的形式。要使用,只需執行 git show <object>。您還可能希望附加 --pretty 標誌,以獲得更清晰的輸出,但還有許多其他選項可以自定義輸出(使用 --format),因此此命令對於顯示您需要的內容非常有用。

一個很有用的例子是,在另一個分支中預覽檔案,而無需切換分支。只需執行 git show branch:file

Git Describe

使用 git describe 找到一個提交中可觸及的最新標籤,並給它一個人類可讀的名字

執行git describe,你會看到一個人類可讀的字串,它是由最後一個標籤的名字和當前提交的內容組合而成的,生成一個字串。你也可以向它傳遞一個特定的標籤。

請注意,你必須已經建立了標籤才行,除非你附加了 --all 標誌。Git describe 預設情況下只使用帶註釋的標籤,所以你必須指定 --tags 標誌,讓它也使用輕量級標籤。

Git Tag

使用git tag標記你的版本庫歷史中的特定點

能夠標記版本庫歷史上特定的、重要的點通常很有用,最常用來表示版本。建立一個標籤就像git tag <tagname>一樣簡單,或者你可以用git tag -a v4.2.0 <commit sha>標記一個歷史提交。和提交一樣,您可以用 -m 在標籤旁邊加上一條資訊。

別忘了用 git push origin <tagname> 把你的標籤推送到遠端。
要列出所有標籤,只需執行git tag,並可選擇使用-l進行萬用字元搜尋。
然後你就可以用git checkout <tagname> 簽出一個特定的標籤。

Git Reflog

使用git reflog列出你的 repo上的所有更新

Git 使用一種叫做參考日誌,或 "reflogs "的機制來跟蹤分支頂端的更新。各種事件被追蹤,包括:克隆、拉、推、提交、簽出和合並。能夠找到一個事件的參考往往很有用,因為許多命令都接受參考作為引數。只要執行git reflog來檢視HEAD上最近的事件。

reflog 非常有用的一件事是恢復丟失的提交。Git 從來不會丟失任何東西,即使是在重寫歷史的時候(比如重寫或修正提交)。Reflog 允許你回到提交,即使它們沒有被任何分支或標籤所引用。

預設情況下 reflog 使用 HEAD(你當前的分支),但你可以在任何 ref 上執行 reflog。例如 git reflog show <branch name>,或者用 git reflog stash 來檢視隱藏的修改。或者用git reflog show --all來顯示所有的引用。

Git Log

使用 git log 來檢視提交列表

你可能已經很熟悉執行 git log 來檢視當前分支上最近的提交列表了。但你還可以用 git log 做一些別的事情。

使用 git log --graph --decorate --oneline 會顯示一個漂亮的、整齊的提交圖以及 ref pointers。

image.png

你還經常需要能夠根據各種引數來過濾日誌,其中最有用的是。

  • git log --search="<anything>" - 搜尋特定程式碼修改的日誌
  • git log --author="<pattern>" - 只顯示特定作者的日誌
  • git log --grep="<pattern>" - 使用搜尋詞或重組詞過濾日誌
  • git log <since>...<until> - 顯示兩個引用之間的所有提交內容
  • git log -- <file> -- 顯示所有隻對某一特定檔案做出的提交

或者,只需執行git shortlog就可以得到一個夏季的提交列表。

Git Cherry Pick

使用 git cherry-pick 來透過引用挑選指定的提交,並將其追加到工作的 HEAD 中。

有時你需要從其他地方拉出一個特定的提交,到你當前的分支。這在應用熱修復、撤銷修改、恢復丟失的提交以及某些團隊協作中非常有用。需要注意的是,傳統的合併通常是更好的做法,因為挑選提交會導致日誌中出現重複的提交。

使用方法很簡單,只需執行git cherry-pick <commit-hash>。這將把指定的提交拉到你的當前分支。

Git Switch

使用git switch

在分支間移動是我們經常做的事情,switch 命令就像是 git checkout 的簡化版,它可以用來建立和瀏覽不同的分支,但與 checkout 不同的是,在分支間移動時不會複製修改過的檔案。

checkout -b 類似,switch 命令可以附加 -c 標誌來建立一個新的分支,並直接跳入其中,例如 git switch -c <新分支>。而執行git switch - 會丟棄你所做的任何實驗性修改,並返回到你之前的分支。

Git Standup

使用git standup來回憶你在上一個工作日所做的事情,基於git提交的內容

我把這個放在最後,因為它不包括在大多數git客戶端中,但你可以用你的系統包管理器,用一個單行的curl指令碼,或者從原始碼構建來輕鬆安裝它。

如果你的老闆要求你每天做一個總結,對昨天的工作進行更新,但你總是記不住你到底做了什麼--這個是為你準備的 它將顯示一個格式良好的列表,列出在給定時間範圍內所做的一切。使用方法很簡單,只要執行git standup,或者使用這些選項來指定應該顯示的資料(作者、時間範圍、分支等。

原文:https://leerob.substack.com/p...

編輯中可能存在的bug沒法實時知道,事後為了解決這些bug,花了大量的時間進行log 除錯,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug

交流

有夢想,有乾貨,微信搜尋 【大遷世界】 關注這個在凌晨還在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。

相關文章