43

对我们来说,一个常见的开发工作流程是检查分支b,向它提交一堆,然后将所有这些提交压缩成一个(仍然打开b)。

但是,在rebase -i压缩所有提交的过程中,经常会在多个步骤中发生冲突。

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

我已经进行了一些搜索,但我没有找到我正在寻找的确切内容。我不想这样做,merge --squash因为我们想在合并之前测试压缩的特性分支。

4

3 回答 3

75

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

要找到要重置的提交:

git merge-base HEAD BRANCH_YOU_BRANCHED_FROM

然后

git reset --soft COMMIT_HASH

然后重新制作提交,也许:

git commit -am 'This is the new re-created one commit'
于 2013-06-27T23:20:45.807 回答
10

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

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

解释:

  1. 合并和解决冲突
  2. 保持更改暂存,但重置为旧头
  3. 使用功能分支最新提交中的提交消息和作者提交所有更改
于 2014-01-28T22:50:51.297 回答
1

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

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

例如,您可以调用以下命令将“master”提交中的所有提交压缩到 HEAD,无论沿途会有多少冲突:

git squash master

当你“压缩和合并”拉取请求时,它基本上是 GitHub 所做的。

于 2020-06-01T19:44:45.047 回答