合并后压缩Git提交

合并后压缩Git提交,git,branching-and-merging,git-rewrite-history,Git,Branching And Merging,Git Rewrite History,我有一个功能分支,它有几个提交(见下文)。自分支以来,也向master添加了一些提交 因此,我将master合并到feature分支中 git checkout feature git merge master 这将导致功能分支上出现以下日志历史记录: * E (HEAD) merging master into feature |\ | * D feature commit 2 | | | * C feature commit 1 * | B master commit 2 |/

我有一个功能分支,它有几个提交(见下文)。自分支以来,也向master添加了一些提交

因此,我将
master
合并到
feature
分支中

git checkout feature
git merge master
这将导致
功能
分支上出现以下日志历史记录:

*    E (HEAD) merging master into feature
|\
| *  D feature commit 2
| |
| *  C feature commit 1
* |  B master commit 2
|/
*    A master commit 1
实际上,功能路径上的提交数量很大(100+),我想将它们全部压缩


是否有一种方法可以仅挤压功能分支上的提交,同时保留
主行上的提交?

可以。因此,您希望将问题中的提交图转换为以下新图:

*    E (HEAD) merging master into feature
|\
| *  D feature commit (squashes 1 and 2)
* |  B master commit 2
|/
*    A master commit 1
程序如下:

  • 确保你的工作树是干净的。没有未提交的更改,没有暂存的更改,没有未跟踪的文件
  • 确保您位于功能分支上
  • git reset——功能分支上D的硬*散列*
  • git reset——主机上的软*散列*
  • git提交
    您想要的消息
  • git合并主机

  • 如果问题只涉及所有提交都只存在于本地存储库中的情况,那么问题(除了我的问题)就解决了。如果只涉及区域设置git存储库,则有权:

    git checkout feature
    git rebase -i
          // mark all commits to be squashed
    git merge master
    
    但您应该将masterbranch重置为
    E
    ,以便发布您的更改:

    git checkout master
    git reset --hard feature
    

    或者(如果你真的更喜欢与comitish合作)
    git reset——E*的硬*散列
    。如果
    C
    已被推送到远程存储库,我将检查
    git reset
    的使用是否有效。

    您仍然希望结果在功能分支上有一次提交并与master合并,还是希望所有工作都在master上应用而不进行分支?我认为是第一次(如果我理解正确的话)。基本上,在上面的图中,C和D应该被压缩成一个提交,并且从
    master
    (A,B)拉入的提交应该被保留。这样我就可以从这个分支将C->D->E直接合并到
    master
    。再次感谢!另一个问题-您在功能分支上的历史记录是完全线性的,还是有传入或传出的合并?不要忘记在之后进行更改#4@CodyStott软重置已经暗示了登台,尽管这很好,但我以前从未使用过
    soft
    选项。很高兴知道。在#6之后,仍然缺少“B”和“E”之间的链接,分支主节点仍然在“B”上。要做到这一点,请使用类似于
    git checkout master
    git reset--hard-feature