在Git中,是否有一种方法可以将所有变更从一个分支合并到另一个分支,同时压缩到单个提交中?

我经常在一个单独的分支中处理一个新特性,并定期提交/推送——主要是为了备份或将我正在做的工作转移到另一台机器上。大多数提交的内容都是“功能xxx WIP”或一些多余的内容。

一旦工作完成,我想将WIP分支合并回master,我想放弃所有那些中间提交,只需要一个干净的提交。

有什么简单的方法吗?

或者,如果一个命令从分支所在的位置开始压缩分支上的所有提交呢?


当前回答

使用git merge——squash <feature branch>作为接受的答案可以达到这个目的,但它不会显示合并的分支是实际合并的。

因此,更好的解决方案是:

从最新的主分支创建一个新分支,在特性分支发起的主分支中提交。 使用git Merge—squash将<feature branch>合并到上面 将新创建的分支合并到master中。这样,特性分支将只包含一次提交,合并将在一个简短而整洁的插图中表示。

这个维基详细解释了这个过程。

在下面的例子中,左边的截图是qgit的结果,右边的截图是:

git log --graph --decorate --pretty=oneline --abbrev-commit

两个屏幕截图都显示了同一存储库中相同的提交范围。尽管如此,由于南瓜的存在,右眼更紧凑。

随着时间的推移,主分支偏离了db。 当db特性准备就绪时,一个名为tag的新分支会在master的提交中创建,db的根也在这个提交中。 从标签开始执行一个git merge -squash db,然后所有的更改都被分阶段提交,并在一次提交中提交。 从master,标签已合并:git合并标签。 分支搜索是不相关的,没有以任何方式合并。

其他回答

您可以使用“rebase”命令来完成此操作。让我们称分支为“main”和“feature”:

git checkout feature
git rebase main

rebase命令将重播“feature”上的所有提交,作为父级等于“main”的一次提交。

你可能想在git rebase main之前运行git merge main,如果"main"在"feature"创建之后(或者在最近的合并之后)发生了变化。这样,您仍然拥有完整的历史记录,以防遇到合并冲突。

在rebase之后,你可以将你的分支合并到main,这应该会导致一个快进合并:

git checkout main
git merge feature

请参阅“从概念上理解Git”的rebase页面,以获得更好的概述

尝试git rebase -i master在你的特性分支上。然后,你可以将除一个“pick”以外的所有“pick”更改为“squash”,以合并提交。参见使用rebase压缩提交

最后,您可以从主分支进行合并。

发现它!合并命令有一个——squash选项

git checkout master
git merge --squash WIP

此时,所有内容都已合并,可能存在冲突,但尚未提交。所以我现在可以:

git add .
# git add -u  # might be preferable, see below
git commit -m "Merged WIP"

你有一个主分支和一个特征分支。你在一个特性分支上有很多提交。你不希望特性分支的所有提交都出现在主节点的提交历史上。遵循以下步骤

从最新的主代码创建一个新分支,您就在那个分支中

git checkout -b latest_MCode

现在将你的feature分支合并到latest_Mcode分支中

Git合并—压缩特性

没有-m参数提交吗

Git提交#不带-m

编辑器应该是一个包含所有提交日志和从特性分支更改的文件的弹出窗口。你可以在这里看到所有的特性分支提交。如果你愿意,你可以删除所有内容,只写一行你想在合并到master后显示的提交消息。按“i”键,然后写入信息,然后按“Esc”键->:wq->Enter键保存并退出编辑器。 4. 将新创建的分支合并到master中

git checkout master
git merge latest_Mcode
git push

你完蛋了! 最初的答案可以在GithubLink上找到

使用git merge——squash <feature branch>作为接受的答案可以达到这个目的,但它不会显示合并的分支是实际合并的。

因此,更好的解决方案是:

从最新的主分支创建一个新分支,在特性分支发起的主分支中提交。 使用git Merge—squash将<feature branch>合并到上面 将新创建的分支合并到master中。这样,特性分支将只包含一次提交,合并将在一个简短而整洁的插图中表示。

这个维基详细解释了这个过程。

在下面的例子中,左边的截图是qgit的结果,右边的截图是:

git log --graph --decorate --pretty=oneline --abbrev-commit

两个屏幕截图都显示了同一存储库中相同的提交范围。尽管如此,由于南瓜的存在,右眼更紧凑。

随着时间的推移,主分支偏离了db。 当db特性准备就绪时,一个名为tag的新分支会在master的提交中创建,db的根也在这个提交中。 从标签开始执行一个git merge -squash db,然后所有的更改都被分阶段提交,并在一次提交中提交。 从master,标签已合并:git合并标签。 分支搜索是不相关的,没有以任何方式合并。