樱桃将多个提交作为一个提交,而无需逐一提交 git 应用补丁

cherry pick multiple commits as one without going through each one git apply patch

我有分支 A,有一些提交我需要挑选到分支 B。 在第一个精选中,我添加了后来在最后一次提交中删除的代码。

当我尝试使用 first_commit^..last_commit 挑选它们时,它仍然一一挑选提交 - 迫使我解决我在第一次提交中添加的代码和其他开发人员代码之间的冲突,即使我真的不需要解决这些冲突——因为我已经在最后一次提交中删除了这段代码,所以我无论如何都在尝试挑选!

所以我的问题是:有没有一种方法可以在不逐个提交的情况下挑选一系列提交(解决每个提交的冲突)- 但只是代码更改的最终结果(解决应用所有提交后的更改与其余代码之间的冲突,如果有的话)。

P.S. 我无法将 A 拉入 B,因为它包含我不想要的其他内容,我想我也尝试过类似结果的变基..

谢谢!

一个快速的方法是:您可以使用 git merge --squash.

创建一个单独的压缩提交,而不是 cherry-picking 一系列单独的提交

如果你想在最终结果中有一个提交序列,那么你将需要使用 cherry-pickrebase 来重放单个提交,并且你可能必须解决冲突每个提交基础。

您可以尝试避免 cherry-picking 有问题的提交:

如果您的初始历史记录如下:

*--*--*--*--*--*--*--*--*--* <- main
    \
     \
      x1--a--b--c--d--e--x2 <- feature
      ^                  ^
  problematic commit     |
                     revert of commit x1

您可以尝试 运行 git cherry-pick x1..e(所有提交到 e,不包括 x1)而不是 git cherry-pick main..feature(所有提交到 feature 不包括 main,但包括 x1x2)


[更新] 从你的评论来看,你似乎想编辑你的历史记录(例如:将一些现有的提交分成“你想保留的部分”和“你想丢弃的部分”)。有几种方法可以做到这一点:

如果您有能力在一次提交中压缩所有开发人员,这是一种方法:

  • 形成你的分支,创建一个临时分支:
git checkout -b wip
  • 要将您的提交压缩在一起,找到您的分支从 master 分支分叉的提交的 <sha>,然后使用 git reset --soft :
git reset --soft <sha>
git commit -m "my devs in one single commit"
  • 现在重复几次:检查与之前提交的差异,从您的提交中删除一段代码
git diff HEAD^ HEAD
# edit a file
git add file
git commit --amend

一旦你得到的结果只包含你想要移植的内容,你就可以变基或与目标分支合并