【发布时间】:2017-10-27 21:20:18
【问题描述】:
在 Git 中,我可以使用交互式 rebase 重写历史记录,这非常棒,因为在我的功能分支中,当我探索不同的重构和完成它的方法时,我使用部分工作代码进行了大量提交。
我想在将分支变基或合并到 master 之前将很多提交压缩在一起。
一些按从第一个(顶部)到底部(最后一个)的顺序组成的提交
1. Initial commit on feature branch "Automatic coffee maker UI"
2. Add hot chocolate as product
3. Add tea as product. Products are now generic
4. Create in memory data store for adapter tests
5. Cry because I can't get entity framework to create a composite key. Integration tests broken.
6. Implemented composite key!!
7. All tests green and feature done!
假设我想保留提交 3、4 和 7。
使用 rebase 我想“压缩”提交
- 1 和 2 进入 3。
- 4 次入住
- 5 和 6 进入 7
理想情况下在我会做的交互式变基中
1. squash
2. squash
3. pick (contains the work of 1 & 2)
4. pick
5. squash
6. squash
7. pick (contains the work of 5 & 6)
但这是倒退的,因为 squash 将提交与之前的提交合并。我不知道如何让它向前挤压。
我是不是很难,我是否应该接受它不起作用(我宁愿让它起作用),还是有办法做到这一点?
我正在调用这个命令
git checkout My-feature-branch
git rebase master -i
然后我正在编辑出现的提交列表,并尝试通过保存文件并编辑编辑器来完成它,这通常对我有用。
【问题讨论】:
-
我不完全确定您正在经历什么。
squash完全符合您的要求;将 1 和 2 融合到 3 中,将 5 和 6 融合到 7 中。留下的将是(表面上)提交、3、4 和 7。您是否遇到了这些命令的问题?请注意,您可以在本地存储库上尝试这些,但只有当您有远程存储库时,您才能重置回。 -
我收到一条消息“错误:如果没有先前的提交就不能'squash'”,这让我陷入了一个循环,让我认为 #1 正在尝试压缩到不存在的 #0而不是#2
-
你是如何调用它的?向我们展示该命令。
-
@Makoto 你错了,恰恰相反,正如乔希在他的问题中所说的那样。 ;-) 此外,由于默认情况下存在 reflog,因此您始终可以轻松地撤消您对 rebase 所做的操作,而无需任何远程存储库。 ;-)
-
好问题。我正是需要这个东西,因为重新排序提交会给你带来冲突。 @Vampire 的回答是一个很好的解决方案,不会导致任何额外的工作。
标签: git squash git-squash git-interactive-rebase