组合或变基任意大量的提交

2023-11-26

就说我本地的git log shows:

739b36d3a314483a2d4a14268612cd955c6af9fb a
...
c42fff47a257b72ab3fabaa0bcc2be9cd50d5c89 x
c4149ba120b30955a9285ed721b795cd2b82dd65 y
dce99bcc4b79622d2658208d2371ee490dff7d28 z

我的遥控器git log shows:

c4149ba120b30955a9285ed721b795cd2b82dd65 y
dce99bcc4b79622d2658208d2371ee490dff7d28 z

达到这个目的的最简单方法是什么(假设任意大量的本地提交):

527b5810cfd8f45f18ae807af1fe1e54a0312bce a ... x
c4149ba120b30955a9285ed721b795cd2b82dd65 y
dce99bcc4b79622d2658208d2371ee490dff7d28 z

有时,您可能不想使用交互式 Rebase

如果 A 到 X 之间的中间提交数量相对较小,那么您可以使用交互式变基:

git rebase -i origin/master

然而,根据我个人的经验,在大量提交上使用交互式变基是很慢的。我一次对大约一百个提交运行了交互式变基(在使用 Git Bash 的 Windows 机器上),msysgit 花了很长时间才生成交互式变基提交编辑器,该编辑器允许您选择要运行的操作在哪个提交上,因为,嗯,列表最终变得非常大。

在这种情况下,您有几种解决方法。

替代方案#1:git reset

混合重置和软重置可用于(分别)修改工作树或暂存区域,以聚合/收集两个提交 A 和 Y 之间的所有更改,之后您可以将所有修改作为单个提交一次提交。

我只会给出一个软重置的示例,因为它已经为您保留了所有内容,而如果您使用混合重置,则无论如何都必须进行修改:

# You don't need to create the temp branch A if you
# copy the commit sha A down somewhere so that you can remember it.
git branch temp A

git reset --soft Y
git commit -m "Squash commits A through X"

# Verify that this new commit is equivalent to the final state at A
git diff A

替代方案#2:使用补丁

另一种选择是简单地使用补丁。只需生成 A 到 Y 之间差异的 diff 补丁,然后将该补丁应用为 Y 之上的新提交:

git diff y a > squash.patch
git checkout -b squash-branch y
git apply squash.patch
git commit -m "Squash commits A through X"

# Verify that this new commit is equivalent to the final state at A
git diff A

正如所指出的评论里@A-B-B,如果涉及二进制文件,这将不太有效。git diff --binary除了文本文件之外,还可以用于输出二进制文件的差异,但我不确定这些差异是否也可以用作补丁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

组合或变基任意大量的提交 的相关文章

随机推荐