首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何自动化一系列复杂的git历史重写?

如何自动化一系列复杂的git历史重写?
EN

Stack Overflow用户
提问于 2021-03-03 19:39:22
回答 2查看 61关注 0票数 0

情况

比方说,我想在合并之前总是重新设置基址,但是很晚才注意到我忘记了这样做,现在提交E和C具有相同的父级:

代码语言:javascript
复制
I (branch-1)
|\
| H (branch-2)
| |\
| | G
| |/
| F
| |\
| | E
| D |
| |\ \
| | |/
| |/|
| | C
| |/
B |
 \|
  A

我想这样“理清”这段历史:

代码语言:javascript
复制
I (branch-1)
|\
| H (branch-2)
| |\
| | G
| |/
| F
| |\
| | E
| |/
| D
| |\
| | C
| |/
B |
 \|
  A

我看到的唯一方法是相当麻烦的,并且会涉及许多连续的历史更改命令,如git rebase --onto ...git reset --hard ...,其中大多数提供的提交散列( ...)只能在过程的中途获知。

问题

有没有一种更自动化的方法来解开图表?我们能为这样的历史重写编写一个脚本,在这个脚本中,我们只使用初始状态的信息吗?

EN

回答 2

Stack Overflow用户

发布于 2021-03-03 21:42:33

由于您只需要进行一组内容更改,这就是一次提交rebase:

代码语言:javascript
复制
git rebase --onto D E

但在新的历史中,其他所有内容都将具有相同的内容,因此在轻松地重新建立基础之后,请执行以下操作:

代码语言:javascript
复制
git replace E @
git filter-branch -- --all

使用任何你想要的选项来移动现有的标签等等。FGHI将使用新的祖先和相同的内容重写,当然E也将拥有新的祖先和从D合并而来的内容。

票数 1
EN

Stack Overflow用户

发布于 2021-03-03 21:27:02

尝试git rebase-r|--rebase-merges选项:

代码语言:javascript
复制
git rebase -r -i A

sequencer将有更多的选项,并允许您描述回放或创建合并的脚本。

您可以仔细地重写该定序器脚本,

或者:

  • 在将ED合并到F后立即添加break指令,
  • 从终端手动修复E和D12,
  • 继续使用git rebase --continue.

进行rebase

如果E是一个提交序列,而不是单个提交,那么在运行该序列之前,您可能希望首先创建E' (应该是git rebase --onto D A E),因为您不能在步骤2中“在中断rebase时进行rebase”。

步骤2将变成:用git merge -C F E'替换F

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66456323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档