我在一个存储库上的多开发人员环境中工作,该存储库有一个名为" develop"的分支,它经常更新。但是,开发方面存在一些问题,我想在我的本地计算机上创建一个分支,比如说" custom_develop",我可以在那里做几个提交我不会#39 ; t打算推回主存储库。
当我在功能分支上工作时,我想首先创建一个名为" feature / ticket-123"的custom_develop分支,然后创建几个提交。然后,当我想我已经完成了123号机票的工作时,我想制作" feature / ticket-123"成为" develop"的一个分支。而不是" custom_develop"的分支,以便我可以创建一个拉入请求,它将合并到远程服务器上的develop。
我怎样才能在git中执行此操作?
如果我尝试
git checkout develop
git checkout -b custom_develop
git commit -m "Commit I don't want to share"
git checkout -b feature/ticket-123
git commit -m "Ticket-123: Refactor"
git rebase develop
我得到了
Current branch feature/ticket-123 is up to date.
并且git日志仍然包含"提交我不想分享"提交。
答案 0 :(得分:2)
我将使用图表直观地描述您的问题。
这就是你现在所拥有的:
A <- develop
\-- B (don't share) <- custom_develop
\--C <- feature/ticket-123
这就是你想要的:
A <- develop
\-- C' <- feature/ticket-123
\-- B (don't share) <- custom_develop
\--C <- no branch
问题在于,默认情况下,rebase将尝试重放从当前提交的合并基础发生的所有提交以及要重新绑定到的提交。在你的情况下,merge-base(最后一个公共父)是A.因此,没有什么可以重放,没有在开发分支上与A分歧的提交。这就是为什么你得到了最新的&#34;信息。然而,即使开发已经取得进展,你仍然会遇到问题,因为Git会将你的所有提交重放到当前开发的任何地方,包括你想忽略的提交B。
因此,您必须使用rebase的--onto
选项:
git rebase --onto develop B
这将重播当前分支中不是B(或B本身)的父母的所有提交&#34;到&#34;开发。
语法可能令人困惑。在默认情况下,您只需指定&#34;到&#34;提交,但没有--onto
关键字。在非默认情况下,您指定&#34;忽略&#34;提交您需要指定--onto
关键字,即使您确实添加了&#34;忽略&#34;承诺。如果Git允许您使用git rebase develop --ignore B
指定此内容,那会更好。
另一个选项,如果您希望忽略的提交不在您的分支底部,即合并库之后的提交,则需要使用交互式rebase。
git rebase -i develop.
然后,当交互式窗口显示您想要忽略的提交时注释。
最后,拥有一个永久的自定义分支可能不是一个好主意。最好将特定于环境的属性放在使用.gitignore
忽略的文件中。