git 命令寫成指令碼 6 條 Git 實用技巧

2021-10-13 21:12:41 字數 3281 閱讀 9971

本文首次發表在 6 條 git 實用技巧 -- 泰曉科技

下面是大綱,文末有彩蛋 ^_^

1. 通過 git blame 找到誰動了某行**

2. 通過 git log 獲取某筆 commit 或 tag 的提交時間

3. 通過 git bisect 自動二分法快速定位問題

4. 用 git submodule sync 更新 git submodule 的遠端倉庫位址

5. 為不同 git 倉庫配置不同的 ssh key

6. 用 git fetch 取代 git clone,實現斷點續傳

$ cd linux-stable

$ git blame -l 50,50 init/main.c

78634061 (frederic weisbecker 2017-10-27 04:42:28 +0200 50) #include

在分析衰退時,如果找到了某筆變更,然後,又想進一步確定這筆變更是在哪個版本(tag)引入的,這個時候可以先找一下該 commit 的時間,然後再比對 tag 的修訂時間。那麼如何檢視 commit 和 tag 的引入時間呢?以head這筆 commit 舉例如下:

$ date -d @`git log -1 --format=%ct head` +%y%m%d-%h%m%s

20190719-172216

head替換為具體的 commit 和 tag 號即可獲得對應時間。對於 linux 而言,通常不需要這麼複雜,在找到某個變更之後,用下面這個方法就可以確定該變更對應的核心主版本:

$ git show head:makefile
因為 makefile 中記錄了核心的版本號。

某個系統,在開發過程中一直都沒測試出問題,突然有一天,發現 bug。這種蠻多情況是衰退,如果這個 bug 的復現機率很大的話,就可以直接用二分法快速定位了。git bisect就可以輔助進行自動二分法。

簡單的話,就是不停地告訴git bisect,哪乙個是好的,哪乙個是壞的,如果有固定的復現指令碼,那麼在獲得第一對bad, good的 commit 後,就可以直接讓git bisect自動二分法。舉例說明:

$ git bisect start

$ git bisect bad efa5cf

$ git bisect good b6fcf0

$ git bisect run grep -q uconfig makefile

說明: 在設定完bad, good後,git bisect會自動切出中間某個版本,然後針對這個版本,可以進行配置、編譯、執行,然後根據測試結果設定該版本為bad or good,例如:git bisect bad head,以此類推,git bisect會不停地切出中間版本,直到可以判斷第乙個 bad 的版本,這個版本就是引入衰退的變更。

這個完整的測試過程如果可以自動化,就可以寫成指令碼,作為git bisect run的引數,這樣就可以避免手動跑測試。上面的 grep 命令是經過初步分析後,找出的簡化策略。如果都能這樣通過檢索**變更本身就可以判斷問題,那確實可以省去不少力氣。

前段我們把很多倉庫從 github 搬到了 gitee,搬完以後 linux lab 下的.gitmodules.git/config都得更新 url 位址,但是更新完以後並不能直接用,還得用git submodule sync同步一下:

例如,給碼雲的私鑰檔案命名為gitee.id_rsa,把它放到~/.ssh目錄下並修改許可權。

$ chmod 600 ~/.ssh/gitee.id_rsa

$ chmod 700 ~/.ssh

之後,新增乙個~/.ssh/config,加入如下配置:

$ cat ~/.ssh/config

host gitee

hostname gitee.com

identityfile ~/.ssh/gitee.id_rsa

user git

$ git clone gitee:aaaa/yyyy.git

$ cd cloud-lab

$ touch ***x

$ git add ***x

$ git commit -s -m "add ***x"

$ git push gitee:aaaa/yyyy.git master

因為git clone沒有實現斷點續傳,不知道開發者腦子「進了什麼水」?linus 求罵嗎?;-)

沒關係,用git fetch可以實現類似效果,而且極其簡單。

先用 git init 建立乙個空目錄:

$ mkdir test-repo

$ cd test-repo

$ git init

再在裡頭用git fetch要 clone 的倉庫:

$ git fetch 

$ git checkout -b master fetch_head

git fetch只能乙個乙個 branch fetch,fetch 完,把fetch_headcheckout 出來新建對應的分支即可。如果git fetch中途中斷網路,可以再次git fetchgit fetch可以續傳,不至於一斷網就前功盡棄。

git fetch 斷點續傳效果演示:showterm

git命令(其他6)

git命令參考 git命令輸入 git config global user.name username git config global user.email email git config user.name git config user.email git常用 git clone url...

25條常用的git命令

1 建立乙個新分支 git branch newbranch2 拉取stg分支的內容到此分支 git pull origin master3 將本地分支推送到伺服器 git push origin newbrach4 檢視歷史記錄 git log5 檢視簡潔log日誌 git log pretty ...

40條最常用Git命令總結

1.git檔案操作 git基本操作 初始化 git initinitialized empty git repository in e git test2018 git 查詢狀態 git statuson branch master initial commit untracked files us...