【技術工具】源碼管理 - GIT工具
1 前言
之前參考語雀一位大佬的,但鏈接找不到了,僅供參考。
- 1、檢查空白錯誤
//確認將提交的內容中有無空白信息
git diff --check
- 2、嘗試讓每一個提交成為一個邏輯的獨立變更集
- 盡量使每筆提交都成為獨立的patch,這讓你的同事審查你的改動時盡量讓事情容易。
- 3、重寫提交歷史
- 正式提交之前,可以通過修改本地提交歷史讓提交后的信息更加易懂。
- 4、規范化提交信息
2 提交模板
1、git config
~$ git config --global -e
....
#添加
[commit]template = /home/mi/.gitmessage
2、配置模板
~$ vim ~/.gitmessage#title [where/what]#JIRA-ID #brief description for this bug [what/why]#Change-Id:auto-generate
3、提交使用模板
~$ git commit -s #盡量不用 git commit -m "xx"
4、查看提交記錄
~$ git log --no-merges
3 生成patch
# 生成patch
git diff ./ > xxx.patch #將差異的內容制作成patch
mkdir update && git diff commit-id-time1 commit-id-time2 --name-only | xargs -i cp '{}' ./update/ --parents #制作patch 把兩個commit-id 之間修改的文件復制到update目錄中 而且會把中間的目錄也一并生成# 打patch
patch -p1 < xxx.patch
4 子模塊管理
- 子模塊允許你將一個Git倉庫當作另一個GIt倉庫的子目錄,這允許你克隆另一個倉庫到你的項目中并保持你的提交相對獨立配置文件再
.gitmodules
。 - 1)命令速查
git submodule --help # 查看說明## 克隆代碼時帶上子模塊
git clone --recurse-submodules <repository>## 初始化本地.gitmodules文件
git submodule init## 添加子模塊
git submodule add <repository> [<path>]## 拉取所有子模塊
git submodule foreach git pull## 更新子模塊
git submodule update --init --recursive --remote [<path>]
git submodule foreach git submodule update## 將子模塊切到指定分支
git submodule set-branch -b master [<path>]
5 貯藏和清理
- 貯藏(stash)會處理工作目錄的臟狀態 - 即跟蹤文件的修改和暫存的改動。
- 命令
$ git stash push # stash跟蹤文件的修改與暫存的改動
$ git stash push --keep-index # --keep-index 選項使存儲的同時保留索引。
$ git stash push --all # -u 選項存儲untracked文件,
$ git stash push -u # stash全部文件(包括被忽略文件)$ git stash list # 列出當前的stash
$ git stash apply # 應用stash, 加上--index 選項可以讓之前暫存的文件重新暫存
$ git stash drop stash@{0} # 移除stash,
$ git stash pop # 應用stash@{0},并移除它$ git stash branch dev # 創建新分支dev,然后應用stash,然后drop stash$ git clean -f -d # 移除工作目錄中所有未追蹤的文件以及空的子目錄(不包括被忽略文件)
$ git clean -n # 演戲以下,加-n參數
$ git clean -n -x # -x選擇清理忽略文件
$ git clean -x -i # -i交互模式
6 還原提交
git revert HEAD # 撤銷當前HEAD指向的patch上的更改git revert commit # 撤銷制定commitid表示的patch上的更改# merge之后的revert
git revert -m 1 HEAD # HEAD指向的節點有兩個父節點,-m 1保留父節點1,撤銷父節點2帶來的改變
7 重置操作
# 作用于某個patch
git reset --soft [patch] #移動HEAD的指向,不改變Index和Work Directory
git reset --mixed [patch] #(默認reset)移動HEAD的指向,改變Index,但不改變Work Directory
git reset --hard [patch] #移動HEAD的指向,改變Index和Work Directory# 作用于某個path/file
git reset [path/file] #通過當前HEAD指向的patch改變當前Index(恢復暫存區)
git reset [patch] [path/file] #通過指定patch改變當前Index# 壓縮提交
git reset --soft [patch] #HEAD移動到壓縮提交的前一個patch,Index和Work Directory不變
git commit #通過Index創建新的patch
8 查看歷史
# 常規使用
git log --oneline --graph --all #簡略顯示各種分支的patch記錄,個人比較下常用這個命令
git log --stat # 顯示每次提交的文件修改統計信息。
git log -p # 按補丁格式顯示每個提交引入的差異。# 定制化輸出
# - --date=format定制作者修訂日期格式
# - --pretty=format定制log記錄顯示
# - --graph圖形顯示分支與合并歷史
# - --all顯示所有分支
git log --pretty=format:"%h %s" --graph
git log --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:"%h-%an-%ad-%ae" --graph --all# 過濾出自己想要看到的log
git log -3 #按次數,最近3次提交log
git log --since=2.weeks #按時間,最近兩周提交log
git log --until=2020-03-20 #按時間,2020-03-20前的提交log
git log --grep="update" #僅顯示提交說明中包含"update"的提交# 如果要在 Git 源碼庫中查看 Junio Hamano 在 2008 年 10 月其間, 除了合并提交之外的哪一個提交修改了測試文件,可以使用下面的命令:
git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \--before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch
9 遠程同步
- 從遠程獲取最新的patch或分支,引用的信息記錄到
.git/FETCH_HEAD
### 從gerrit上取一個patch,然后pick到當前分支
git fetch ssh://wangjianfeng1@git.mioffice.cn:29418/device/xiaomi/merlin refs/changes/17/909617/1
git cherry-pick FETCH_HEAD### 獲取遠程庫的分支更新,然后merge到本地分支
git fetch origin master:tmp #從遠程倉庫master分支獲取最新,在本地建立tmp分支
git diff tmp #將當前分支和tmp進行對比
git merge tmp #合并tmp分支到當前分支
10 文件標注
mi@ubuntu:base$ git blame Android.bp -L 230,231 #查看Android.bp的230-231行提交記錄,
#commit id #提交者 #時間 #行 #內容
7c469179ce2a (junyulai 2019-01-16 20:23:34 +0800 230) "core/java/android/net/ISocketKeepaliveCallback.aidl",
e40eab608af2 (Benedict Wong 2018-11-14 17:50:13 -0800 231) "core/java/android/net/ITestNetworkManager.aidl",
11 二分法查找
# 開始
$ git bisect start # 啟動二分
$ git bisect bad # 當前提交有bug
$ git bisect good <good_commit> #指定已知的最后一次正常狀態是哪次提交# 測試 --> 二分判斷
$ git bisect good # 當前提交無bug
$ git bisect bad # 當前提交有bug# 結束
$ git bisect reset