合并git分支而不移动分支指针

合并git分支而不移动分支指针,git,Git,我正在寻找一种解决方案,将特性分支应用到git中的开发分支,而不实际移动分支指针。本质上,我想创建一个功能分支的提交,并确保它以某种方式指向原始分支(在日志中提及可能就足够了) 我知道堆叠git应该提供类似的功能,尽管这会在标准工作流中引入新的命令,但我宁愿避免使用这些命令 我试图实现的是某种功能管理,它允许我们应用/删除整个功能,同时保持补丁分支本身的可见性。如果我合并了分支,大多数试图区分更改的命令将不会执行我想要的操作,因为分支已经合并到develope中 我真的不能跟随上游-有时会有并发

我正在寻找一种解决方案,将特性分支应用到git中的开发分支,而不实际移动分支指针。本质上,我想创建一个功能分支的提交,并确保它以某种方式指向原始分支(在日志中提及可能就足够了)

我知道堆叠git应该提供类似的功能,尽管这会在标准工作流中引入新的命令,但我宁愿避免使用这些命令

我试图实现的是某种功能管理,它允许我们应用/删除整个功能,同时保持补丁分支本身的可见性。如果我合并了分支,大多数试图区分更改的命令将不会执行我想要的操作,因为分支已经合并到develope中


我真的不能跟随上游-有时会有并发更改,通过获取新标签和仅重新应用所需的功能,而不是解决冲突和恢复冗余功能,更容易纠正这些更改-因此这种工作方式是不可能的。另一方面,我确实希望看到更改,以便我可以对其进行返工以匹配新版本,或者稍后向上游提交。

据我所知,您可以使用git-rebase-I来实现您的目标。 下面是您想要实现的场景

A--B--C(develop)
\
 \D--E--F(feature)
您可以将D-E-F组合为一个名为G的提交 最终结果将是

   A--B--C--G(develop)
    \
     \D--E--F(feature)
G是一个单一的提交,它包含了D-E-F中的所有内容,您可以很容易地从development分支中删除它


所以为了完成这个手术,你可以

git签出功能\u分支机构

做一个临时分支

git签出-b temp

git-rebase-i开发分支机构

交互式编辑器将被提示出来。。。 将提交D和E标记为挤压,保留最后一行(提交)作为最后一次提交 保存并退出

然后提交G将重新基于您的开发分支

   A--B--C(develop)--G(temp)
    \
     \D--E--F(feature)
如果需要,将开发重置为提交G并删除临时分支

git checkout develop_branch
git reset --hard <shaSum of commit G>
git -D temp
git签出开发分支
git重置——硬
吉特-D温度

就这样

实际上,有一种更简单的方法。git merge命令有一个选项
--squash
,它只是将要合并的分支中的所有更改累加起来,并将它们添加到临时区域

因此,您可以使用以下命令执行所需的操作(当您使用“主控”并希望合并要素分支要素foobar时):


因此,您希望将整个功能分支压缩到一个补丁中,并能够在开发分支中自由应用/恢复它,对吗?嗯,我想要一个提交,这意味着“在某个点上这是XYZ分支,以提交结束”但我不希望分支在那一点结束。@viraptor:它的哪一部分不太明显?我希望像“将此压缩到该位置”或“复制列表分支到该位置”这样的命令已经可用。新的分支,手动编辑rebase列表(为什么是交互式的),重置(什么?为什么?)就像在需要bash脚本时编写汇编程序一样。但这是我对git的一般问题,而不是您的解决方案;)@viraptor:如果其他人可以发布一个命令就好了。顺便说一句,这就是我在日常工作中所做的。创建一个新分支对于重定基址很有用(您仍然可以保留功能分支),交互式重定基址是必要的。如果您希望压缩为单个提交,则重设是将开发重设为与临时分支相同的点。:)
$ git merge --squash feature-foobar
$ git commit -m "Implemented feature: foobar"