Squash直接提交功能而不进行rebase或merge

时间:2015-07-14 14:37:37

标签: git git-branch squash git-squash

我一直在阅读有关--squash提交的一些内容,但它们似乎都与--rebase齐头并进。

我有一个功能分支,其中包含一组这样的提交:

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

假设我想合并回Master分支,但我想首先清理我的功能提交。

是否可以:

  • 选择提交B,E和F并将它们作为一次提交压缩在一起?

OR

  • 我是否只能压制有序的提交,如此压扁:(A,B和C),或壁球(D,E和F)等?

无论哪种方式,我是否可以直接在我的功能上进行压缩,而不会立即初始化MergeRebase

如果是这样,我怎么能用Git做到这一点?

4 个答案:

答案 0 :(得分:4)

在我团队的工作流程中,我们经常在一堆提交中与上游合并,并且变基可能变得丑陋。我发现这有助于将所有提前完成的提交压缩成一个:

# 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

答案 1 :(得分:3)

解决方案可以将多个提交压缩为单个提交而无需重新部署。最好的选择是从master创建一个新的临时分支,然后将仅一次提交压缩的混乱分支合并到临时分支中,然后在工作分支中指向该分支,然后删除该临时分支。

让我们假设

  • 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 

答案 2 :(得分:0)

是和否。

是的,您可以避免更改提交的父级&#39; A&#39;但我相信你无法避免git rebase。您可以在同一个根目录上进行交互式rebase:

git rebase -i M2 Feature

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

答案 3 :(得分:0)

如果提交是本地的并且尚未推送,则此方法有效:

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

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

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

git push -f 

运行上述命令后。 git push -f 的常见警告适用 - 如果需要强制推送,请确保首先使用 git log 进行完整性检查!