在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
.
忽略的文件中
我在一个多开发人员环境中的存储库上工作,该存储库有一个名为 "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
.