如何将孤立分支“按原样”附加到 master?

2024-04-22

搬迁使用过程中git我们采用了解决方案的生产版本并将其作为master.

然后我们拿了一个开发版本并做了一个孤儿分支 called develop.


(背景:为什么我们在这里有点纠结是因为从开发版本到生产版本并没有干净的演变。此外,组装所涉及的解决方案很复杂,这使我们希望避免废弃存储库和再试一次。最后,我们只想将这些版本放入git并开始清理工作git.)


所以 - 现在我们认为最好将开发版本从master而不是将其保留为孤儿分支。

我们怎样才能基本上采取master提交并使其成为父级develop commit 但没有发生任何合并?无需更改该文件的内容develop commit?

那就是——只是嫁接develop不知何故,as-is, 如果那有意义的话?


听起来您想修改您的提交图不修改任何trees附加到这些提交。

如果您了解 git 内部的工作原理,这个说法就会更有意义。这里的关键项目是:

  1. 所有提交都是永久且不变的,因为提交(或者实际上 git 的四个内部对象中的任何一个)的“真实名称”是其内容的 SHA-1 加密校验和。这意味着,如果您尝试更改任何内容(或者发生故障的磁盘驱动器更改某些内容),git 会抱怨校验和错误,因为您在每个对象中看到的内容不再与其“真实名称”匹配。

  2. 每个提交都带有“树”对象的 SHA-1 ID,该对象充当该提交附带的源的完整快照。 (该树给出了每个文件或目录的文件名和 SHA-1“真实名称”。子目录由另一棵树表示。这里的细节并不重要。)

  3. 每个提交还列出其父级的“真实姓名”SHA-1 ID。因此,鉴于提示提交develop,git 可以读取该提交并找到其直接父级。读取该父项(或那些父项)后,git 会找到下一个 ID,并为其父项读取,依此类推。该过程在读取“根”提交(没有父提交)时停止。做一个--orphan签出后进行提交会产生新的根提交,这无疑是您创建分支的方式。

这些父 ID 和树 ID 存储在任何给定的提交中,据说“指向” git 存储库中的其他对象。 (存储库中只有四种类型的对象。我们已经提到了“提交”和“树”,另外两个是“blob”(git 保存文件的方式)和“标签”。树指向 blob 和 sub -树和“标签”对象用于带注释的标签。)


因此,您要做的就是更改您的根提交develop分支,以便它现在有一个父提交,特别是可以从当前提示到达的一些提交master分支。 (也许您想要小费本身,也许您想要类似的东西master~100:这个细节仅在您进行更改时才重要。)

坏消息是,由于第 1 项,您无法完全做到这一点。

好消息是你can可以使用三种替代方法中的任何一种来完成此操作(如果需要和需要,然后使移植物永久化)。

首先,git有一个东西叫做“移植”。它们的工作效果不太好,所以 git 有一个更好的新东西,称为“替换”。根据您的 git 年份,您应该至少拥有一个,并且几乎肯定两者都有。

它们都使用相同的总体思想。当 git 进行图形遍历时,从提交到父级,您希望在某个时刻能够让 git 更改其遍历。使用 gitrafts,你只需指定当对象具有 id 时<X>它应该遍历到父级<Y>。这可以让你找到当前的根提交develop并将其直接移植到某些提交上master.

这些移植物不会被复制git clone,并引入其他问题,所以现在 git 有git replace https://www.kernel.org/pub/software/scm/git/docs/git-replace.html。这会在存储库中创建一个实际对象,并允许您检查有替换和没有替换的提交图。要在这种情况下使用它,您需要为您的根提交进行替换提交,这与现有的根提交完全相同,只是它具有您所需的父提交。


如果您想完全重写历史记录,使所有用户在经历了一个痛苦的重写步骤后都可以轻松完成,您可以设置一个移植,然后使用git filter-branch复制并替换移植物。或者,也许稍微容易一些,指定一个父过滤器(并且没有其他过滤器)。看the git filter-branch文档 https://www.kernel.org/pub/software/scm/git/docs/git-filter-branch.html了解详情;它有一个这样的例子。 (文档表明创建移植物更简单,我认为使用--parent-filter更简单;但无论哪种方式,都有一个方便的例子。)

注意过滤器分支copies每个“过滤”提交,通过(虚拟)检查该提交,应用一些更改,然后应用过滤器,然后根据结果创建新的提交。在本例中,第一个更改是将父 ID 添加到根提交。第二个更改是一个过滤器分支自动执行:进行提交follows不再孤立的根副本指向根副本。第三个改动与第二个相同,以此类推:

      A--B--C     <-- develop (before filtering)

...--o--o--...    <-- master
      \
       A'-B'-C'   <-- develop (after filtering)

在这里,提交A'与提交完全相同A除非它有一个家长 ID;B'完全就像B除了它的父级是A'代替A;等等。

(顺便说一下,请注意,父箭头在这里全部指向左侧,但是filter-branch从左到右工作。它通过首先枚举要过滤的所有提交,以从右到左的方式获取它们的 ID,然后从左到右进行过滤来实现这一点。)

现有的 SO 问答有更多关于使用移植或替换的内容。 https://stackoverflow.com/q/6800692/1256452

上面我确实提到了第三种方法。此功能仅在以下情况下有效develop没有现有的合并提交。然后你可以简单地对每个提交进行变基develop到你的目标提交,如西里德在评论中建议 https://stackoverflow.com/questions/32954312/how-can-i-attach-an-orphan-branch-to-master-as-is#comment53733496_32954312。您需要运行该 rebase 命令--root从独立的根目录复制每个提交develop branch.

这有效是因为git rebase简单地复制提交,方式大致相同git filter-branch做。从某种意义上说,这是更多的工作,因为way变基副本提交是通过应用差异(使用重复git cherry-picks,或多或少)而不是简单地保留每个复制的提交的现有“树”对象,但它比git filter-branch。这里的缺点是 rebase 根本不处理合并提交(好吧,除非你使用--preserve-merges,它使用交互式变基代码)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将孤立分支“按原样”附加到 master? 的相关文章

  • Git:结帐而不运行结帐后挂钩

    我有一个我喜欢的结帐后挂钩 大多数时候 但有时我知道运行它会浪费时间 或者 因为它会删除并重建我的开发数据库 所以我不希望它去做它的事情 有没有跳过钩子的 git 选项 公平地说 我已经开始寻找一个了 我认为没有命令行选项可以完成您想要的操
  • 在两个单独的分支或存储库中管理项目后端和前端?

    我启动了一个移动应用程序项目 该项目将具有服务器端和应用程序本身 所以 在master分支我创建了2个项目myapp server and myapp然后我创建了另外 2 个分支backend and frontend我只想将与它们相对应的
  • Git 命令显示我对给定远程的权限

    同事可以从远程存储库获取数据 但不能推送到远程存储库 我怀疑他对遥控器只有读权限而没有写权限 我可以通过多种方法来检查这一点 但我想不出他可以在 git 中使用的方法 是否有 git 命令可以显示给定远程存储库的权限 No Git 本身不处
  • 具有单独 work_tree 的 Git 子模块

    我按照本页上的教程使通过 Git 部署我的网站变得简单 http toroid org ams git website howto http toroid org ams git website howto 到目前为止一切都很好 但是我最近
  • 为什么cherry-pick总是会导致合并冲突?

    我正在从发布分支中挑选特定的提交到我的本地工作副本中 每次我从发布分支中挑选一个提交时 我都会遇到必须解决的合并冲突 即使更改看起来微不足道 例如 const char kApplicationVersion Develop const c
  • 节点项目的 Azure git 部署失败

    我正在尝试将我的项目部署到azure 它正在失败 这些是我采取的步骤 git init git config core longpaths true git add git commit m initial commit 所有这些都有效 我
  • git 预提交钩子格式代码 - Intellij/Android Studio

    本要点展示了如何在预提交时使用 Eclipse 格式化程序自动格式化 Java 代码 Source https gist github com ktoso 708972 https gist github com ktoso 708972
  • Git 不断提示我输入密码

    我已经使用 Git 一段时间了 但是不断要求输入密码开始让我感到厌烦 我使用的是 Mac OS X 和 GitHub 并且按照 GitHub 的说明设置了 Git 和我的 SSH 密钥设置 Git 页面 http help github c
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • 推送时发生 Git 错误 - update_ref 失败

    当我尝试推送本地提交时遇到问题 这可能是在 Android Studio 崩溃时发生的 这是错误 update ref 引用 refs remotes origin master 失败 无法锁定 ref refs remotes origi
  • 如何从 android.googlesource.com 或 github.com 下载单个目录?

    我想下载 https android googlesource com platform frameworks base git master tools aapt https android googlesource com platfo
  • git diff - 只显示哪些目录发生了变化

    有没有办法只列出已更改的目录 如果我在 git root 的话 project 我更改的文件是 project subtool file1 project subtool file2 project subtool3 file1 我只是想
  • git push heroku master 权限被拒绝

    我正在关注 ruby railstutorial 我运行命令 git push heroku master 它吐出了这个错误 Permission denied publickey fatal Could not read from rem
  • 如何将更改移出主分支

    基本问题 但这一直发生在我身上 进行更改working branch 切换到master git merge working branch git push cap deploy 到舞台 泡一杯新茶 然后我回来思考其他事情并开始做出一些改变
  • 如何 git grep 仅一组文件扩展名

    如何执行 git grep 并将检查的文件限制为一组文件 我希望能够 grep cpp 和 h 文件的内容来查找 MyFunc 例如 git grep MyFunc hc 但是 这也匹配 c 文件和 cs 文件 Use git grep M
  • 如何正确使用“mvn release:prepare”?

    我尝试了这个命令 用dryrun在我的 Maven 项目上进行测试 mvn release clean release prepare DdryRun true DgenerateBackupPoms false Dtag solocal
  • git reset 命令中的 ~1 是什么意思?

    git 重置 HEAD 1 我的印象是 1 的意思是 从 HEAD 开始 遵循 1 链接 并将 HEAD 标签设置为新的提交节点 我正期待着 git 重置 HEAD 2 跟随 2 个链接 然后设置 HEAD 标签 但是 如果我尝试它 我会收
  • 我可以直接从我的谷歌云端硬盘在线推送/拉取吗?

    有一些方法可以通过谷歌驱动器同步 Windows 应用程序将我的本地 git 存储库同步到我的谷歌驱动器 但我想知道我是否可以完全绕过它的需要 Fro eg git remote add origin https drive google
  • Netbeans 和 Git,.obj 文件被忽略

    我正在开发一个涉及 obj 文件的小型 git 项目 当我查看 项目选项卡 时 我发现它们被忽略了 但如果我查看我的 gitignore 我无法理解为什么 DepthPeeling nbproject private DepthPeelin
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My

随机推荐

  • 从非 UI 线程更新 Windows 窗体上的标签?

    我已经尝试了 2 天来做到这一点 我查看了大量的 stackoverflow 答案并尝试了所有答案 但仍然遇到同样的问题 我在 Windows 窗体上有一个标签 此 Windows 窗体上的唯一代码是 var thread1 new Thr
  • PowerShell参数值建议

    我用 C 编写了一个 Cmdlet 是否可以为特定字符串参数提供所有可能的值 此示例为 PackageId public sealed class InstallPackageCommand PSCmdlet Parameter Posit
  • c++17 有效地将参数包参数与 std::array 元素相乘

    我想有效地将 参数包中的参数与 std array 的元素相乘 int index auto Is std array
  • 散景布局的背景颜色

    我正在玩散景滑块演示 https demo bokehplots com apps sliders 源代码here https github com bokeh bokeh blob master examples app sliders
  • 在WPF中设置鼠标位置[重复]

    这个问题在这里已经有答案了 我打算用 Kinect 手势替换我的鼠标 但我找不到为 WPF 应用程序设置鼠标位置的方法 无法使用 NET BCL 但是 如果您确实想要它 您可以使用本机SetCursorPos in User32 dll D
  • 使用 JPA 和 Hibernate 将 Java 布尔值映射到 Oracle Number 列

    我在我的模型中创建了这样的属性 public class Client private Boolean active 我的 RDBMS 是 Oracle active列的类型NUMBER 1 0 如何使用Restrictions API实现
  • MySQL:具有授予选项的用户无法授予创建用户

    我创建了一个具有 root 的用户 new user 如下所示 GRANT ALL ON labor TO new user WITH GRANT OPTION GRANT ALL ON labor TO new user localhos
  • 姜戈 - 403 禁止。 CSRF 令牌缺失或不正确

    我尝试为我的模型添加 ModelForm 但每次 POST 尝试都以 403 Forbidden CSRF 验证失败 请求中止 失败原因给出 CSRF 令牌丢失或不正确 结束 我没有 render to response 方法 因此无法通过
  • 如何禁用/覆盖 PowerShell 点表示法

    PowerShell 中的命令几乎与 Bash 类似 但点符号扩展给我带来了很多工作 目前我必须将很多命令参数用引号引起来 mvnw cmd Dmaven repo local m2 repository deploy deploy fil
  • winkler的Python性能改进请求

    我是一个 python n00b 我想要一些关于如何改进算法的建议 以提高计算两个名字的 Jaro Winkler 距离的方法的性能 def winklerCompareP str1 str2 Return approximate stri
  • 为什么 ng-mouseover 不能与 ng-if 一起使用

    我试图在具有 ng if 的图像上使用 ng mouseover 指令 但它不起作用 但如果我使用 ng show 指令它起作用 每个人都可以告诉我为什么吗 或者这是 AngularJS 的问题 在 AngularJS 文档中 我无法阅读任
  • WooCommerce 挂钩 woocommerce_cancelled_order

    再会 这是我第一次使用 stackoverflow 很高兴认识大家 不管怎样 我正在为 WooCommerce 编写一个插件 当订单取消时我会自动退款 当我在没有钩子的情况下在单独的文件中手动执行它时 我的代码工作正常 但是 使用我的钩子它
  • Azure 移动服务和 Azure Web 应用身份验证

    当用户通过 Azure Web 应用程序 ASP NET MVC 和 Xamarin iOS 应用程序登录时 我为同一用户获得两个不同的 SID Setup 带有 API 控制器的 Azure WebApp ASP NET 5 带有 Mic
  • 如何使用 proguard 混淆 android 库(.aar)?

    我想混淆 aar使用 proguard 进行分发的库 我在互联网上尝试了很多解决方案 但到目前为止没有任何效果 只有一些代码被混淆了 有人可以帮我解决这个问题吗 在 build gradle 中 在 defaultConfig 下添加 Co
  • 将数据从 ASP.NET MVC 控制器推送到视图

    我正在构建一个网站的后端 该网站的前端将有多个需要实时更新的 小部件 现在我只是有一个加载方法 它用数据填充所有小部件 显然是在页面加载时 我的问题是如何处理进一步更新的实时方面 我想过只进行多个 ajax 调用 它可以每秒左右查询一个服务
  • 运行 Code First 迁移种子方法而不进行迁移

    如何运行代码优先实体框架迁移而不更改数据模型中的任何内容 这会导致创建迁移 我只想再次运行种子方法 因为我向其中添加了一些内容 如果你只需要运行Seed 再次 没有任何改变会导致添加新的迁移 只需调用Update Database再次没有标
  • Linq - 按日期分组并选择计数

    我目前正在解决一个问题 我想运行一个查询 该查询按所选日期对结果进行分组 对于这个例子 想象一个像这样的简单模型 public class User public DateTime LastLogIn get set public stri
  • 搜索事件的 Jquery 选择器

    我需要选择所有已绑定 单击 事件的元素 是否存在这样的选择器 jQuery 本身不支持它 但您可以使用编写自己的自定义选择器有事件插件 http plugins jquery com project hasevent jQuery expr
  • 当 Java 中的集合超出容量时会发生什么?

    我有一个服务 它将所有对其进行的调用暂存在内存中 因为我们不想丢失数据 同时我们需要该服务因任何外部依赖项 例如数据库 而失败 然后 这些分阶段的调用会在后台例行接收和处理 如果出于任何原因 如果调用太多并且内存不足 我们就需要警惕 所以
  • 如何将孤立分支“按原样”附加到 master?

    搬迁使用过程中git我们采用了解决方案的生产版本并将其作为master 然后我们拿了一个开发版本并做了一个孤儿分支 called develop 背景 为什么我们在这里有点纠结是因为从开发版本到生产版本并没有干净的演变 此外 组装所涉及的解