【问题标题】:Git interactive rebase: how to move other branches (refs) automatically?Git交互式rebase:如何自动移动其他分支(refs)?
【发布时间】:2022-08-21 02:41:09
【问题描述】:

有时我想做一个 rebase 并确保其他 refs 更新到新结构而无需手动重置或多次 rebase。

有没有办法一次性完成,以便 git rebase 将 refs 更新为新的提交,这些提交在 rebase 之前被挑选并具有引用?

一个例子:

Rebase 前的情况:

* abc3... commit3 (branch:a, HEAD) 
* abc2... commit2 
* abc1... commit1 (branch:b)
* abc0... base commmit (branch:master)

然后做一个 Rebase master -i: pick abc3, abc1, abc2

结果将如下所示:(branch:b 留在它自己的提交分支中)

* abc6... commit2 (branch:a, HEAD) 
* abc5... commit1   
* abc4... commit3
|
| * abc1... commit1 (branch:b)
|/
* abc0... base commmit (branch:master)

我希望结果看起来像什么:(分支:b 已更新为新提交)

* abc6... commit2 (branch:a, HEAD) 
* abc5... commit1 (branch:b)
* abc4... commit3
* abc0... base commmit (branch:master)
  • 不,没有。以前一直想要这样的东西,写了一些很乱的脚本来处理一些特殊情况关心,但一般很难正确地做。

标签: git rebase


【解决方案1】:

git rebase 会将 refs 更新为选择并具有引用的新提交变基?

以前,没有。

但是当你变基的时候?也许。

使用 Git 2.38(2022 年第三季度),“git rebase -i(man)学习使用--update-refs 选项更新提示出现在重新定位范围内的分支。 来源:pull.1247.v5.git.1658255624.gitgitgadget@gmail.com

commit 7fefa1b(2022 年 7 月 12 日)Junio C Hamano (gitster)
commit 4611884,commit aa37f3e,commit 3113fed,commit b3b1a21,commit 89fc0b5,commit 900b50c,commit a97d791,commit d7ce9a2,commit f57fd48,@9876543334@,@9876543334@,commit 18ea595,@987654335 2022 年 7 月)Derrick Stolee (derrickstolee)
(由Junio C Hamano -- gitster --commit 3d8e3dc 中合并,2022 年 8 月 1 日)

rebase:添加 --update-refs 选项

签字人:Derrick Stolee

在处理大型功能时,将功能分解为多个较小的部分会很有帮助,这些部分会按顺序进行审查。
在开发或审查期间,对某个功能部分的更改可能会影响多个这些部分。
交互式变基可以帮助调整分支的多部分“故事”。

但是,如果有分支跟踪功能的不同部分,那么重新调整整个提交列表可能会创建无法从这些“子分支”访问的提交。
它可以采取手动步骤来更新这些分支。

将新的--update-refs 选项添加到“git rebase -i(man)每当正在重新设置的提交被修饰时,它都会向 todo 文件添加“update-ref”步骤。
最后,rebase 过程将所有列出的 refs 更新为 rebase 操作期间存储的值。

确保在放置任何压缩或修复后进行迭代。
只有在这些压缩和修复完成后才更新分支。
这允许在功能尖端的--fixup 提交正确地应用于子分支,即使它正在修复该部分中的最新提交。

此更改更新了文档和内置以接受 --update-refs 选项以及使用“update-ref”命令更新 todo 文件。
添加了测试以确保将这些 todo 命令添加到正确的位置。

这种变化确实不是包括跟踪更新的 ref 和在 rebase 过程结束时写入新的 ref 值的实际行为。
这将推迟到以后的更改。

git rebase 现在包含在其man page 中:

--update-refs

--no-update-refs

自动强制更新任何指向提交的分支 正在重新定位。
在工作树中签出的任何分支 不会以这种方式更新。

和:

rebase:从“update-ref”命令更新参考

签字人:Derrick Stolee

之前的更改引入了“git rebase --update-refs(man)选项将“update-ref <ref>”命令添加到交互式变基的todo 列表中。

教 Git 在到达这些 'update-ref' 命令时记录 HEAD 位置。
ref/before/after 三元组存储在$GIT_DIR/rebase-merge/update-refs 文件中。
先前的更改解析了此文件,以避免在 rebase 进行时让其他进程更新该文件中的 refs。

当序列器到达这些“update-ref”命令时,我们不仅更新文件,然后我们在变基序列结束时更新引用本身。
如果 rebase 在最后一步之前中止,则不会更新 refs。
'before' 值用于确保我们不会意外删除同时更新的 ref(例如,由旧版本的 Git 或第三方工具)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2012-07-03
    • 2019-11-17
    • 2020-08-23
    相关资源
    最近更新 更多