假设我从远程仓库中提取分支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中实现这一点,但哪种解决方案最简单?
答案 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
,你很高兴。