如何保持本地主题(功能)分支不被推送到远程

时间:2017-03-28 13:47:10

标签: git branching-and-merging

假设我从远程仓库中提取分支develop并创建本地分支feature_xxx以处理某些功能

A---B---C---D    develop
     \
      X          feature_xxx

我对feature_xxx分支进行了一些提交,并将其合并回本地develop分支。

A---B---C---D---E  develop
     \         /
      X---Y---Z    feature_xxx

最后,我将develop分支推回到远程仓库

git push my_remote develop

问题是所有提交都被推送到远程,包括X,Y,Z提交,所以远程分支现在看起来像这样:

A---B---C---D---E  develop
     \         /
      X---Y---Z

实际上我在开发过程中使用了那些X,Y,Z提交,并且不希望它们显示在遥控器上。我希望遥控器上的分支是这样的:

A---B---C---D---E  develop

我想有几种方法可以在Git中实现这一点,但哪种解决方案最简单?

3 个答案:

答案 0 :(得分:1)

其他人概述的rebase操作的简单简写,如果你真的只想让一个提交代表分支中的所有工作,那就是使用--squash选项到git merge

git checkout develop
git merge --squash feature_xxx

这将离开你

A---B---C---D---XYZ  develop
 \         
  X---Y---Z    feature_xxx

其中XYZ是单个提交。然后,您可以删除feature_xxx分支。

顺便一提 - 只是一个术语问题,但值得我保持直观:即使使用原始方法,你也推动feature_xxx分支。在git中,分支不是一系列提交;一个分支是一个ref,它是一个指向提示提交的指针,仅此而已。

所以你的问题,用git来说,并不是如何避免推动分支。它是如何表示来自分支的更改,就好像这些更改是在单个正常提交中直接在develop上进行的。

虽然这是一个意见和环境问题,但我通常更喜欢自己保留功能分支的拓扑结构。当我问人们为什么认为--squash ed合并“更清洁”时,通常它最终会输出log。但是如果你在合并上添加了一个好的提交消息,只需将log传递给--first-parent命令就可以获得线性log输出,而无需使用像{{1}这样的修正主义历史记录。合并。

答案 1 :(得分:0)

一种选择是在feature_xxx上重新定位develop,然后在功能分支中快速转发develop分支。

<强>之前:

develop ... A---B---C---D
             \
feature       X---Y---Z

现在执行以下操作:

git checkout feature_xxx
git rebase develop

这将为您提供以下图表:

develop ... A---B---C---D
                         \
feature                   X'---Y'---Z'

现在,您可以使用功能分支中的更改快进 develop分支:

git checkout develop
git merge feature_xxx

这会让 develop feature_xxx分支看起来相同:

develop ... A---B---C---D---X'---Y'---Z' feature

换句话说,您的历史记录显示您在develop之上完成了所有工作。您可能还需要进行合并,但您所做的工作是线性的,并且应该没有来自工作本身的合并提交。

答案 2 :(得分:0)

当你处于这个阶段时

A---B---C---D    develop
 \
  X--Y--Z          feature_xxx

当你还在功能分支上时,你可以做一个rebase git rebase develop,然后你可以回去开发并git merge feature来快速指向使用功能分支将分支开发到同一个地方,然后您的存储库应如下所示:

  A---B---C---D--X--Y--Z        both develop & feature_xxx are pointing at Z

如果您不想要这么多提交,可以使用git rebase -i SHA1-of-the-commit-you-wanna-go-back-to

压缩它们

此时,您将从命令行中看到以下消息

pick 4b33d01 some commit message for X
pick 61516e4 some commit message for Y
pick e0311e2 some commit message for Z

只需更改您要压缩的提交操作&#34;选择&#34;到&#34; s&#34;对于壁球,像这样

pick 4b33d01 some commit message for X
s 61516e4 some commit message for Y
s e0311e2 some commit message for Z

最后一步:!wq,你很高兴。