在git中切换一个分支是哪个分支

Switch which branch a branch is a branch of in git

我在一个多开发人员环境中的存储库上工作,该存储库有一个名为 "develop" 的分支,该分支经常更新。但是,开发存在一些问题,我想在我的本地机器上创建一个分支,比如 "custom_develop",我可以在其中进行一些我不打算推​​回主存储库的提交.

当我在功能分支上工作时,我想首先创建一个名为 "feature/ticket-123" 的 custom_develop 分支,然后创建几个提交。然后,当我认为我已经完成了 123 票的工作时,我想让 "feature/ticket-123" 成为 "develop" 的一个分支而不是 "custom_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 日志仍然包含 "Commit I don't want to share" 提交。

我会用图表直观地描述你的问题。

这是您目前拥有的:

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 将尝试重播从当前提交的合并基础和您正在 rebase 的提交发生的所有提交。在您的情况下,合并基础(最后一个公共父级)是 A。因此,没有什么可重播的,在开发分支上没有与 A 不同的提交。这就是您收到 "up to date" 消息的原因。但是,即使开发已经取得进展,您仍然会遇到问题,因为 Git 会将您的所有提交重播到当前开发的任何地方,包括您想要忽略的提交 B。

因此,您将不得不使用 rebase 的 --onto 选项:

git rebase --onto develop B

这将重播当前分支中所有不是 B 父级(或 B 本身)的提交 "onto" 开发。

语法可能令人困惑。在默认情况下,您只指定 "onto" 提交,但没有 --onto 关键字。在指定 "ignore" 提交的非默认情况下,您需要指定 --onto 关键字,即使您实际上是在添加 "ignored" 提交。如果 Git 允许您用 git rebase develop --ignore B 指定它会更好。

如果您希望忽略的提交并非全部位于分支的底部,即合并基础之后的提交,则需要另一个选项,即使用交互式变基。

git rebase -i develop.

然后,当交互式 window 出现时,注释掉您希望忽略的提交。

最后,拥有一个永久的自定义分支可能不是一个好主意。最好将环境特定属性放在使用 .gitignore.

忽略的文件中