【技术工具】源码管理 - GIT工具
【技术工具】源码管理 - 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