写点什么

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

2020 年 2 月 27 日

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 年 2 月 27 日 14:552109

评论

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

1分钟将vscode撸成小霸王

gamedilong

前端 vscode

惊险的B站Java后端岗面试之旅,复盘面试经历及面试真题

Java架构之路

Java 程序员 面试 编程语言

手把手带你玩转 openEuler | 如何安装 openEuler

openEuler

Linux 开源 操作系统 openEuler

详细分析定制企业应用的价格

Philips

敏捷开发 快速开发

区块链钱包开发需要注意哪些问题?区块链数字钱包搭建

135深圳3055源中瑞8032

TNFE-Weekly[第七十五周已更新]

莹姐🙈

小程序 前端 周报

[Go并发编程实战课]01.Mutex学习笔记

custer

go

Java零基础到进阶宝典!从小白到大神,金九银十面试这届斩获23K月薪

Java架构追梦

Java 学习 架构 面试 核心知识点

教育场景方案升级| 打通业务前后端,少量开发快速上线(一):互动小班

ZEGO即构

在线教育 低代码

合约跟单平台搭建,交易所跟单软件开发商

135深圳3055源中瑞8032

面向对象编程会被抛弃吗?这五大问题不容忽视

Java架构师迁哥

视频会议的应用

anyRTC开发者

ios 音视频 WebRTC 直播 安卓

手把手带你玩转 openEuler | 初识 openEuler

openEuler

Linux 开源 操作系统

4年Java经验,备战两月成功拿到美团、京东、字节offer

Java架构之路

Java 程序员 面试 编程语言

详细讲解:python中的lambda与sorted函数

计算机与AI

Python

vidyo在数字化办公中提供了什么便利?

dwqcmo

音视频会议 集成架构 解决方案 智能硬件

数字货币交易系统定制开发,区块链交易所

135深圳3055源中瑞8032

极客时间架构师培训 1 期 - 第 4 周总结

Kaven

LeetCode题解:145. 二叉树的后序遍历,栈,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

蚁架构师首推SpringBoot套餐(原理+实战+面试)

小Q

Java 学习 架构 微服务 SpringBoot 2

解释一下==和equals的区别,你以为就这么简单?那你就草率了

小Q

Java 学习 架构 面试 基础

随机森林原理介绍与适用情况(综述篇)

计算机与AI

数据挖掘 学习 数据科学 随机森林

[Go 并发编程实战课]02.Mutex 源代码

custer

go

WebSocket从入门到精通,半小时就够!

JackJiang

html5 网络编程 websocket 即时通讯

BATJ内部Java求职面试宝典,尤其应届生如果还没有学过那后悔去吧,也许你已经错过N多家大厂offer;

Java架构师迁哥

springboot+Redis+Shiro+MyBatis炸翔版CMS开源系统(代码+视频)

周老师

Java 编程 程序员 架构 面试

2020年第三季度《全国移动App 风险监测评估报告》

InfoQ_11eaedef67e9

App 移动安全 个人隐私安全

【BAT面试通关手册】覆盖Java相关29个技能,学完之后吊打面试官!

Java成神之路

Java 阿里巴巴 程序员 面试 编程语言

【全球案例】ESL 游戏公司如何通过 Jira 定制化解决方案连接全球团队

Atlassian

项目管理 敏捷 Atlassian Jira

月薪60k的Java开发在阿里是什么级别?对技术能力有哪些要求?

Java架构之路

Java 阿里巴巴 程序员 面试 编程语言

区块链USDT支付开发方案,USDT跨境支付搭建

135深圳3055源中瑞8032

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