AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

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:556939

评论

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

python版本管理工具DVC

AIWeker

人工智能 版本管理 11月月更 dvc

Python 操作Excel(xlrd和XlsxWrite)

度假的小鱼

11月月更 Python xlrd读取Excel Python xlrd

读《程序是怎样跑起来的》体会

听风go

读书笔记 后端 计算机 计算机原理 读书总结

Python 操作Mysql

度假的小鱼

pymysql 11月月更 Python操作Mysql

细说值传递、引用传递和地址传递

闫同学

编程语言 计算机基础 11月月更

【web 开发基础】PHP 中数组的定义 (42)

迷彩

数据结构 数组 11月月更 数组的定义

“后 Hadoop 时代”,大数据从业者如何应对新技术趋势带来的挑战?

Apache Flink

大数据 flink 实时计算

华为云桌面Workspace,让云上工作更高效!

路过的憨憨

【React技术】JSX在企业级项目的运用and一个元素渲染demo

恒山其若陋兮

前端 11月月更

AI简报-重参数化RepVGG

AIWeker

深度学习 AI简报 11月月更

【web 开发基础】PHP中的数组 (41)

迷彩

php 数据结构 11月月更 关联数组 索引数组

【web 开发基础】PHP中多维数组的声明 (44)

迷彩

数据结构 一维数组 二维数组 11月月更 多维数组

【web 开发基础】PHP中数组的遍历(45)

迷彩

数据结构 数组 foreach 11月月更 数组遍历

华为云大数据平台,助力企业数字化转型成效明显

路过的憨憨

Flink Forward Asia 2022 主论坛概览

Apache Flink

大数据 flink 实时计算

【web 开发基础】PHP中的预定义数组(46)

迷彩

php web开发基础 11月月更 预定义 超全局数组变量

湖仓一体电商项目(十五):实时统计商品及一级种类、二级种类访问排行业务需求和分层设计及流程图

Lansonli

湖仓一体电商项目 11月月更

【web 开发基础】PHP中使用array()语言结构新建数组(43)

迷彩

数据结构 array 11月月更 array() 新建数组

python小知识-内置方法和属性应用:反射和单例

AIWeker

Python python小知识 11月月更

Discourse 的左侧边栏可以修改吗

HoneyMoose

深度学习-浅谈keras的扩展性

AIWeker

深度学习 keras 11月月更

制造业要用龙头带动整条产业链发展,阿里云智能制造加速器首次集结

B Impact

一文了解 Go 标准库 strings 常用函数和方法

陈明勇

Go golang 字符串 11月月更 strings

投入上百人、经历多次双 11,Flink 已经足够强大了吗?

Apache Flink

大数据 flink 实时计算

【React技术】开发过程中遇到State和生命周期方法在类里面的运用

恒山其若陋兮

前端 11月月更

React源码分析6-hooks源码

goClient1992

React

「Go易错集锦」正确使用defer避免代码重复

Go学堂

golang 程序员 个人成长 defer 11月月更

Python 操作mongodb库

度假的小鱼

mongodb 11月月更 Python 操作mongodb库

《2022开源大数据热力报告》发布,Flink 摘得「流处理」领域热力值 TOP1

Apache Flink

大数据 flink 实时计算

基于 Apache Flink Table Store 的全增量一体实时入湖

Apache Flink

大数据 flink 实时计算

Flink CDC 2.3 发布,持续优化性能,更多连接器支持增量快照,新增 Db2 支持

Apache Flink

大数据 flink 实时计算

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