随手改变世界之 git-auto-squash
使用git的同学是不是经常纠结于在开发过程中是应该频繁提交, 还是仔细构造提交点之后再提交?
- 前者可以让开发更流畅,不必打断思路,但会造成提交历史无法浏览;
- 后者可以构造漂亮易懂的提交历史,但码码时停下来考虑commit message 怎么造句是不是太影响情绪了。
一般的做法是先做很多小的fixup,之后再将fixup合并到一起。
这个工具 git-auto-squash
可以将提交历史中连续的fixup
合并到它之前最早的1个正式提交点上,类似不需要交互的rebase --interactive
。
git-auto-squash
Rewrite history to squash all commits wiht message starts with
'fixup!' to its first parent. By drdr.xp@gmail.com
Usage:
> git-auto-squash [-f] [-p <pattern>] <rev-list options>...
Options:
-f Force to remove backup ref from previous git-auto-squash.
-p <pattern> Squash commits with mssage starts with <pattern>.
By default <pattern> is 'fixup!'.
-t Update all ref touched. Usefull when squashing history with
merges.
By default, with a repo like:
* a6910e2 (master) Merge commit '75275ed'
|\
| * 75275ed (branch-fix) fixup! ok
| * 2e85eb7 ok
|/
* b66353d init
> git-auto-squash master
Will only update "master", but leave "branch-fix" where it
was. It results in:
* 0982b05 (master) Merge commit '75275ed'
|\
| * 377a349 ok
|/
* b66353d init
With "-t" it also update ref "branch-fix" after squashing:
> git-auto-squash -t master
* 0982b05 (master) Merge commit '75275ed'
|\
| * 377a349 (branch-fix) ok
|/
* b66353d init
It is same with specifying which ref to update manually:
> git-auto-squash -t master branch-fix
举个栗子
运行 git-auto-squash
后将所有 fixup!
开头的message的commit
合并到最早遇到的非fixup!
的提交点”ok”上.
处理merge的栗子
git-auto-squash
也可以处理merge的fixup。对于merge
commit,如果它的其中一个parent被squash掉了,它也会被squash掉:
这样在某些merge commit有3个或3个以上的parent的时候,会丢弃某些中间的merge点。 但不影响最终结果。
处理merge的历史的时候建议加上-t
参数,
以保证被重写的历史里所有的分支都会指向新的提交点。
下载
复制脚本到/usr/local/bin下并:
chmod +x git-auto-squash
Archive
- 15 Nov 2020 slimarray: gzip的压缩率, 即时访问
- 28 Oct 2020 200行代码实现基于paxos的kv存储
- 18 Oct 2020 后分布式时代: 多数派读写的'少数派'实现
- 20 Dec 2019 Art of Pull Requests(翻译)
- 21 Nov 2019 掐指算算: 你的CDN多花了几百万?
- 19 Nov 2019 一年的素描练习
- 30 Oct 2019 互联网中对象访问频率的91分布
- 09 Jan 2019 哄好面试官系列-1: 比较2个python dict(多级)是否相同
- 04 Nov 2018 存储中的文件合并策略优化
- 27 Sep 2018 软件工程是个面包机
- 26 Aug 2018 程序员必须知道的事情, 一般人我不告诉他
- 16 Aug 2018 cgexec 无法继承 LD_PRELOAD 环境变量
- 04 Aug 2018 mysql group replication实践记录: 步骤, 问题和注意事项
- 13 Feb 2018 枚举所有整勾股数
- 03 Feb 2018 ansible中的include, include_tasks 和 import_tasks 的差别
- 20 Nov 2017 python 并发subprocess.Popen的坑
- 05 Aug 2017 程序员必读: 摸清hash表的脾性
- 06 May 2017 python 进程内存增长问题, 解决方法和工具
- 01 Feb 2017 xp的分布式系统系列教程之: Erasure-Code: 工作原理, 数学解释, 实践和分析.
- 01 Feb 2017 xp的分布式系统系列教程之: Erasure-Code: 工作原理, 数学解释, 实践和分析.
- 11 Nov 2015 可靠分布式系统基础 Paxos 的直观解释
- 28 Jul 2015 socket关闭: close()和shutdown()的差异
- 17 May 2015 随手改变世界之 git-auto-squash
- 17 Feb 2015 Numbers Programmers Should Know About Hash
- 11 Feb 2015 Vim-tabbar: Simple, stupid and fast tab-bar for VIM
- 24 Jul 2014 1% 慢请求优化
- 31 Jan 2014 Some useful resources
- 31 Jan 2014 jobq.py -- Queue processing engine