Git rebase非交互式操作最后两个提交 - 编写批处理文件

3
请帮我编写一个批处理文件,用于将当前分支中的两个最新提交:HEADHEAD~1合并为一个提交,而不使用交互式编辑器。假设这两个提交都只有一个父提交,并且尚未推送。
a683ec1 Not pushed 2
c7b480a Not pushed 1
f0e81fb Pushed

我希望留下“已推送”提交和它之前的一个提交,该提交将包含“未推送1”+“未推送2”,最终状态为“未推送2”。


你真的需要一个批处理文件(.bat.cmd,用于与cmd.exe解释)吗?还是任何类型的脚本都可以?即使在Windows上,Git始终需要POSIX shell,这是一个更愉快的脚本环境。 - Jan Hudec
你打算手动编写提交信息吗?提供一个简短的提交信息作为参数?还是使用第一次提交的信息?使用第二次提交的信息?或者连接提交信息(实际上,处理提交信息似乎是该过程中最复杂的部分)。 - Jan Hudec
可能是重复的问题:有没有一种非交互式地压缩多个提交的方法? - Ciro Santilli OurBigBook.com
1个回答

4

这个想法是要做一个:

git reset --soft @~ # reset HEAD, preserve current working tree and index
git commit --amend -m "squash HEAD and HEAD~"

这并没有解决提交信息的问题:来自ORIG_HEAD的那个将会丢失。
torek评论中解决了这个问题。
如果你有多个需要合并的提交(自从origin/master),你可以这样做(假设你没有正在进行中的工作):
echo "squash everything since origin/master" > /tmp/msg
git log  --format=%B origin/master~3.. >> /tmp/msg
git reset --soft origin/master
git commit -F /tmp/msg

这次,您不需要修改重置的提交(因为 origin/master 已经被推送),而是创建一个新的提交。

谢谢你提供的脚本,它能够正常工作,但是有一个问题:它只在第一次执行时有效。如果我重复执行这个批处理文件,我期望在 git log --oneline 中看到少一个提交,但实际上看到的是相同的修改提交和之前的提交。(是的,在推送的提交之前有超过两个提交)。 - Paul
@Paul:“是的,在推送之前有两个以上的提交”:您可以将HEAD重置为HEAD〜n,其中n是要压缩的提交数。这样,就不需要重复脚本了。 - VonC
保留索引实际上会更容易。因为 git add -A 可能会添加一些在 ORIG_HEAD 中没有版本控制的内容。 - Jan Hudec
@Paul 为什么要手动计算提交次数?已经推送的内容可以通过 origin/master 引用。我已经修改了我的答案以避免这种情况。 - VonC
@JanHudec 确实如此。在这种情况下,我认为不需要任何 git add - VonC
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接