Squash 直接提交功能,无需变基或合并

问题描述 投票:0回答:5

我读过一些关于

--squash
ing 提交的内容,但它们似乎都与
--rebase
齐头并进。

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

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

假设我想合并回

Master
分支,但我想先清理我的功能上的提交。

是否可以:

  • 选择提交 B、E 和 F 并将它们合并为一个提交?

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

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

Merge
Rebase
吗?

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

git git-branch squash git-squash
5个回答
19
投票

在我团队的工作流程中,我们经常在一堆提交的中间与上游合并,而变基可能会变得很丑陋。我发现这有助于将 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

6
投票

是和否。

是的,您可以避免更改提交“A”的父项,但我相信您无法避免

git rebase
。您可以在同一个根上进行交互式变基:

git rebase -i M2 Feature

然后你可以做任何你想做的事,在结束分支

Feature
仍然会从提交M2开始。


6
投票

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

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

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

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

git push -f 

运行上述命令后。

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


4
投票

解决方案无需变基即可将多个提交压缩为一个提交。最好的选择是从 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 

0
投票

几乎所有你提到的东西看起来都是可行的,除了压缩被其他人分开的提交(在你的例子中是 B E 和 F)。

我看到它可以这样做:

  1. 找出 Feature branch base commit (M2) 的 hash

    git merge-base Feature Master
    
  2. 然后在这个散列上rebase Feature分支(实际上是在同一个base上rebase)

    git rebase -i <hash you got on previous step>
    
  3. 现在您可以编辑将要变基的提交列表。

    对于您的示例(挤压 A、B 和 C),它可能是这样的:

    pick <A hash> <A commit description>
    squash <B hash> <B commit description>
    squash <C hash> <C commit description>
    pick <D hash> <D commit description>
    pick <E hash> <E commit description>
    pick <F hash> <F commit description>
    pick <G hash> <G commit description>
    
© www.soinside.com 2019 - 2024. All rights reserved.