git - 在 Git 中压缩提交的最佳策略
问题描述
假设我有一个功能分支 X,我在其中多次提交并推送了更改。另一个开发人员多次提交 X 分支,然后推送更改。该功能不完整,我想将其合并到 master 并压缩提交。最好/最简单的方法是什么?
如果我做
git checkout master
git merge --squash <feature>
这将导致 1 次压缩提交给 master,但是功能分支上的提交是否被压缩了?
或者,我可以对功能分支进行 rebase,但是我必须强制推送,因为提交已经被推送到远程分支上。这不是一个坏习惯吗?
谢谢
解决方案
git checkout master git merge --squash <feature>
将导致 1 次压缩提交给 master,
正确的。
但是功能分支上的提交是否被压缩了?
不,或者是,或者也许是“mu”:这个问题没有意义。在这一点上,特性分支实际上已经死了:它不应该再被使用。你现在可以画成这样:
ABCD <-- master (HEAD)
/
...--*
\
A--B--C--D <-- feature
whereABCD
是与四个提交序列执行相同操作的单个提交A--B--C--D
。(请注意,在 之前git merge --squash
,名称master
指向 commit *
。)
您现在可以使用,例如,将功能分支指向新提交,git branch -f feature master
给出:
ABCD <-- master (HEAD), feature
/
...--*
\
A--B--C--D [abandoned]
请注意,如果您改为使用:
git checkout <feature>
git rebase -i master
然后将四个pick
命令中的三个更改为squash
,您已经清除了旧功能分支并创建了一个新feature
分支并将名称移动feature
到它的位置,方式大致相同。不同的是,名称master
仍然指向其原始提交,并且您处于新的feature
:
ABCD <-- feature (HEAD)
/
...--* <-- master
\
A--B--C--D [abandoned]
您现在可以得到git checkout master
与先前方法git merge --ff-only feature
相同的结果。git merge --squash
在这两种情况下,如果其他人正在使用旧feature
分支,他们必须适应对 的突然更改feature
,该更改已经移动,使得原来的四个提交不再有用并且应该停止使用。
推荐阅读
- javascript - 固定位置:滚动
- ios - 如何在 UITabBarItem 开关上弹出到根视图控制器?
- python - 解析 Python 表达式而不进行评估
- angular - 在 mat-filter 的列中过滤多个值
- javascript - 更新后重新加载ajax购物车
- c++ - “malloc_stats”函数中的奇怪行为
- prometheus - prometheus source_labels 只能是“__”开头的标签吗?
- scala - Spark 带替换采样法的原理是什么?
- php - 如何查看调用我的网站页面 PHP 的来源
- python - 为我的 Django 应用程序创建一个 Debian 包