本文正在参加「金石计划 . 瓜分6万现金大奖」
大家好,我是 shixin。
前段时刻完成了一个中心代码维护的功能,方针在关键代码被修正及时同步给其他人,防止没经过 review 就上线导致问题,提示的效果图如下:
在实现的过程中,用到一些平时运用不多的 Git 技巧,这篇文章来总结一下。
怎么获取当时提交用户信息
这个比较简单,经过 git config user.name
即可:
04318deMacBook-Pro % git config user.name
zhangshixin
git config 保存了很多配置信息,其间常用的有自界说快捷键、用户信息、项目地址、分支信息等:
504318deMacBook-Pro % git config -l
//快捷键 begin >>> 咱们能够界说自己的 git 快捷键
alias.st=status
alias.co=checkout
alias.cb=checkout
alias.p=pull
alias.pr=pull
alias.pu=push
alias.cm=commit
alias.br=branch
alias.cm=commit
alias.undo=reset
alias.rbc=rebase
alias.save=stash
alias.pop=stash
//快捷键 end <<< 咱们能够界说自己的 git 快捷键
//用户称号和邮箱 begin >>>
user.name=zhangshixin
user.email=shixin.zhang@xxx.com
//用户称号和邮箱 end <<<
//项目和分支信息 begin >>>
remote.origin.url=git@gitlab.xxx:android/xxx.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.Canary.remote=origin
branch.Canary.merge=refs/heads/Canary
//项目和分支信息 end <<<
pull.rebase=true //默许 pull 是 merge 还是 rebase
怎么获取当时分支
为了削减提示频率,最好只检测中心的分支的提交(包含 merge commit)。怎么获取当时分支呢?有一个简单的方式:
git symbolic-ref --short HEAD
这句指令主要包含两个关键字:symbolic-ref
和 HEAD
。
symbolic-ref
能够读取、修正和删去符号引证。
什么是符号引证呢?它表明一个以 refs 最初的文件(比如 refs/heads/develop),这个文件保存着本地每个分支当时所在 commit。
咱们能够打开 git 项目的 .git 文件夹,在其间的 refs/heads 文件夹中会保存各个分支当时所指向的 commit:
HEAD
指的是 .git/HEAD,便是一个文件,保存着当时指向的符号引证:
因此 git symbolic-ref --short HEAD
的含义便是读取 .git/HEAD 文件的内容,我这里便是 refs/heads/develop 文件,因此就得出当时分支是 develop 分支。
怎么获取本地未 push 的一切 commit
有时候咱们会在本地提交屡次后再 push,因此在阻拦 push 时,需求获取到当时要 push 的一切 commit 信息,然后获取每个 commit 修正的文件。
获取要 push 信息能够经过 git log @{u}.. --oneline
:
504318deMacBook-Pro ShixinDemo % git log @{u}.. --oneline
4e4655b (HEAD -> master) 阻拦跳转
f947180 修正文件
git log
十分强大,它能够有这些运用场景:
- 获取本地和远端的 commit 差异
- 获取指定时刻内的提交记录,能够详细到谁、什么时候、修正了哪些
- 获取详细某次提交修正的文件
上面咱们运用的参数 @{u}..
便是表明获取本地和远端的 commit 差异,然后 --oneline
表明不打印详细信息,只打印 short commit id 和 commit message。
假如要获取指定时刻内的提交记录,能够这样:
git log --pretty="%an(%cd) %h - %s" --since="2022-09-01" --no-merges --name-status
指令执行结果:
504318deMacBook-Pro ShixinDemo % git log --pretty="%an(%cd) %h - %s" --since="2022-09-01" --no-merges --name-status
zhangshixin(Fri Dec 16 22:34:49 2022 +0800) 4e4655b - 阻拦跳转
M app/src/main/java/com/example/heicdemo/MainActivity.kt
zhangshixin(Fri Dec 16 22:34:30 2022 +0800) f947180 - 修正文件
M .idea/gradle.xml
M .idea/misc.xml
D .idea/runConfigurations.xml
A android10_dem_heic_output.heic
A app/src/main/assets/android10_dem_heic_output.heic
R100 app/src/main/res/drawable/mushroom.jpg app/src/main/assets/mushroom.jpg
A app/src/main/assets/mushroom.webp
M app/src/main/java/com/example/heicdemo/MainActivity.kt
A app/src/main/res/drawable/mushroom.webp
M app/src/main/res/layout/activity_main.xml
pretty
的参数用于指定打印的内容和格局;since
参数用于指定查看时刻范围;no-merges
表明过滤掉 merge 时生成的额定 commit;name-status
表明展示出文件的修正状况(M 表明修正;D 表明删去;A 表明增加;R 表明重命名)。
怎么获取每个 commit 修正的文件
知道 commit ID 后,能够经过 git show --pretty="" --name-only $commitId
获取这个 commit 影响的信息:
04318deMacBook-Pro ShixinDemo % git show --pretty="" --name-only 4e4655b
app/src/main/java/com/example/shixindemo/MainActivity.kt
git show
能够用来查看 commit 的 commit message 和修正的文件、文件详细内容等信息。上面的代码中咱们运用了 name-only
参数表明只要查看修正的文件即可。
总结
这篇文章介绍了经过阻拦 git push 时,获取当时用户、当时分支、未 push 的 commit 和修正的文件等指令,经过组合这些指令,就能够实现一个中心代码维护功能了!