如果您曾經瀏覽過 git 手冊(或執行 man git),那麼您會發現 git 指令比我們每天在用的多很多。很多指令非常強大,可以讓你的生活更輕鬆(有些比較小眾,但知道一下還是不錯)。

這篇文章整理了我最喜歡的 20 個冷門 git 功能,您可以使用來改善您的開發流程、給您的同事留下深刻印象、幫助您回答 git 面試問題,最重要的是 - 可以玩得很開心!

原文出處:https://dev.to/lissy93/20-git-commands-you-probably-didnt-know-about-4j4o


Git Web

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

Git 有一個內建的基於網路可視化工具 可以瀏覽本地存儲庫,它允許您通過瀏覽器中的 GUI 查看和管理您的存儲庫。它包含許多有用的功能,包括:

  • 瀏覽和單步執行修訂並檢查差異、文件內容和元資料
  • 可視化查看提交日誌、分支、目錄、文件歷史和附加資料
  • 生成提交和存儲庫活動日誌的 RSS 或 Atom 提要
  • 搜尋提交、文件、更改和差異

要打開它,只需從您的存儲庫中執行 git instaweb。您的瀏覽器應該會彈出並讀取 http://localhost:1234 。如果您沒有安裝 Lighttpd,您可以使用“-d”標誌指定一個備用 Web 伺服器。其他選項可以通過標誌配置(例如 -p 用於端口,-b 用於打開瀏覽器等),或在 git 配置中的 [instaweb] 塊下配置。

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


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 在除錯時絕對是救命稻草。開始對分後,它會為您檢查提交,然後您告訴它提交是“好”(沒有錯誤)還是“壞”(引入錯誤),這可以讓您縮小最早提交的錯誤。

請執行 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 在您的存儲庫中搜尋程式碼、文件、提交或任何其他內容

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

git grep <regexp> <ref>

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

由於 git grep 與正則表達式兼容,因此您可以使用搜尋的字串獲得更多進階訊息。

您還可以使用它來指定文件擴展名,例如 git grep 'console.log' *.js,它將顯示 JavaScript 文件中的所有 console.logs

第二個參數是一個 ref,可以是分支名稱、提交、提交範圍或其他任何內容。例如。 git grep "foo" HEAD~1 將搜尋之前的提交。


Git Archive

使用 git archive 將整個 repo 合併到一個文件中

共享或備份存儲庫時,通常首選將其存儲為單個文件。使用 git archive 將包括所有 repo 歷史記錄,因此可以輕鬆將其提取回其原始形式。該命令還包括許多附加選項,因此您可以準確自定義存檔中包含和不包含的文件。

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

Git Submodules

使用 git submodule 將任何其他存儲庫拉入您的存儲庫

在 git 中,submodules 讓您可以將一個存儲庫掛載到另一個存儲庫中,通常用於核心依賴項或將組件拆分到單獨的存儲庫中。有關詳細訊息,請參閱這篇文章

執行以下命令會將模塊拉到指定位置,並建立一個 .gitmodules 文件,以便在複製 repo 時始終下載它。複製 repo 時使用 --recursive 標誌來包含子模塊。

git submodule add https://github.com/<user>/<repo> <path/to/save/at>

還有 git subtree,它做類似的事情,但不需要元資料文件。


Git Bug Report

使用 git bugreport 編寫錯誤票,包括 git 和系統訊息

此命令將捕獲系統訊息,然後打開一個標準錯誤模板(重現步驟、實際 + 預期輸出等)。完成的文件應該是一個非常完整的錯誤報告,包含所有必要的訊息。

如果您是開源包的維護者並要求用戶(開發人員)提出錯誤報告,這將非常方便,因為它確保包含所有必要的資料。

如果您向核心 git 系統提交錯誤報告,您還可以執行 git diagnostic 命令,然後提出您的問題 這裡


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 你可以比較 2 組程式碼之間的差異

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

您還可以使用它來比較任意兩個任意文件,使用 diff file-1.txt file-2.txt(不再存取 diffchecker.com! )

或者使用 git diff branch1..branch2 相互比較 2 個分支或引用

請注意,雙點 (..) 與空格相同,表示 diff 輸入應該是分支的尖端,但您也可以使用三點 (...) 來轉換第一個參數進入兩個差異輸入之間共享的共同祖先提交的引用 - 非常有用!如果只想跨分支比較單個文件,只需將文件名作為第三個參數傳遞。

您可能希望查看在給定日期範圍內所做的所有更改,為此使用 git diff HEAD@{7.day.ago} HEAD@{0}(上週),同樣可以將其與文件名、分支名稱、特定提交或任何其他參考。

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

git diff 工具還有更多功能(以及使用您自己的差異檢查器的選項),因此我建議查看 文檔 .


Git Hooks

使用 hooks 在給定的 get 操作發生時執行命令或執行腳本

Hooks 可以讓你自動化幾乎所有的事情。例如:確保滿足標準(提交訊息、分支名稱、補丁大小)、程式碼質量(測試、lint)、將附加訊息附加到提交(用戶、設備、票證 ID)、呼叫 webhook 來記錄事件或執行管道等

對於大多數 git 事件,如 commit, rebase, merge, push, update, applypatch 等,都有前後 hooks available

鉤子存儲在 .git/hooks 中(除非您使用 git config core.hooksPath 在其他地方配置它們),並且可以使用 git hook 進行測試/git-hook) 命令。由於它們只是 shell 文件,因此可用於執行任何命令。

掛鉤不會推送到遠程存儲庫,因此要在您的團隊中共享和管理它們,您需要使用 掛鉤管理器 ,例如 lefthookhusky。還有幾個3rd-party tools,這使得管理鉤子更容易,我推薦overcommit

請記住,掛鉤總是可以跳過(使用 --no-verify 標誌),所以永遠不要純粹依賴掛鉤,尤其是對於任何與安全相關的事情。


Git Blame

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

一個經典的,快速找出誰寫了特定程式碼行(也就是你的哪個同事應該為這個錯誤負責!)。但它也有助於確定在哪個時間點發生了某些更改並檢查該提交和關聯的元資料。

例如,要查看 index.rs 第 400 到 420 行的作者和提交訊息,您可以執行:

git blame -L 400,420 index.rs

Git LFS

使用 git lfs 存儲大文件,以免拖慢您的存儲庫

您的專案通常會包含較大的文件(例如資料庫、二進制資產、檔案或媒體文件),這會減慢 git 工作流程並使使用限制達到最大。這就是 大型文件存儲 的用武之地 - 它使您能夠將這些大型資產存儲在其他地方,同時使它們可以通過 git 進行跟踪並保持相同的存取控制/權限。 LFS 的工作原理是將這些較大的文件替換為在 git 中跟踪的文本指針。

要使用它,只需執行 git lfs track <file glob>,這將更新您的 .gitattributes 文件。您可以通過擴展名(例如“*.psd”)、目錄或單獨指定文件。執行 git lfs ls-files 以查看跟踪的 LFS 文件列表。


Git GC

使用 git gc 優化您的存儲庫

隨著時間的推移,git repos 會積累各種類型的垃圾,這些垃圾會佔用磁盤空間並減慢操作速度。這就是內置垃圾收集器的用武之地。執行 git gc 將刪除孤立的和不可存取的提交(使用 git prune),壓縮文件修訂和存儲的 git 物件,以及一些其他一般的內務管理任務,如打包引用、修剪引用日誌、尊重元資料或陳舊的工作樹和更新索引。

加入 --aggressive 標誌將 積極優化 存儲庫,丟棄任何現有的增量並重新計算它們,這需要更長的時間執行但如果你有一個大型存儲庫可能需要。


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 在你的 repo 歷史中標記一個特定點

能夠標記 存儲庫歷史記錄中最常用於表示發布版本的特定重要點通常很有用。建立標籤就像 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 列出對您的存儲庫所做的所有更新

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 指針。

示例 git 日誌輸出

您還經常需要能夠根據各種參數過濾日誌,其中最有用的是:

  • 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 客戶端中,但是您可以使用系統包管理器輕鬆安裝 ,使用 1 行 curl 腳本,或從源程式碼建置。

如果您的老闆要求您每天站立一次,以更新昨天的工作,但您永遠記不起自己到底做了什麼——這個適合您!它將顯示一個格式良好的列表,列出在給定時間範圍內完成的所有事情。用法很簡單,只需執行 git standup,或使用 這些選項 指定應顯示哪些資料(作者、時間範圍、分支機構等)。


結論

希望對您有幫助!


共有 0 則留言