将git提交与相同的消息结合起来?

时间:2013-11-14 00:56:18

标签: git

我可能滥用git并以从未设计过的方式使用它。我是团队规模的唯一开发人员,我在多台机器上开发。例如,我在机器A上编码,需要测试(并重新编译)机器B和机器C上的代码。我做快速开发(例如,每分钟提交一次,然后转到机器B / C进行测试)

因此,我的许多提交都有意义消息,特别是我经常这样做:

机器A

git add -u
git commit -m "work"
git push

机器B / C

git pull
make
./run_tests

哦不!它不起作用...回到机器A并在1分钟后再做一次。

因此,正如您可以想象的那样,我的git --log历史记录中有许多只包含“工作”的毫无价值的评论。有没有办法自动组合所有具有相同消息的git提交,具体而言,所有带-m“work”的顺序提交将合并为一个大提交-m“大工作”。

感谢。

明确地说,我的评论历史(可追溯到2年)是这样的:

work
work
work
work
OMG THIS actually works.
work
work
work
OMG we solved a huge problem... we should call this v1.0
work
work
work

我想将所有“工作”消息自动解压缩成:

work
OMG THIS actually works.
work
OMG we solved a huge problem... we should call this v1.0
work

etc...

侧, 至于为什么我滥用这样的git,基本上我将它用作ctrl-s功能......我还开发了20台机器,并且需要一种有效的方式来在每分钟左右更改后共享代码。 NFS不是一个选项,因为我也可以在离线/硬防火墙等机器上工作......

2 个答案:

答案 0 :(得分:0)

您所描述的工作流程与git-rebase交互模式手册页中描述的工作流程非常相似:

  

以交互方式重新绑定意味着您有机会编辑已重新定位的提交。您可以对提交进行重新排序,然后将其删除(清除不良或其他不需要的补丁)。

     

[...]

     

如果要将两个或多个提交折叠成一个,请用“squash”或“fixup”替换第二个和后续提交的命令“pick”。如果提交具有不同的作者,则折叠的提交将归因于第一次提交的作者。折叠提交的建议提交消息是第一次提交的提交消息和使用“squash”命令的提交消息的串联,但是使用“fixup”命令省略了提交的提交消息。

将git-rebase示例应用于您的案例,您必须执行类似

的操作
$ git rebase --interactive HEAD~13 # to fix last 12 commits

编辑器将在当前分支的所有提交中启动:

pick deadaaa work
pick deadbbb work
pick deadccc work
pick deadddd work
pick deadeee OMG THIS actually works.
pick deadfff work
pick dead000 work
...

您需要做的是在要提交到上层提交的提交中将“pick”更改为“fixup”:

pick deadaaa work
fixup deadbbb work
fixup deadccc work
fixup deadddd work
pick deadeee OMG THIS actually works.
pick deadfff work
fixup dead000 work
...

在此清理之后,最安全的做法是从其余计算机重新克隆此存储库。由于在共享存储库中搞乱提交(如git rebase),这是一个完美的灾难处理方法。特别是如果你试图自动化这个过程。

编辑:当您控制存储库的所有副本时,这应该不是问题。在修改主分支之前,请确保所有副本都处于同步状态。完成更新后,强制推/拉的所有副本再次同步。如果出现问题“从上游Rebase恢复”git-rebase man部分应该有所帮助。

答案 1 :(得分:0)

你没有滥用git。对于git来说,这是一个绝对优秀的场景。

我建议您在A设置工作存储库以包含(可能存在的远程origin旁边)另外两个遥控器remote_Bremote_C。 (并在主机BC上设置了相应的裸存储库。)

这允许您在A工作,只需使用git push remote_B将您的提交推送到主机。 - 您可以通过在远程存储库中添加一个小钩子来自动构建项目并运行测试,从而进一步自动化。

这样您就可以立即推送并查看结果,而无需离开A


现在提出您的实际问题:我首先强烈建议您使用更有意义的提交消息。 - 您通常会处理某些特定主题,或尝试解决某些特殊问题。 - 给自己一个暗示提交的内容。

完成测试后,使用git rebase -i。只要你没有改变你的上游,(这可能指向origin并且你只在完成工作后才推到那里),git rebase -i显示那些你没有推动的提交,并允许你组合,重新排序,并根据需要重命名。 - 此时有一些有意义的提交消息非常有用,能够以有意义的方式组合它们。

作为对结果推送感到满意的最后一步,您可以origin工作,一切都很好。 :)