博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
将来自另一个分支的所有更改合并为单个提交
阅读量:2290 次
发布时间:2019-05-09

本文共 2152 字,大约阅读时间需要 7 分钟。

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

我经常在一个单独的分支中处理一个新功能,并且会定期提交/推送 - 主要用于备份或将我正在处理的内容转移到另一台机器上。 大多数提交说“功能xxx WIP”或多余的东西。

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

是否有捷径可寻?

或者,一个命令如何压缩分支上的所有提交,因为它是分支的点?


#1楼

您可以使用“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

有关概述,请参阅的页面


#2楼

在你的功能分支上试试git rebase -i master 。 然后,你可以将除了一个'pick'之外的所有内容更改为'squash'来组合提交。 请参阅

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


#3楼

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

git checkout mastergit merge --squash WIP

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

git add .git commit -m "Merged WIP"

#4楼

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

来自

--squash

--no-squash

生成工作树和索引状态,好像发生了真正的合并(合并信息除外),但实际上没有提交或移动HEAD ,也没有记录$GIT_DIR/MERGE_HEAD导致下一个git commit命令创建合并承诺。 这允许您在当前分支之上创建单个提交,其效果与合并另一个分支(或章鱼的情况下更多)相同。


#5楼

git merge --squash <feature branch>是一个不错的选择。“git commit”告诉你所有功能分支提交消息,你可以选择保留它。

对于较少的提交合并。

git merge do x times --git reset HEAD ^ --soft then git commit。

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


#6楼

我想把我主人的所有提交压缩成一个。 我没试成功:

$ 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"

这很好用。


#7楼

我创建了自己的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/

你可能感兴趣的文章
Python模块之---Pexpect
查看>>
Python的Pexpect详解
查看>>
Python模块:optparse 处理命令行参数
查看>>
supervisor安装配置与使用
查看>>
全文索引原理及范例
查看>>
Django运行方式及处理流程总结
查看>>
Android社区链接
查看>>
Android Booting
查看>>
Android4.0之init读取init.ic的过程
查看>>
uboot-2011.12移植到S3C2440(二)——点亮LED灯,the very beginning。
查看>>
LeetCode之Median Of Two Sorted Arrays
查看>>
java.util.Stack类简介
查看>>
求职信结尾处常用语
查看>>
申请原因常用语
查看>>
求职信开头处常用语
查看>>
英文求职信(五)
查看>>
英文求职信(四)
查看>>
英文求职信(三)
查看>>
英文求职信(二)
查看>>
UML在关系型数据库设计中的应用
查看>>