6 條 Git 實用技巧

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

本文彙總最近一段時間用到的幾則 Git 實用小技巧,歡迎分享。git

經過 git blame 找到誰動了某行代碼

定位到出錯的代碼行 之後,就能夠經過 git blame 進一步找到誰動了相關代碼,或者找到這筆改動的歷史背景,舉例以下:github

$ cd linux-stable
$ git blame -L 50,50 init/main.c
78634061 (Frederic Weisbecker 2017-10-27 04:42:28 +0200 50) #include <linux/sched/isolation.h>
複製代碼

經過 git log 獲取某筆 commit 或 tag 的提交時間

在分析衰退時,若是找到了某筆變動,而後,又想進一步肯定這筆變動是在哪一個版本(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 而言,一般不須要這麼複雜,在找到某個變動以後,用下面這個方法就能夠肯定該變動對應的內核主版本:ssh

$ git show HEAD:Makefile
複製代碼

由於 Makefile 中記錄了內核的版本號。測試

經過 git bisect 自動二分法快速定位問題

某個系統,在開發過程當中一直都沒測試出問題,忽然有一天,發現 Bug。這種蠻多狀況是衰退,若是這個 Bug 的復現概率很大的話,就能夠直接用二分法快速定位了。git bisect 就能夠輔助進行自動二分法。fetch

簡單的話,就是不停地告訴 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
複製代碼

說明:url

  • efa5cf:第一個發現有問題的版本
  • b6fcf0:某個確認沒問題的版本
  • grep -q UCONFIG Makefile:能找到 UCONFIG 就是好的,找不到就是有問題

在設定完 bad, good 後,git bisect 會自動切出中間某個版本,而後針對這個版本,能夠進行配置、編譯、運行,而後根據測試結果設定該版本爲 bad or good,例如:git bisect bad HEAD,以此類推,git bisect 會不停地切出中間版本,直到能夠判斷第一個 bad 的版本,這個版本就是引入衰退的變動。spa

這個完整的測試過程若是能夠自動化,就能夠寫成腳本,做爲 git bisect run 的參數,這樣就能夠避免手動跑測試。上面的 grep 命令是通過初步分析後,找出的簡化策略。若是都能這樣經過檢索代碼變動自己就能夠判斷問題,那確實能夠省去很多力氣。

用 git submodule sync 更新 git submodule 的遠程倉庫地址

前段咱們把不少倉庫從 github 搬到了 gitee,搬完之後 Linux Lab 下的 .gitmodules.git/config 都得更新 url 地址,可是更新完之後並不能直接用,還得用 git submodule sync 同步一下:

  • 第 1 步,用 sed 替換 .gitmodules.git/config 中的 url
  • 第 2 步,執行 git submodule sync

爲不一樣 Git 倉庫配置不一樣的 ssh key

爲優化下載效率,最近把 Linux Lab 遷移到了碼雲,配置了不一樣的 ssh 私鑰/公鑰。爲了不在命令行每次都要額外指定不一樣的參數,能夠添加一個配置文件。

例如,給碼雲的私鑰文件命名爲 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@

$ git clone gitee:aaaa/yyyy.git

$ cd cloud-lab
$ touch xxxx
$ git add xxxx
$ git commit -s -m "add xxxx"

$ git push gitee:aaaa/yyyy.git master
複製代碼

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

git clone 下載大型代碼倉庫時,一旦網絡中斷,後果是哭爹喊娘,可是於事無補,叫每天不該。

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

不要緊,用 git fetch 能夠實現相似效果,並且極其簡單。

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

$ mkdir test-repo
$ cd test-repo
$ git init
複製代碼

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

$ git fetch https://gitee.com/tinylab/cloud-lab.git
$ git checkout -b master FETCH_HEAD
複製代碼

git fetch 只能一個一個 branch fetch,fetch 完,把 FETCH_HEAD checkout 出來新建對應的分支便可。若是 git fetch 中途中斷網絡,能夠再次 git fetchgit fetch 能夠續傳,不至於一斷網就前功盡棄。

送您一枚免費體驗卡

更多 Linux 精彩歡迎透過下方免費體驗卡訪問『Linux 知識星球』:

『Linux 知識星球』免費體驗卡
相關文章
相關標籤/搜索