git - 将一个分支中的所有缺失提交 rebase /复制到当前分支之上

标签 git git-rebase git-cherry-pick

好的,这看起来很简单,但我找不到简单的解决方案。假设有两个分支:

a - b - c - d - e - f <current_branch>
         \
          g - h - i <temp_branch>

我只想要 <temp_branch> 中所有缺失的提交在<current_branch>之上不碰<temp_branch>并且没有 merge 提交:

a - b - c - d - e - f - g' - h' - i' <current_branch>
         \
          g - h - i <temp_branch>

什么没用:

  • git rebase : 我可以先 rebase <temp_branch><current_branch> 之上并 merge 快进。但这不是我想要的,而且太复杂了。
  • git cherry-pick : 如果没有自动方式,则需要手动查找提交范围

一个简单的单线会很棒,比如

git rebase --reverse-order temp_branch HEAD

或者其他一些我不知道的命令?

最佳答案

简单的方法:

$ git status  # just to make sure you're on the current branch :-)

现在您确定自己在 current_branch 上:

$ git cherry-pick HEAD..temp_branch

依赖于 cherry-pick 的内部排序以正确的顺序执行它们,但不会跳过补丁等效提交。

跳过补丁相同提交的稍微困难的方法:

$ git cherry-pick $(git rev-list --reverse --topo-order \
    --right-only --cherry-pick HEAD...temp_branch)

或与 --left-onlytemp_branch...HEAD 相同(这些应该完全相同)。

(我没有测试过任何一个,但是 git rebase --interactive 使用:

git rev-list $merges_option --format="%m%H ${format:-%s}" \
    --reverse --left-right --topo-order \
    $revisions ${restrict_revision+^$restrict_revision} | \
    sed -n "s/^>//p" | ...

其中 $merges_option--no-merges --cherry-pick$revisions$upstream... $orig_head 其中那些是显而易见的,而 $restrict_revision 通过 --fork-point 如果指定)。 sed 命令删除右侧的提交。您可能还需要一个显式的 --no-merges,尽管在​​图示的情况下不需要这样做。)

关于git - 将一个分支中的所有缺失提交 rebase /复制到当前分支之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38464546/

相关文章:

git - 选择性 Git pull 请求

git - 检测 GitHub commit 的 IP 地址

git - 如何挑选一系列提交并将它们 merge 到另一个分支中?

git - Git 中有某种反向挑选吗?

windows - 如何批量删除 stashes?

git commit 在索引中留下更改

git - 在交互式 rebase 中删除/删除当前提交

git - 删除旧的、已推送的 git commit 中对文件的更改?

git - 如何删除旧的 rebase?

git - 当重命名文件很常见时替代 git cherry-pick