直接在功能分支上压缩提交,无需使用rebase或merge

27

我已经稍微了解了一下有关 --squash 技术的内容,但似乎这些技术都需要和 --rebase 一起使用。

我有一个功能分支,其中包含如下一组提交记录:

(Feature)          A --> B --> C --> D --> E --> F --> G
                  /
(Master)  M1 --> M2 --> M3

假设我想合并回Master分支,但我想先清理一下我的特性分支上的提交。

有可能吗:

  • 选择提交B、E和F,并将它们压缩成一个提交?

或者

  • 我只能压缩按顺序进行的提交,如(A,B和C)压缩,或(D,E和F)压缩等吗?

无论哪种方式,我是否可以直接在我的特性分支上进行压缩,而不必立即使用MergeRebase进行操作?

如果可以,如何使用Git完成此操作?

4个回答

22

在我们团队的工作流程中,经常会在一堆提交中间与上游合并,而变基可能会变得很麻烦。我发现将所有领先于主分支的提交压缩为一个提交是有帮助的:

# Commit any working changes on branch "mybranchname", then...
git checkout master
git checkout -b mybranchname_temp
git merge --squash mybranchname
git commit -am "Message describing all squashed commits"
git branch -m mybranchname mybranchname_unsquashed
git branch -m mybranchname

# Optional cleanup:
git branch -D mybranchname_unsquashed

# If squashing already-pushed commits...
git push -f

2
也许你应该引用这个 https://gist.github.com/n00neimp0rtant/9515611 - user.friendly
在执行上述合并操作之前,先将主分支合并到你的特性分支中。 - SAM

9

这只适用于本地提交且尚未推送的情况:

git reset --soft HEAD~x
git commit -m "whatever"

其中x是您想要压缩的提交数量

如果您想要压缩的提交也在远程上,不确定这将如何工作 - 如果是这种情况,您“可能”需要:

git push -f 

运行上述命令后,git push -f 的常规警告适用 - 如果需要强制推送,请确保首先使用 git log 进行合理性检查(因为强制推送会覆盖远程代码)!


5

是的和不是。

是的,你可以避免改变提交“A”的父级,但我认为你无法避免 git rebase。你可以在相同的根上进行交互式变基:

git rebase -i M2 Feature

然后你可以做任何你想要的事情,在结尾分支 Feature 仍将从提交 M2 开始。


2
这就是我来这里的原因。一种在功能分支中仅压缩特定提交而不涉及主分支的方法。谢谢! - Justin Eyster
顺便提一下,如果您对于在您的特定情况下什么是M2(基础功能分支提交)有任何疑问,git merge-base <feature> <master>可能会有所帮助。 - Gleb

4
解决方案:可以将多个提交压缩成一个而不需要变基。最好的方法是从主分支创建一个新的临时分支,然后将混乱的分支压缩为一个单独的提交合并到临时分支中,然后在工作分支中指向它并删除临时分支。 假设
  • master 是您的主分支,
  • feature 是您的混乱工作分支
  • temp 是您的临时分支
如何操作?
git checkout -b <temp> <master>
git merge --squash <feature>
git commit -m "your single message"
git checkout <feature>
git reset --hard <temp>
git push -f
git branch -D <temp>

在此之前:

(Feature)          A --> B --> C --> D --> E --> F --> G
                  /
(Master)  M1 --> M2 --> M3

之后:

                           AG --> 
                          /
(Master)  M1 --> M2 --> M3 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接