如何将大型Git分支拆分为许多较小的分支?

Mic*_*ker 27 git branch cherry-pick

我从SVN导入Git,现在我有一个大分支,像这样:

  • 研究特征C.
  • 研究特征B.
  • 研究特征C.
  • 研究特征C.
  • 研究特征B.
  • 研究特征A.

我想要单独的功能分支,A,B,C.我是樱桃挑选新分支的提交,但这不会从原始分支中删除它们所以我必须手动跟踪我已经拔出的分支.

有大约800个提交要分开,也许有50个功能/错误修正.

如果我在git日志中以某种方式反映这种方式,那将是很好的,所以我知道我已经完成了哪些.这可能吗?

我可以重新整理整个分支,跳过我已经撤出的提交,但我担心这会导致很多冲突.我不想在每次提交时解决500个冲突.

将一个超级分支机构的提交提取到较小的功能分支上的最佳方法是什么,同时跟踪您的进度?

wil*_*ler 30

在这种情况下我做的是使用交互式rebase.

在你的HEAD,你创建分支A,BC.还可以创建一个"备份"分支(您可以命名backup),以防出现问题并且您需要原始HEAD备份.

git branch feature-a
git branch feature-b
git branch feature-c
git-branch backup-before-rebase
Run Code Online (Sandbox Code Playgroud)

然后,在您希望它们开始的提交处创建一个分支,可能是在方便的稳定提交中.叫它new_trunk什么的.

git checkout HEAD~50       ## this will be the new tree-trunk
git branch new_trunk
Run Code Online (Sandbox Code Playgroud)

然后,执行交互式操作rebase并选择要保留在该分支中的提交.以这种方式使用,它基本上就像cherry-pick散装一样.

git checkout feature-a
git rebase -i new_trunk    ## -i is for "Interactive"
Run Code Online (Sandbox Code Playgroud)

当你完成后,你应该有3个分支,从不同的历史开始,如果你仍然需要,它应该反映旧new_trunkbackup分支HEAD.

  • 如果您一次又一次遇到相同的冲突,请查看“rerere”以提供帮助。 (2认同)

Jos*_*ech 9

就个人而言,我真的会考虑这些大变化的利弊(如果你已经这样做的话再一次).如果你遇到冲突(这是一个很大的rebase/cherry-pick烦人并且难以解决),你可能会在将功能合并回"master"分支时遇到困难.

是不是更好/更容易冻结你的大分支,让它"完成"(或"足够好")并在其上创建新的功能分支?(或者只排除一些分支?)

但对你的问题:

如果要自动跟踪更改/缺少提交,请使用git cherry命令.

git cherry featureBranch bigBranch
Run Code Online (Sandbox Code Playgroud)

如果在分享或重新定位功能分支时没有冲突,您可以使用以前的代码和一些额外的管道:

git cherry featureBranch bigBranch | awk '{ print "pick " $2 }' | tee remaining
Run Code Online (Sandbox Code Playgroud)

这将在featureBranch中打印(并保存到名为"remaining"的文件)提交.您可以将它添加到bigBranch上的交互式rebase中,以丢弃您不再需要的提交.(也许您可以使用"ed"编辑器将其编写为git编辑器并将命令传递给交互式rebase的标准输入,但我没有尝试过.)

  • 与`git cherry`好点。但是,我可以将其与多个未合并的功能分支一起使用吗?我不想将所有潜在功能分支合并到一个大的混乱分支中,只是为了比较剩下的提交。我是否必须将每个功能分支分别与原始分支进行比较,然后以某种方式划掉所有比较中都没有的所有提交ID?在我挑选它们时如何标记每个提交呢? (2认同)

r0h*_*rma 7

只是为了进一步简化威勒勒的答案

制作功能分支并备份,以防万一

git branch feature-a
git branch feature-b
git branch feature-c
git branch backup-before-rebase
Run Code Online (Sandbox Code Playgroud)

然后签出一个功能分支并从您希望他们开始的提交进行交互式变基

git checkout feature-a
git rebase -i <safecommit>
enter code here
Run Code Online (Sandbox Code Playgroud)

如果您希望某些功能分支共享一些提交以保持树的干净,请不要在开始时创建后面的功能分支,而是在获得重新基础的功能分支后,然后使用共享提交引用作为下一个安全提交

#on branch feature-a
git checkout -b feature-d
git rebase -i <sharedcommit>
Run Code Online (Sandbox Code Playgroud)