Git rebase 压缩分支中的所有提交,从另一个分支,没有冲突

问题描述 投票:0回答:3

我们常见的开发工作流程是签出分支

b
,向其提交一堆,然后将所有这些提交压缩为一个(仍在
b
)。

但是,在压缩所有提交的

rebase -i
过程中,多个步骤经常会发生冲突。

我本质上想将分支更改为一个提交,代表最终提交时存储库的状态

b

我已经进行了一些搜索,但还没有找到我正在寻找的东西。我不想

merge --squash
因为我们想在合并之前测试压缩的功能分支。

git rebase squash
3个回答
83
投票

如果您不需要提交信息,那么您可以进行软重置。然后文件保持原样,当您提交时,此提交将位于您重置的提交之上。

找到要重置为的提交:

git merge-base HEAD BRANCH_YOU_BRANCHED_FROM

然后

git reset --soft COMMIT_HASH

然后重新设计提交,也许:

git commit -am 'This is the new re-created one commit'

10
投票

这与 Rasmus 的答案类似,但分为三个步骤,应该始终有效:

$ git merge feature1
$ git reset --soft HEAD@{1}
$ git commit -c feature1

说明:

  1. 合并并解决冲突
  2. 保留更改,但重置为旧头
  3. 使用提交消息和作者从功能分支最新提交提交所有更改

4
投票

我专门为此任务创建了一个工具:

https://github.com/sheerun/git-squash

例如,您可以调用以下命令将所有提交从“master”提交压缩到 HEAD,无论一路上会有多少冲突:

git squash master

这基本上就是 GitHub 在“压缩并合并”拉取请求时所做的事情。

© www.soinside.com 2019 - 2024. All rights reserved.