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

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

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

有什么简单的方法吗?

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


当前回答

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

git checkout master
git merge --squash WIP

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

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

其他回答

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

git checkout master
git merge --squash WIP

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

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

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

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

另一个选项是git merge——squash <feature branch>,然后最后做一个git提交。

从内部

——南瓜 ——no-squash 生成工作树和索引状态,就像真正的合并一样 发生了(除了合并 信息),但实际上并不制造 提交或移动HEAD,也不记录 $GIT_DIR/MERGE_HEAD导致下一个 Git commit命令创建一个合并 提交。这允许您创建一个 在当前的基础上进行单次提交 效果相同的分支 合并另一个分支(或更多分支) 章鱼的例子)。

您可以使用“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 merge——squash <feature branch>是一个很好的选择。“git commit”告诉你所有的feature branch提交消息,你可以选择保留它。

为了减少提交合并。

git合并 做x次——git重置头^——软 然后git提交。

风险删除的文件可能会回来。