git:如何将分支的根移回两次提交

2023-11-21

假设我有:

A - B - C - D - E - F  master
            \ 
             \- G - H  new feature branch

现在我意识到实际上提交了 B 和 C 属于新功能,所以我想将它们移动到“新功能分支”。换句话说,我希望“新功能分支”从 A 开始,并包含提交 B 和 C:

A - D - E - F  master
 \ 
  \- B - C - G - H  new feature branch

我该怎么做呢?从我读到的来看,似乎rebase是我正在寻找的功能,但我想在弄乱我的存储库之前确定一下。

(我搜索并发现了很多非常相似的问题和示例,但没有一个是exactly就像我描述的场景一样,所以我要求确定一下(毕竟,回购是一件很容易毁掉的宝贵东西))。


埃德蒙多的回答是正确的(并且已投票),但值得指出一些额外的项目。

首先,你的问题涉及“移动分支的根”——但这是 Git;分支机构没有have根源,无论如何都不是你思考的方式。让我们看看你的图表绘制:

A - B - C - D - E - F  master
            \ 
             \- G - H  new feature branch

我想你和我刚开始使用 Git 时一样,也会想到提交A-B-C-D-E-F作为在master分支并提交G-H作为在功能分支上。但这不是 Git 的工作原理。让我们重新绘制它,而不更改任何提交链接:

           E--F   <-- master
          /
A--B--C--D
          \
           G--H   <-- feature

这应该更清楚地表明,就 Git 而言,提交A-B-C-D are on both分支机构。只有一个根。这就是承诺A:它是根,因为它没有父提交,从提交到父的链中没有向后链接。

Second, no matter how you go about this, you wind up having to copy some commits. The reason is that each commit's parent ID is part of that commit's identity. The "true name" of any commit is its hash ID, and the hash ID is built by reading the complete contents of the commit: source tree, commit message, author name and date, etc., but always including the parent ID too.1 You want your final graph to resemble:

  D--E--F   <-- master
 /
A
 \ 
  B--C--G--H   <-- feature

但现有的D链接(或点)回现有的C,不A,以及现有的G指向现有的D.

这就是cherry-pick 起作用的原因:git cherry-pick本质上copies一次提交。新副本与原始副本“做同样的事情”,但具有某物不同,即使它像“我的父母是......”一样简单。 (通常它还有一个不同的附件tree对象也是如此,只是change与新的父级相比,它所做的更改与将原始父级与原始父级进行比较时原始级所做的更改相同)。这意味着什么你实际上无法得到你想要的东西,而只是得到你需要的东西:

  D'-E'-F'  <-- master
 /
A
 \ 
  B--C--G'-H'  <-- feature

其中小勾号表示结果是copy原来的。

原件会怎样?答案是:它们仍然存在于存储库中,以备您需要时使用。完整的图片更像是这样的:

    D'-E'-F'   <-- master
   /
  /        E--F   [abandoned]
 /        /
A--B--C--D
       \  \
        \  G--H   [abandoned]
         \
          G'-H'   <-- feature

While git cherry-pick有效,什么git rebase-尤其git rebase -i— 的作用是以一种奇特的自动化方式完成这些副本,最后一步是移动分支名称,放弃原始提交。所以git rebase -i有时是一个easier解决这个问题的方法。

如果你跑git rebase -i你看到所有这些pick命令,以及那些字面上运行的命令git cherry-pick:它确实在做一系列的挑选。如果您自己执行这些操作,可能会更清楚发生了什么,并且您可以更好地控制何时移动分支标签。


1For merge commits, this is parents, plural. All parents participate in the hash.

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

git:如何将分支的根移回两次提交 的相关文章

  • 如何在 Visual Studio 2013 中隐藏未提交的更改

    需要一些帮助 了解如何使用 Visual Studio 2013 搁置 Git 存储库中未提交的更改 我来自 PHPStorm 您可以在一个分支上搁置未提交的更改 切换到另一个分支并取消搁置 但是 我无法找到 了解如何在 Visual St
  • Git:在本地合并远程分支

    我已经通过以下方式拉取了所有远程分支git fetch all 我可以看到我想要合并的分支git branch a作为远程 原点 分支名称 问题是它无法访问 我无法合并或结帐 您可以参考那些远程跟踪分支 列出git branch r 及其遥
  • `git add --patch` 和 `--word-diff`

    git add patch提供了一个很好的界面 用于检查未暂存的更改 然后仅暂存下一次提交中需要的更改 很好 除了一件事 没有明显的方法来选择哪个diff视图来使用 特别是 我希望能够配置git add patch以同样的方式向我呈现差异g
  • 为什么 git mergetool 说“没有文件需要合并”?

    我正在尝试将 BeyondCompare4 配置为 git 中的 difftool 和 mergetool 我使用的是 git 版本 2 5 0 windows 1 到目前为止 BeyondCompare4 作为 difftool 工作得很
  • 您对版本控制进行到什么程度了? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • 我可以从命令行向 github 添加问题吗?

    我是 git 新手 我希望能够通过 github 绘制我的项目的计划和进度 问题是 这需要在 github com 上使用浏览器进行大量点击 并且我希望能够通过使用命令行程序来自动执行该任务 github 有命令行界面吗 有一个ghi ge
  • 无法将 android“gen”文件夹提交到 Git

    我在 eclipse 中使用 EGit 为我正在开发的 Android 项目提供 Git 支持 问题是 将我的项目提交到本地存储库后 我意识到 gen 文件夹没有被提交 因此 当我从 Git 存储库获取最新源代码后尝试在另一台计算机上打开该
  • 尽管有 svn 复制,如何 git svn 克隆完整历史记录

    在我的公司 我们即将从 svn 切换到 git 我们使用的 SVN 非常大 没有 svn 布局 并且在每个版本拆分上我们都制作了一个 svn 副本 SVN存储库结构 svnserver company de product xy 主要版本号
  • 在 git 提交消息中使用任何 utf-8 字符是否安全?

    我发现使用 UTF8 字符 例如 很有用 请参阅here http www utf8icons com subsets dingbats 在提交消息中 重构 NewService 添加了更好的服务 OldServiceA 据我所见 它see
  • Git refs/remotes/origin/master 没有指向有效的对象

    在上次合并到 Git 存储库的 master 分支后 我失去了克隆存储库的能力 Cloning into test repository remote Counting objects 126084 done remote Compress
  • 使用 TortoiseGit 创建 git 克隆时出现 SSL 证书问题

    我想在 TortoiseGit 的帮助下克隆 git 存储库 但出现错误 错误 SSL 证书有问题 请验证 CA 证书是否正常 细节 错误 14090086 SSL 例程 SSL3 GET SERVER CERTIFICATE 访问时证书验
  • 如何使用“gem install”命令从私有 GitHub 存储库安装 gem

    如何在本地安装托管在 GitHub 上的私人存储库中的 gem 特别是 我们通过gem install命令而不是在 Bundler 中使用 因为它是一个命令行工具 我尝试这样做 gem install githubname repo s h
  • Git 中的“分支提示”是什么?

    我正在学习 Git 并阅读专业 Git 书籍 https git scm com book en v2 书中和 Stack Overflow 上有时会使用术语 分支提示 但我找不到它的含义 分支提示是分支上的最后一次提交或最近一次提交 基本
  • 如何在本地快速拉取拉取请求

    在合并拉取请求之前 我想在本地快速拉取请求并运行测试并测试一些内容 我还不想点击 gihub 合并拉取请求 我以为滑轮会有帮助http ejohn org blog pulley http ejohn org blog pulley 但我收
  • 如何使用 sourceTree 进行推送?

    我正在使用 sourceTree 管理 Unity 项目 版本 4 6 3 我只是想返回到上一次提交 右键选择 将当前分支重置到此提交 在使用模式中选择 硬 然后放回上一次提交 之后 我尝试去推 但没有成功 抱歉 当时我忘记了错误 之后 我
  • 返回到存储库中的特定修订后提交并推送更改?

    我们需要及时返回到某个特定的提交 一些意外的改变是为了掌握 尝试恢复它挖得太深 所以 master 的状态很糟糕 现在我们希望master回到66ada4cc61d62afc 根据git 恢复到某个提交 https stackoverflo
  • git Branch -d :致命 - 无法查找 HEAD 的提交对象

    假设我在一个裸存储库 远程 中 如果我尝试使用以下命令删除分支git branch d
  • 如何解决 VS Code 中变基拉取的合并冲突?

    当我做一个git pull rebase 并且我的提交中存在合并冲突 我得到冲突差异视图 解决所有冲突并暂存文件 然后呢 我可以打开终端并运行git rebase continue但是 VS Code 中不应该有一个按钮来完成变基吗 只需使
  • 自动生成/删除詹金斯工作

    我正在寻找一种自动创建一组詹金斯作业的方法 通常在创建新的 git 分支之后 我已经为maven尝试过这个插件 http evgeny goldin com wiki Maven jenkins plugin http evgeny gol

随机推荐

  • 限制可执行文件在特定计算机上运行的最简单方法

    我正在尝试创建一个只能在一台机器上运行的可执行文件 实现这一目标的最简单方法是什么 许可证文件 或者是否有一个类似于网络连接 MAC 的机器地址 我可以将其硬编码到可执行文件中 如果它只在一台机器上运行 那么 只需保护该机器并仅将可执行文件
  • jQuery 幻灯片图像转换

    我的 jQuery 幻灯片有问题 我似乎无法弄清楚 在图像转换期间 幻灯片将闪烁白色 而不是很好地淡入下一张图片 我相信这与以下代码行有关 slideshow img first fadeOut 1000 next fadeIn 1000
  • iOS 11 主屏幕 Web 应用程序中的 Cookie 过期

    iOS 11 自 iOS 11 0 1 起仍然存在问题 主屏幕 Web 应用程序和 Cookie 似乎存在问题 当从服务器设置 cookie 时 iOS 11 似乎会间歇性地删除 cookie 其他时候 当服务器使 cookie 过期时 i
  • 如何判断按下的是哪个 SHIFT 键?

    在我的游戏中 我希望能够使用左右 Shift 键来实现不同的功能 在Java 或其他语言 中 有什么方法可以区分这两者吗 The KeyEvent class has only VK SHIFT which corresponds to b
  • Python 相当于 R 的 poly() 函数?

    我试图了解如何使用 scikit learn 或其他模块 在 R 中复制 poly 函数 例如 假设我在 R 中有一个向量 a lt c 1 10 我想生成三阶多项式 polynomial lt poly a 3 我得到以下信息 1 2 3
  • 在 C# 中将对象数组转换为 XML

    我知道没有内置转换器可以将对象数组转换为 XML 是否有一种快速基本的方法可以从数组中创建 XML 以帮助我在这个 XML 和我拥有的另一个 XML 之间进行 LINQ to XML 联接 您可以使用 Linq to XML 将现有数据结构
  • array.find 不适用于 Babel

    我正在使用 Babel 转译我的 ES2015 代码 然而它并没有翻译find对于数组 以下行引发错误TypeError options find is not a function let options 2 23 4 options f
  • 通过 PHP 加载图像

    我正在尝试通过 PHP 加载图像 但我不知道如何 文件名存储在数据库中 例如image jpg if GET image Client requesting image so retrieve it from DB id mysql rea
  • 如何让 gcc 跳过错误,但仍然输出它们。

    是否可以强制 gcc 报告错误 但继续编译它们 本质上 我试图在 c 文件中生成错误列表 但 gcc 总是在出现第一个错误时终止 我已经在谷歌上搜索了一段时间 据我所知 这并不是一个明显需要解决的问题 当 GCC 无法继续前进时 它就会终止
  • NodeJS keydown/keyup 事件

    我有兴趣看看是否可以将功能绑定到用户按下 释放键盘上的按键 到目前为止 我已经能够通过以下方式获取按键事件keypress模块和process stdin的原始模式 var keypress require keypress keypres
  • 错误:应用程序:transformClassesWithDexBuilderForDebug

    我在这个包中有一个 HillfortStore 类 package org wit hillforts models 弄乱了类中的包名称 缺少 s package org wit hillforts model 将类导入到具有错误包名的其他
  • 为什么一些有经验的程序员在变量之前写与值的比较? [复制]

    这个问题在这里已经有答案了 可能的重复 如何检查是否相等 0 i 或 i 0 为什么在 C 中经常看到 null variable 而不是 variable null 我一直在查看一些奇怪的教程以及一些 DirectX 代码 并注意到许多经
  • 如何读取特定文件夹内的所有文件

    我想读取 c net 中特定文件夹内的所有 xml 文件 XDocument doc2 XDocument Load PG SMNR XMLDataSourceUtil GetXMLFilePath Locale Products cate
  • 从 CLOB(包含 XML)中提取特定值,同时为表的每一行创建一个分隔字符串。某些行上的 CLOB 值可能为空

    一些背景 数据库是Oracle 我正在尝试为表的每一行创建一个分隔字符串 分隔字符串的某些值必须来自 CLOB 包含 XML 某些行上的 CLOB 可能为空 这就是问题所在 例如 我有一个表 Item 其中包含以下行 Item ID Ite
  • 重新安装 Microsoft Visual Studio Asp.net MVC 5 脚手架扩展

    我在 Asp Net MVC 5 和 Visual studio 2013 中遇到脚手架问题 我尝试通过首先卸载扩展 Microsoft Visual Studio Asp net MVC 5 Scaffolding 来重新安装它 但我找不
  • AngularJS 和 Windows 8 路由错误

    我正在尝试使用 Visual Studio 2012 在 Windows 8 1 上使用 AngularJS 创建 HTML5 JS CSS3 应用程序 我目前坚持将参数发送到其他视图 当谷歌搜索时 我看到几个使用的例子 a href li
  • Matplotlib 子图 y 轴刻度与上面的图重叠

    我正在尝试绘制 3 个子图 它们之间没有任何空白 默认 y 轴刻度标签使用显示在 y 轴右上角的刻度 下例中的 1e 8 除了与上面的图重叠的下面两个图之外 这很好 有人知道怎么修这个东西吗 下面是一个小例子 import numpy as
  • Nodejs 7 的异步等待

    我已经安装了nodejs 7 3 0 并且有以下代码 let getContent function url return new pending promise return new Promise resolve reject gt s
  • 允许在录制视频时播放音乐,如 Snapchat ios

    首先我想讨论一下发生在snapchat 在 Snapchat 中 当您开始录制视频且歌曲在后台运行时 它允许在录制视频时继续播放该歌曲 录制视频后您还可以在背景中听到该歌曲 我在用SCR记录器用于使用我的自定义布局录制视频和捕获图像 现在我
  • git:如何将分支的根移回两次提交

    假设我有 A B C D E F master G H new feature branch 现在我意识到实际上提交了 B 和 C 属于新功能 所以我想将它们移动到 新功能分支 换句话说 我希望 新功能分支 从 A 开始 并包含提交 B 和