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

时间:2011-09-22 14:38:43

标签: git

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

我知道堆叠的git应该提供类似的东西,尽管这会为标准工作流程引入新命令,我宁愿避免。

我想要实现的是某种功能管理,它允许我们应用/删除整个功能,同时保持补丁分支本身的可见性。如果我确实合并了分支,那么大多数试图区分变化的命令都不会做我想要的,因为分支已经合并到了开发中。

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

2 个答案:

答案 0 :(得分:4)

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

因此,您可以使用以下命令执行所需操作(当您使用master时,并希望合并功能分支功能-foobar):

$ git merge --squash feature-foobar
$ git commit -m "Implemented feature: foobar"

答案 1 :(得分:1)

根据我的理解,您可以使用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中所有内容的单个提交,您可以轻松地从开发分支中删除它。


所以为了处理这个手术,你可以做....

git checkout feature_branch

制作临时分支......

git checkout -b temp

git rebase -i develop_branch

将提示交互式编辑器... 将提交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

就是这样!