草庐IT

Git 反复 merge squash

coder 2023-06-23 原文

我正在尝试在 git 中创建两个包含二进制文件的分支 - 一个“开发”分支和一个“稳定”分支。在我想将它们“发布”到稳定分支之前,开发分支可以对这些文件进行一些更改(并且稳定分支已重命名这些文件,以防相关)。

我可以做一个正常的 merge ,这工作正常,但保留了太多的历史——当 pull “稳定”分支时,来自“开发”分支的所有中间提交也被 pull (因为它们是父提交)。但是我们谈论的是没有任何合理 merge 策略的二进制文件(除了他们的/我们的),所以开发分支上的文件的实际历史是无用的。当我 pull “稳定”分支时,我得到这个:

          X-------------------G stable
         /                   /
    a---b---c---d---e---f---g development

因为 G 在开发分支中有一个父级,所以我在我的存储库中获得了开发分支的整个历史(c、d、e、f 和 g 的数据对象),我对此不感兴趣(X 是与 b 相同,应用了一些文件重命名)。

于是我尝试将git merge --squash从开发分支修改到稳定分支。第一次这样的 merge 和提交成功了,结果符合预期(提交消息中的更改日志不错,与开发分支无关):

          X-------------------G stable
         /                   
    a---b---c---d---e---f---g development

在我 pull 出这个压扁的稳定分支后,我在我的存储库中得到了它,这就是我想要的:

a---b---X---G

但是第二次 merge 失败了(因为 git 没办法知道我已经 merge 了多少,搞糊涂了)。

  • 是否有可能以某种方式记录 merge ,而不产生与两个父项的“merge 提交”?
  • 或者,是否可以告诉 git 仅 merge 某个“范围”的修订版,就像在 SVN 中一样?
  • 或者,是否可以进行正常 merge ,而无需在 pull 时从其他分支下载所有引用?
  • 或者我是否应该为有问题的文件提供自定义 merge 驱动程序,将“他们的”版本重命名为“我们的”,从而解决冲突?我仍然担心 --squash 总是会尝试 merge 整个历史,直到共同的父级,只解决我一半的问题。

更新: rebase

如果我正确理解 rebase ,我会得到这样的结果:

                              X stable
                             /
    a---b---c---d---e---f---g development

这会得到我不感兴趣的所有数据(c、d、e、f),作为奖励,我将丢失 b 是分支中的稳定版本的信息。

每个开发版本都会增加大约 5MB 的存储库大小(重新打包整个存储库只会缩小大约 10%),“稳定”分支几乎是免费的(数据已经存在)。我想从稳定分支中提取一个新的修订版来只提取新的 5MB,而不是从 X 更新到 G 下载 25MB,因为我不能说我不关心 c、d 的内容, e 和 f。

最佳答案

开始于

      X stable
     /                   
a---b---c---d---e---f---g development

您可以使用以下步骤将最后一次提交从开发分支复制到稳定分支:

git checkout development@{0}  # get working tree from "development", detach HEAD
git reset --soft stable  # reposition detached HEAD on "stable"
git commit  # enter the appropriate commit message
git branch temp  # create a temporary branch "temp" at HEAD
git checkout temp  # get on the new temporary branch
git branch -M stable  # rename "temp" to "stable"

所以你最终得到:

      X-------------------G stable
     /                   
a---b---c---d---e---f---g development

如果您继续致力于“开发”,例如,

      X-------------------G stable
     /                   
a---b---c---d---e---f---g---h---i---j development

您可以重复上述相同的 git 命令,您将得到:

      X-------------------G-----------J stable
     /                   
a---b---c---d---e---f---g---h---i---j development

关于Git 反复 merge squash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1464642/

有关Git 反复 merge squash的更多相关文章

  1. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  2. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  3. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  4. ruby - 让 bundler 使用 http : instead of git:? - 2

    我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://

  5. ruby-on-rails - 安装 active admin 时 activeadmin.git (at master) is not yet checked out 错误 - 2

    Activeadmingem已添加到我的rails项目中,但每次我尝试安装railsgactive_admin:install时,我都会收到类似的错误git://github.com/activeadmin/activeadmin.git(atmaster)isnotyetcheckedout.Runbundleinstallfirst.我肯定在运行“railsgactive_admin:install”之前运行了bundle。运行“bundleshow”后,我看到我已将“*activeadmin(1.0.0.pre3f916d6)”添加到我的项目中,但不断收到此错误消息。我的gem文

  6. ruby-on-rails - 旧的 Ruby 错误在我的 Ruby on Rails 应用程序中反复出现,与 Class.create 和 delayed_job 相关 - 2

    这个错误已经有好几个月了,在这里:http://www.ruby-forum.com/topic/1094002其中显示代码更改的两个链接:https://github.com/godfat/ruby/commit/f4e0e8f781b05c767ad2472a43a4ed0727a75708https://github.com/godfat/ruby/commit/c7a6cf975d88828c2ed27d253f41c480f9b66ad6我有Ruby1.9.2和rvm。我会把这些更改粘贴到适当的文件中,但我不知道如何粘贴。这在几天前就奏效了。我不能像这样执行RubyonRai

  7. ruby - git:从 bitbucket 导出并导入 github(带提交) - 2

    我在bitbucket上创建了一个私有(private)git存储库并提交了代码。现在我想导出所有(提交、代码、历史记录)并将其导入github上的gitrepo。有没有办法做到这一点?谢谢 最佳答案 在本地检查所有内容到您的计算机和gitpull。创建一个github存储库将此存储库添加为您的第二个远程(“使用gitremote添加githubURL”)推送到第二个Remote 关于ruby-git:从bitbucket导出并导入github(带提交),我们在StackOverflow

  8. Unity 报错No ‘git‘ executable was found. Please install Git on your system then restart - 2

    亲测可用。Anerroroccurredwhileresolvingpackages:Projecthasinvaliddependencies: com.unity.xxx:No'git'executablewasfound.PleaseinstallGitonyour  systemthenrestartUnityandUnityHub在我们使用PackageManager时,Unity允许我们使用Git上的package(点击加号,选择addpackagefromgitURL,或者是直接在Asset/Packages/manifest.json中添加包名)。但是这种操作需要我们事先装好g

  9. ruby - RSpec Git Bash Windows——缺少颜色? - 2

    我在Windows上使用GitBash来完成我的大部分Rails工作,每次我运行bundleexecrspecspec它都会提醒我“你必须geminstallwin32console才能使用Windows上的颜色”,然后以纯黑色和白色运行RSpec。但是我确实安装了win32console,当我在列表中运行gemlist时,它有win32console(1.3.0x86-mingw32)。RSpec工作正常,但我希望它有一些颜色。我用谷歌搜索了这个并找到了多种解决方案,但似乎没有一个适合我。有人可以写出在GitBashforWindows上使用RSpec获取颜色的“循序渐进”方法吗?

  10. ruby - git 最好的 ruby​​ api 是什么? - 2

    我想实现一个Rake任务,自动执行一些我必须完成的任务,以便将我的更改从开发转移到生产(是的,我知道有像Capistrano这样的东西,它对我来说太多了).中间是gitadd-i等一些交互命令,以及一系列commit和push。在生产方面,将有pull和Assets任务要做。一直输入相同的命令很乏味,所以我想完全自动化。我还没有找到Git的RubyAPI。它应该在Windows7下工作,并且至少允许以下命令:gitadd、gitstatus、gitcommit、gitpush,gitpull. 最佳答案 我知道,坏习惯,但我想记录一

随机推荐