写点什么

10 个节省时间和改善工作流的 Git 技巧

  • 2020-02-27
  • 本文字数:3161 字

    阅读完需:约 10 分钟

10个节省时间和改善工作流的Git技巧


根据Git官方手册,它被定义为傻瓜式内容追踪器,它功能丰富,但有些功能却让人望而生畏。因此,我们只是重复使用那几个被记住的命令,而没有充分使用。

技巧 1: 优化配置

Git 在全局、用户和本地级别上都是高度可配置的。点击此处查看。

查找顺序

每个设置都可以被覆盖:


$CWD/.git/config    ▼ ▼ ▼$HOME/.gitconfig`    ▼ ▼ ▼$HOME/.config/git/config    ▼ ▼ ▼/etc/gitconfig
复制代码

修改设置

用你喜欢的编辑器或者 CLI 编辑任何配置文件:


# 全局设置git config --global <keypath> <value># 本地设置git config <keypath> <value>
复制代码


如果值包含空格字符,则需要用引号引起来。

显示当前设置

# 显示当前设置及其来源git config --list --show-origin
复制代码

一些有用的配置

# 设定身份git config --global user.name "<your name>"git config --global user.email <your email># 首选编辑器git config --global core.editor vim# 证书缓存# WINDOWSgit config --global credential.helper manager# LINUX (超时时间——以秒为单位)git config --global credential.helper "cache --timeout=3600"# MACOSgit config --global credential.helper osxkeychain
复制代码


点击此处查看详情。

技巧 2:别名(alias)

创建一个别名来保存常用的 git 命令:


# 创建别名git config --global alias.<alias-name> "<git command>"# 使用别名git <alias-name> <more optional arguments>
复制代码

一些有用的别名

# 撤销上次提交git config --global alias.undo "reset --soft HEAD^"# 将暂存区更新修订到上次提交(不改变提交信息)git config --global alias.amend "commit --amend --no-edit"# 压缩的状态输出git config --global alias.st "status -sb"# 用GRAPH为日志着色git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"# 删除所有已合并的分支git config --global alias.rmb "!git branch --merged | grep -v '*' | xargs -n 1 git branch -d"# 贡献排行git config --global alias.rank "shortlog -n -s --no-merges"
复制代码

技巧 3:查找 Commits 和更改

通过 Commits 信息查找

# 通过commit信息查找(所有分支)git log --all --grep='<search term>'# 通过commit信息查找(包含reflog)git log -g --grep='<search term>'
复制代码

通过更改查找

# 通过更新的内容查找git log -S '<search term>'
复制代码

通过日期查找

# 通过日期范围查找git log --after='DEC 15 2019' --until='JAN 10 2020'
复制代码

技巧 4:添加 hunk

git add <filepath>不仅能添加文件的所有变更,--path / -p参数还可以交互式暂存区块。点击此处查看详情。


# 补丁命令y = 暂存区块n = 不暂存这个区块q = 退出a = 暂存当前文件的此区块以及所有剩余区块d = 不暂存当前文件的此区块以及所有剩余区块/ = 查找区块 (正则表达式)s = 划分成更小的区块e = 手动编辑区块? = 打印帮助说明g = 选择要前往的区块j = 将区块设为未定,查看下一个未定区块J = 将区块设为未定,查看下一个区块k = 将区块设为未定,查看上一个未定区块J = 将区块设为未定,查看下一个区块
复制代码

技巧 5: 储藏(stash)更改而不提交

stash 将当前的更改临时搁置起来。在它的帮助下,可以返回当前状态的索引,并能在稍后应用已储藏的更改。


默认情况下,仅储藏当前跟踪文件中的更改,新文件将被忽略。


我们可以独立地创建和应用多个 stash。点击此处查看详情。

创建

# 创建新的STASHgit stash# 创建新的STASH (包含未追踪的更改)git stash -u/--include-untracked# 创建新的STASH并命名git stash save "<stash name>"# 交互式储藏git stash -p
复制代码

罗列

# 列出所有的STASH (为其他命令提供"n")git stash list
复制代码

浏览

# 浏览STASH内容git stash show# 浏览STASH差异git stash show -p
复制代码

应用

# 应用上一个STASH (删除stash)git stash pop# 应用上一个STASH (保留stash)git stash apply# 应用特定的STASH (n = stash列表序号)git stash pop/apply stash@{n}# 从STASH创建新的分支 (n = stash列表序号)git stash branch <new branch name> stash@{n}# 从STASH应用单个文件 (n = stash列表序号)git checkout stash@{n} -- <filepath>
复制代码

清理

# 删除特定的STASH (n = stash列表序号)git stash drop stash@{n}# 删除所有的STASHgit stash clear
复制代码

技巧 6:空运行(Dry Run)

许多 git 操作可能具有破坏性,例如,git clean -f将删除所有未跟踪的文件,而且无法恢复。


要避免出现这种灾难性的结果,许多命令都支持 dry-run,可以在实际产生结果前对其进行检查。不过遗憾的是,使用的选项不完全一致:


git clean -n/--dry-rungit add -n/--dry-rungit rm -n/--dry-run# GIT MERGE模拟DRY-RUNgit merge --no-commit --no-ff <branch>git diff --cachedgit merge --abort
复制代码


请注意,git commit -n根本不是*dry-run!*它实际上是--no-verify,作用是忽略所有pre-commit/commit-msg githooks

技巧 7:安全强制推送

在处理旧的 commit、创建新的 head 等情况时时很容易弄乱分支。git push --force可以覆盖远程变更,但不应该这样做!


git push --force是一种具有破坏性且危险的操作,因为它无条件生效,并且会破坏其他提交者已经推送的所有 commit。这对于其他人的代码仓库来说不一定是致命的,但是改变历史记录并影响其他人并不是一个好主意。


更好的选择是使用git push --force-with-lease


git 不会无条件地覆盖上游的远程仓库,而是检查是否有本地不可用的远程更改。如果有,它会失败并显示一条“stale info”消息,并告诉我们需要先运行git fetch。点击此处查看详情。

技巧 8:修改 commit 信息

Commit 是不可变的,且不能更改。不过可以用一条新的 commit 信息修订现有的 commit,这会覆盖原始 commit,因此请勿在已推送的 commit 中使用它。点击此处查看详情。


git commit --amend -m "<new commit message>" 
复制代码

技巧 9:修改历史

修改代码仓库的历史不仅限于修改上次提交信息,使用git rebase可以修改多个提交:


# 提交的范围git rebase -i/--interactive HEAD~<number of commits># 该hash之后的所有提交git rebase -i/--interactive <commit hash>
复制代码


在配置的编辑器中倒序列出所有的 commit,像这样:


# <command> <commit hash> <commit message>pick 5df8fbc revamped logicpick ca5154e README typos fixedpick a104aff added awesome new feature
复制代码


通过更改编辑器中的实际内容,可以为 git 提供一个方案,来说明如何进行 rebase:


# p, pick   = 使用提交而不更改# r, reword = 修改提交信息# e, edit   = 编辑提交# s, squash = 汇合提交# f, fixup  = 类似"squash",但是会丢弃提交信息# x, exec   = 运行命令 (其余行)# d, drop   = 移除提交
复制代码


保存编辑器后,git 将运行该方案以重写历史记录。


e, edit会暂停 rebase,就可以编辑代码仓库的当前状态。完成编辑后,运行git rebase --continue


如果过程中出现问题(例如合并冲突),我们需要重新开始,可以使用git rebase --abort。点击此处查看详情。

技巧 10:存档跟踪文件

可以使用不同格式(ziptar)来压缩特定引用的跟踪文件:


git archive --format <format> --output <filename> <ref>
复制代码


<ref>可以是一个分支、commit hash 或者一个标签。查看详情

额外提醒:单破折号

有一个快捷方式可以表示刚用过的分支:一个单破折号-


git checkout my-branch# 当前分支:my-branch<do some git operations, e.g. adding/commiting>git checkout develop# 当前分支:developgit merge -# 将my-branch合并到develop
复制代码


单破折号等同于@{-1}

总结

Git 还有很多话题可谈,这里只涉及一些皮毛。在另一篇文章中,我想展示如何用git bisect有效查找损坏的 commit,或者如何通过git reflog来运用任意git操作的完整历史记录。


阅读英文:


10 Git Tips To Save Time And Improve Your Workflow


2020-02-27 14:557070

评论

发布
暂无评论
发现更多内容

什么是IP地址盗用?又要如何预防?

郑州埃文科技

IP地址 IP地址盗用 安全防御

借鉴这份Java进阶架构师之路的核心知识,我成功收获蚂蚁金服、阿里、美团等Offer

Java浪潮

Java 架构 java架构

Hacker 资讯 | 5 月上旬区块链黑客松活动汇总

One Block Community

区块链

DPDK背景和优势,赶紧学起来运用吧

C++后台开发

虚拟化 Linux服务器开发 DPDK C++后台开发 高性能网络

重入锁与读写锁

急需上岸的小谢

5月月更

阿里Java面试必问:JVM与性能优化+Redis+设计模式+分布式

Java浪潮

编程 架构

贝壳上云&云上架构

赵亮-贝壳云原生

云原生 监控 框架 链路 扩缩容

2022年3月视频行业用户洞察:用户增长,长短视频探索共赢新模式

易观分析

短视频 视频

一文详述DMS资源池队列阻塞告警及原理

华为云开发者联盟

数据库 资源池 DMS 队列阻塞告警 资源池队列阻塞

SpringCloud 中 Gateway 是如何关联对应的 GatewayFilterFactory 和 参数解析的

gin

Gateway SpringCould

进阶中的程序员:深入解析 Spring boot(含PDF文档分享)

Java浪潮

spring 编程 JAVA开发 springboot

云原生基础治理平台SchedulX V1.2.0正式发布,助力企业降本增效

星汉未来

运维 云原生 星汉未来

10个产品主导的增长原则|Bessemer

观测云

毕业总结

凌波微步

架构训练营

服务器CPU和普通CPU有什么区别?常用的服务器有六大区别

Finovy Cloud

深度学习 gpu GPU算力

毕业设计项目

凌波微步

「架构实战营」

手把手推导Back Propagation

OneFlow

人工智能 神经网络 深度学习 Back Propagation 推导过程

如何制作优秀的产品说明手册?

小炮

产品说明手册

深入浅出Redis丨阿里架构师的Redis实战心得,让你毫不费力的学习

Java浪潮

redis java程序员 java架构

作为Java程序员连Redis都不会?阿里架构师带你深入“解剖”Redis

Java浪潮

redis JAVA开发 java程序员

ATT&CK V11版本发布,新增结构化检测内容

青藤云安全

【OpenCV】配置OpenCV教程,OpenCV入门

恒山其若陋兮

5月月更

华为手机用户找歌不用愁,HarmonyOS 2版本更新上线“听歌识曲”

科技汇

应“云”而生,软件觉醒 揭秘华为云软件开发生产线DevCloud如何呼唤高效“开发”

科技热闻

龙蜥云原生机密计算 SIG 成立,7 大开源项目重磅亮相!

OpenAnolis小助手

云原生 开源项目 龙蜥社区 sig

洞见科技纪凯:基于隐私计算的「客户增长」生态

洞见科技

金融科技 隐私计算

重复造轮子?TCP天然支持可靠传输为什么还需要基于UDP实现可靠传输?

Java全栈架构师

程序员 字节跳动 面试 TCP 网络

报告解读下载 | 5月《中国数据库行业分析报告》重磅发布!精彩抢先看!

墨天轮

数据库 oracle opengauss TiDB 国产数据库

GAIA数据集V1.10更新

云智慧AIOps社区

运维 AIOPS 数据集

什么是流动性池?(上)|流动性池的出现及名词解析

区块链前沿News

流动性 Hoo

又是一年开源之夏,八大课题项目奖金等你来拿!

白鲸开源

Apache 大数据 开源 DolphinScheduler workflow

10个节省时间和改善工作流的Git技巧_文化 & 方法_Ben Weidig_InfoQ精选文章