20

我一直在阅读一些关于--squashing 提交的内容,但它们似乎都与--rebase.

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

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

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

是否有可能:

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

或者

  • 我可以只压缩按顺序提交的提交,所以压缩:(A、B 和 C)或压缩(D、E 和 F)等?

无论哪种方式,我可以直接在我的功能上做一个壁球,而不立即初始化 aMergeRebase使用它吗?

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

4

4 回答 4

17

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

# 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
于 2017-09-07T16:40:24.080 回答
4

是和不是。

是的,您可以避免更改提交 'A' 的父级,但我相信您无法避免git rebase. 您可以在同一个根上进行交互式变基:

git rebase -i M2 Feature

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

于 2015-07-14T15:10:03.630 回答
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 
于 2020-02-02T15:16:02.223 回答
2

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

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

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

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

git push -f 

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

于 2021-01-20T12:24:46.390 回答