本文共 2152 字,大约阅读时间需要 7 分钟。
在中,有没有办法将所有更改从一个分支合并到另一个分支,但是同时压缩到一个提交?
我经常在一个单独的分支中处理一个新功能,并且会定期提交/推送 - 主要用于备份或将我正在处理的内容转移到另一台机器上。 大多数提交说“功能xxx WIP”或多余的东西。
一旦完成该工作并且我想将WIP分支合并回master,我想丢弃所有这些中间提交,并且只需要一个干净的提交。
是否有捷径可寻?
或者,一个命令如何压缩分支上的所有提交,因为它是分支的点?
您可以使用“rebase”命令执行此操作。 我们将分支称为“主要”和“功能”:
git checkout featuregit rebase main
rebase命令将重放“feature”上的所有提交,作为一个提交,其父级等于“main”。
你可能想要在git rebase main
git merge main
之前运行git merge main
,如果“main”自创建“feature”(或从最近的合并以来)发生了变化。 这样,如果发生合并冲突,您仍然可以获得完整的历史记录。
在rebase之后,您可以将分支合并到main,这将导致快进合并:
git checkout maingit merge feature
有关概述,请参阅的页面
在你的功能分支上试试git rebase -i master
。 然后,你可以将除了一个'pick'之外的所有内容更改为'squash'来组合提交。 请参阅
最后,您可以从master分支进行合并。
找到了! 合并命令有一个--squash
选项
git checkout mastergit merge --squash WIP
在这一点上,一切都被合并,可能是冲突的,但没有提交。 所以我现在可以:
git add .git commit -m "Merged WIP"
另一种选择是git merge --squash <feature branch>
然后最后做一个git commit
。
来自
--squash
--no-squash
生成工作树和索引状态,好像发生了真正的合并(合并信息除外),但实际上没有提交或移动
HEAD
,也没有记录$GIT_DIR/MERGE_HEAD
导致下一个git commit
命令创建合并承诺。 这允许您在当前分支之上创建单个提交,其效果与合并另一个分支(或章鱼的情况下更多)相同。
git merge --squash <feature branch>
是一个不错的选择。“git commit”告诉你所有功能分支提交消息,你可以选择保留它。
对于较少的提交合并。
git merge do x times --git reset HEAD ^ --soft then git commit。
风险 - 删除的文件可能会返回。
我想把我主人的所有提交压缩成一个。 我没试成功:
$ git checkout --orphan new_master$ git merge --squash masterfatal: 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别名来做到这一点。 我称之为git freebase
! 它将采用您现有的混乱,不可重复的功能分支并重新创建它,以便它成为一个具有相同名称的新分支,其提交压缩到一个提交并重新定位到您指定的分支(默认为master)。 在最后,它将允许您使用您喜欢的任何提交消息为您的新“自由”分支。
通过在.gitconfig中放置以下别名来安装它:
[alias] freebase = "!f() { \ TOPIC="$(git branch | grep '\\*' | cut -d ' ' -f2)"; \ NEWBASE="${1:-master}"; \ PREVSHA1="$(git rev-parse HEAD)"; \ echo "Freebaseing $TOPIC onto $NEWBASE, previous sha1 was $PREVSHA1"; \ echo "---"; \ git reset --hard "$NEWBASE"; \ git merge --squash "$PREVSHA1"; \ git commit; \ }; f"
通过运行以下命令在功能分支中使用它: git freebase <new-base>
我只测试了几次,所以先阅读它并确保你想要运行它。 作为一个小安全措施,它会打印起始sha1,因此如果出现任何问题,您应该能够恢复旧分支。
我将在github上的dotfiles repo中维护它: :
转载地址:http://bzcnb.baihongyu.com/