Git:将来自另一个分支的所有更改合并为一个提交

在Git中,是否有办法将所有更改从一个分支合并到另一个分支,但是同时压缩到单个提交?

我经常在一个单独的分支上工作一个新function,并定期提交/推送 – 主要用于备份或将正在工作的内容传输到另一台计算机上。 主要是那些提交说“特征xxx WIP”或什么冗余。

一旦这个工作完成,我想合并WIP分支到主,我想放弃所有这些中间提交,只是一个简单的提交。

是否有捷径可寻?

另外,如果一个命令将分支上的所有提交压缩了,那么它又如何呢?

另一个选项是git merge --squash <feature branch>然后最后做一个git commit

从Git合并

– 壁球

–no-南瓜

产生工作树和索引状态,就好像一个真正的合并发生了(合并信息除外),但实际上并没有提交或移动HEAD,也没有logging$ GIT_DIR / MERGE_HEAD使下一个git commit命令创build一个合并承诺。 这使您可以在当前分支上创build一个单独的提交,其效果与合并另一个分支(或更多的章鱼)相同。

find了! 合并命令有一个--squash选项

 git checkout master git merge --squash WIP 

在这一点上,一切都被合并,可能是冲突的,但没有承诺。 所以我现在可以:

 git add . git commit -m "Merged WIP" 

尝试你的function分支上的git rebase -i master 。 然后你可以改变除“一个”之外的所有内容,以“压扁”来组合提交。 看到压缩承诺与rebase

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

我想把主人的所有提交压缩成一个。 我尝试了这个失败:

 $ git checkout --orphan new_master $ git merge --squash master fatal: Squash commit into empty head not supported yet 

所以我这样做了:

 $ tar cf /tmp/git.tar --exclude .git . $ git checkout --orphan new_master $ tar xf /tmp/git.tar $ git commit -m "Initial commit" 

哪个效果很好。

git merge --squash <feature branch>是一个不错的select。“git commit”告诉你所有的function分支提交信息,并保留它。

less提交合并。

git merge做x次–git reset HEAD ^ –soft然后git commit。

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

你可以用“rebase”命令来做到这一点。 我们称分支为“main”和“feature”:

 git checkout feature git rebase main 

rebase命令将重放“feature”上的所有提交作为一个父项等于“main”的提交。

你可能想在git rebase main git merge main之前运行git merge main ,如果自从“feature”被创build(或者自从最近的合并以来)之后“main”已经改变了。 这样,如果您遇到合并冲突,您仍然拥有完整的历史logging。

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

 git checkout main git merge feature 

在概念上了解Git的基础页面,以获得良好的概述