微信搜尋 【大遷世界】, 我會第一時間和你分享前端行業趨勢,學習途徑等等。
本文 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應用
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 good
或git 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 grep
與regex
相容,你可以對你搜尋的字串進行更高階的處理。
你也可以用它來指定檔案的副檔名,比如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 stripspace
或 git 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 不會被推送到遠端倉庫,所以要在你的團隊中分享和管理它們,你需要使用一個鉤子管理器,比如lefthook
或husky
。也有一些第三方工具,使管理 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。
你還經常需要能夠根據各種引數來過濾日誌,其中最有用的是。
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 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。