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

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

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

是否有捷径可寻?

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


#1楼

您可以使用“rebase”命令执行此操作。 我们将分支称为“主要”和“功能”:

git checkout feature
git rebase main

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

你可能想要在git rebase main git merge main之前运行git merge main ,如果“main”自创建“feature”(或从最近的合并以来)发生了变化。 这样,如果发生合并冲突,您仍然可以获得完整的历史记录。

在rebase之后,您可以将分支合并到main,这将导致快进合并:

git checkout main
git merge feature

有关概述,请参阅了解Git Conceptually的rebase页面


#2楼

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

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


#3楼

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

git checkout master
git merge --squash WIP

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

git add .
git commit -m "Merged WIP"

#4楼

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

来自Git合并

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

这很好用。


#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中维护它: https : //github.com/stevecrozz/dotfiles/blob/master/.gitconfig

将来自另一个分支的所有更改合并为单个提交相关推荐

  1. gif 分支的新建与合并

    分支的新建与合并 现在让我们来看一个简单的分支与合并的例子,实际工作中大体也会用到这样的工作流程: 开发某个网站. 为实现某个新的需求,创建一个分支. 在这个分支上开展工作. 假设此时,你突然接到一个 ...

  2. git / 如何将其他分支的某些 commit 合并到当前分支中?

    前几天被问到如何用 git 将其他分支的某些 commit 合并到当前分支的问题,当时一点概念都没有,现在总结一下. 需要用到的指令为 cherry-pick,栗子: git cherry-pick ...

  3. 将fork出来的分支与原项目合并

    转载地址:如何同步 Github fork 出来的分支 git remote add upstream git@github.com:original_owner/original_repositor ...

  4. git 图形化工具 GitKraken 的使用 —— 分支的创建与合并

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 分支管理是Git工作流的重点 在之前的文章中通过GitKraken可以很清楚的看到,每一次commi ...

  5. Git如何合并分支到主干及合并主干到分支

    Git如何合并分支到主干及合并主干到分支 文章目录 Git如何合并分支到主干及合并主干到分支 零.预备知识 一.创建分支 二.合并分支到主干 三.合并主干到分支 参考资料 精益开发实践用看板管理大型项 ...

  6. git命令判断当前分支是否与master合并

    git命令判断当前分支是否与master合并 有的时候在编写批处理脚本时,需要判断git的当前分支是否与目标分支合并,则可以通过下面的脚本进行判断. is_merged=0 git log origi ...

  7. git操作---分支的创建和合并

    git操作---分支的创建和合并 1.分支创建1:git branch <new_branch_name> 2.分支创建2:git checkout  -b/-B  <new_bra ...

  8. Git多分支开发时 merge 合并策略

    一 . develop.master.hotfix 合并策略 项目一般会有develop.master另个分支develop分支部署在测试环境测试,多个开发工程师把自己的commit都提交到devel ...

  9. Git 分支与主干的合并

    项目一般包含主干和分支,两者的合并是常用的操作. master表示主干的名称,branch表示分支的名称. 1.主干合并分支 Git命令需要在主干下运行,命令执行后,分支的代码同步到了主干. (1)在 ...

最新文章

  1. O(n)线性构造后缀树详解(一)
  2. bat脚本注释多行_cmd批处理常用符号详解
  3. 使用pscp从windows电脑拷贝数据到linux遇到的ssh_init错误
  4. 【MobX】390- MobX 入门教程(上)
  5. 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)
  6. Peoplesoft取Translate Value标签值的方法
  7. 交叉熵损失函数原理详解,KL散度
  8. 关于HTML静态页面(含自动分页)生成的可行性方案
  9. 《css设计彻底研究》读书笔记之 float 浮动原理
  10. 栈溢出脚本_污点分析挖掘漏洞演示——如何在8小时内从零发现cve20120158(word溢出漏洞)...
  11. 《Outlier Analysis》书籍
  12. 一些用xib加载主界面的过程
  13. 系统类配置(三)【ubuntu14.04或者ubuntu16.04 配置caffe】
  14. Spring 中的重试机制,简单、实用!
  15. 数梅派4b 显示器_无显示器配置树莓派4B
  16. 服务器四核cpu性能排行,服务器cpu性能排行
  17. 计算机和软件专业大学排名,全国计算机软件专业大学排名TOP20,清华居然不是第一!...
  18. scikit-learn中的PCA
  19. AliOS Things的SDK ESP8266 连接阿里生活物联网平台 配网失败解决方案
  20. 王立柱《c语言》3.5.4

热门文章

  1. Java 正则表达式源码解析
  2. Objective-C NS_OPTIONS 类型的枚举
  3. (0029) iOS 开发之API HTTP 请求调试网站
  4. nodejs 运行linux命令,node.js执行shell命令
  5. oracle分页数据,oracle 分页 数据重复 数据不正确
  6. 2017-2018-1 20155327 实验五 通讯协议设计
  7. 程序运行时,内存占用查看
  8. 报错: eclipse加载maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-plugin:2.3.2...
  9. php面试题之五——MySQL数据库(基础部分)
  10. poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题