33

是否可以在与主分支合并之前将分支上的提交压缩为单个提交?我认为这将是一个相当普遍的情况,但也许我没有使用正确的搜索词。

我将更详细地解释这个场景。通常,我希望在处理分支中的更改时进行许多本地提交,以确保我拥有全面的更改历史记录。但是一旦完成分支中的更改,当我合并到 main 时,我想将分支上的提交减少到一个,然后将其合并到 main。我确实知道在 Git 中提交成本很低,但在某些情况下,我可能更喜欢这样做。

*   merge to main
|\
* | commit 2 on main
* | commit 1 on main
| * commit 2 on branch
| * commit 1 on branch
|/
*   branch from main

看起来像

*   merge to main
|\
* | commit 2 on main
* | commit 1 on main
| * commit on branch (branch commits flattened to one)
|/
*   branch from main

我是 git 的新手。如果我在使用术语时出现错误,我深表歉意。

4

4 回答 4

31

我建议学习使用交互式变基,但如果你觉得它太复杂,你可以简单地使用

git reset --soft <diverging-commit>

在不更改索引的情况下撤消直到分歧点的所有提交,并且

git commit -s

对所有更改进行一次提交。

于 2012-07-31T04:02:31.123 回答
15

使用交互式变基。找到您的分支与 master 分歧的提交(可以使用git merge-base; 让我们称之为 commit <diverge>),然后

git rebase -i <diverge>

并且会弹出一个编辑器,允许您以交互方式重写历史记录。你会想要压缩提交。

于 2012-07-30T15:35:46.643 回答
13

您还可以使用git merge --squash <branch>合并分支而不执行任何提交:

$ git checkout master
$ git merge --squash mybranch
...
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
$ git commit

(更新:删除了提倡避免重写历史的文章的链接。我现在认为在审查之前压缩小功能分支是一个好习惯。)

于 2012-12-16T21:14:02.553 回答
2

git rebase。该-i选项使您有机会编辑、压缩(您想要的)甚至删除提交。

比如我一般的使用方式是这样的:

git rebase -i origin/master
....
git push
于 2012-07-30T15:37:29.013 回答