挑选一系列提交并将其压缩到子目录或子树中



我怎样才能告诉樱桃挑选选择提交范围并压制它?

或者换句话说,将两个提交之间的差异应用于存储库的当前状态?

以下内容不起作用(樱桃采摘没有 --squash 选项(:

git cherry-pick --squash e064480..eab48b59c

注意:我的用例是在子树场景中 - 在任何人开始争论我不应该压制之前。

以下工作,但随后我有一系列单独的提交。之后,我可以通过交互式变基手动挤压它们。

git cherry-pick -X subtree=vendor/package e064480..eab48b59c

有没有办法把挤压作为樱桃采摘的一部分?

-n传递给git cherry-pick 。这将应用所有提交,但不会提交它们。然后只需执行git commit即可在单个提交中提交所有更改。

对于某些用例,有用的替代方案与git cherry-pick -n可能git merge --squash - 例如,当您想在集成分支之上测试功能分支的更改而不变基时。

来源:git merge --squash 和 git cherry-pick 有什么区别?

从主→跟随从另一个分支中挑选两个提交

git checkout master
git cherry-pick :1  
git cherry-pick :2
git reset --soft HEAD~2 (number of cherry pick commits, i.e 2 ) 
git add . 
git commit
  1. 使用 git cherry-pick --no-commit <commit>…​ .
  2. 解决任何冲突。
  3. 犯。
  4. 继续git cherry-pick --continue
  5. 解决任何冲突。
  6. 现在修改对上一次提交的更改。
  7. 虽然git status显示了步骤 4 中的Cherry-pick currently in progress.循环。

从 2022 年的讨论中,还有其他方法:

  • git diff A...B | git apply --3wa

    • 它不显示提交消息,
    • 您将无法使用显示整个源文件的图形合并工具。
      当使用" git cherry-pick "并且存在冲突时,您可以在整个文件的上下文中看到更改。
  • Johannes Sixt 建议进行交互式变基

    例如,要将历史记录的范围A..B移植到 HEAD 之上,我会从(注意^0之后B开始,因为我不信任自己,所以我会保留真正的分支B不变,因为我可能会在运行 rebase 时犯错误(:

    $ git checkout --detach HEAD ;# this is only to use @{-1} later
    $ git rebase -i --onto HEAD A B^0
    

    然后,如果我的目标是将所有内容压缩到一个提交中,那么将所有"pick"(除了第一个(替换为"squash".
    这将使我有一次机会编辑单个提交消息,但编辑器缓冲区从所有原始消息的日志消息开始,因此我可以在编写新内容时从中挑选好部分。我会在分离的 HEAD.
    上得到结果如果我喜欢结果,我可能会更新我最初使用它的分支。

    $ git checkout -B @{-1}
    

    或者,如果我不这样做,也许是因为我犯了错误,那么我可以丢弃它并回到原来的分支。

    $ git checkout @{-1}
    

然而,Noam Yorav-Raphael反对:

我使用" rebase -i"的主要问题是它需要我逐个修复合并冲突,在它们出现的每个提交中,而不是一次修复所有冲突,而是将更改从 A 处理 B为一体.
它还需要手动编辑 AB 之间的每次提交。

诺姆提议:

我认为使用现有命令执行我想要的操作的最佳方法是:

git checkout A
git merge --squash B
git commit --no-edit
git checkout @{2}            # Go back to where we were at the beginning. 
                             # This is not exact, as you're in detached HEAD state.
git cherry-pick --edit @{1}  # cherry-pick the squashed commit A..B

这允许您一次性修复合并冲突,显示导致冲突的整个文件,并允许您编辑提交消息,从所有压缩提交的描述开始。

我认为这也很好地解释了"cherry-pick --squash"将做什么:它确实是"merge --squash"的类比,但用于樱桃挑选。

相关内容

  • 没有找到相关文章

最新更新