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的基础页面,以获得良好的概述