首页 > 解决方案 > 从一个大分支的许多提交中创建多个分支

问题描述

我有一个大型功能分支,在那里我做了很多非常小的代码清理(这些都是相关的)。这个分支包含大约 100 多个提交,每个大约 1-5 行,每个通常只涉及 1 个,也许是 2 个文件。

我和我的团队更喜欢尽量减少拉取请求,以便更容易审查并在出现问题时恢复。

我的问题是,从我的大型功能分支一次“自动”拉(比方说)5 个提交到他们自己的新分支中,然后推送它们,然后重复直到功能分支中没有更多提交的最佳方法是什么?

我知道我将如何手动执行此操作,并且该过程看起来像这样:

# Go to branch we want PRs to target:
git checkout main

# New PR branch:
git checkout -b cleanup/part-1

# Grab some commits from the large cleanup branch:
git cherry-pick <SOME_COMMIT_HASH>
git cherry-pick <SOME_COMMIT_HASH>
git cherry-pick <SOME_COMMIT_HASH>
git cherry-pick <SOME_COMMIT_HASH>
git cherry-pick <SOME_COMMIT_HASH>

# Push, create a PR, then repeat steps for ~100 commits :\
git push

我想知道是否有更好的方法来做到这一点,因为我觉得这会有点乏味。

标签: gitshellgithub

解决方案


如果您不希望对合并/拉取请求进行更改,您可以简单地将分支标签添加到有问题的提交中。gitk可以提供帮助:只需单击提交并选择“创建分支”;然后推这个分支。当然,这也可以在命令行上完成,但这需要更多的输入(git branch pr1 commithash并且您需要先找出提交哈希)。

让我举例说明:

o <- your-branch
o
o <- pr3
o
o <- pr2
o
o <- pr1
o

“your-branch”是包含所有更改的原始分支。pr1将仅包含前两个更改。

创建pr1、推送、创建 PR/MR,对其进行审核和合并。然后 push pr2, push,合并。冲洗并重复。一旦一个分支被合并,它的更改将不会显示在后续分支的未来 PR/MR 中(Git 可以通过 DAG 检测哪些提交是新的并且需要合并,哪些提交已经之前已经合并)。

如果您总是将 5 个提交分组,那么 100 个提交大约需要 20 步。已经有了很大的进步。

如果您的任务可以通过顽固地接受每一次提交来完成,那么您可以使用 shell 循环来创建分支,例如:

git rev-list --reverse main..your-branch \
  | sed -n '0~5p' \
  | nl \
  | while read -r num commit; do \
      git branch "pr-$num" "$commit"; \
    done

(sed 调用可以替换为awk 'NR % 5 == 0',但这并不重要。结果在大多数系统上都是相同的)


推荐阅读