【问题标题】:git, reorder commits in messed up branchesgit,在混乱的分支中重新排序提交
【发布时间】:2015-12-17 13:13:54
【问题描述】:

我有一个想要完全重组的 git 存储库。

总而言之,我有三个功能,我们称它们为功能ABC,这是我过去几周一直在开发的。不幸的是,对于如何使用分支来正确地拆分我对功能的工作,我有点不加思索,而且我不知何故甚至在提交之间也从一个功能跳到另一个功能。

所以现在我有三个分支A_develB_develC_devel,并且在每个分支中都有一组属于这三个功能中的每一个的提交。功能A 的一些提交还包含B_devel 中功能B 的一些更改,B 中的一些更改C_devel 中的A 等等。一些提交甚至在 master 分支中,包含对任何功能的更改。所有的提交也已经推送到origin

完全是一片混乱……

...我现在想清理。

至少我可以从提交消息中看到,在某些情况下,我可以从代码差异中看到我在每个特定提交中所做的工作。所以我知道哪个提交属于哪个功能。我只需要知道如何将提交实际移动到相应的正确分支。

//edit:顺便说一句,我必须提到我是唯一一个在本地和原产地工作的人。所以很可能没有人会对改变历史有任何问题……以防万一。

【问题讨论】:

标签: git


【解决方案1】:

在阅读其余答案之前,请注意以下几点:

  1. git reset 或 rebase 都会重写历史记录,所以如果历史记录已经发布,则不应使用它们。在您的情况下,这应该不是问题,因为您是唯一使用该存储库的人。
  2. 从 v1.7.1 开始,cherry-pick 可以选择多个提交,因此您可以使用它来“拉出”多个提交。

所以我建议的策略如下。考虑以下结构,它在两个分支上包含与特征 A 和 B 相关的变化:

      A1--A2--B1--B2--A3 (A_Devel HEAD)
     /
o-o-X (master HEAD)
     \ 
      B3--B4--A4--B5 (B_Devel HEAD)

我们想要的是:

      A1--A2--A3--A4 (A_Devel HEAD)
     /
o-o-X (master HEAD)
     \ 
      B1--B2--B3--B4--B5 (B_Devel HEAD)

确保所有功能分支都有所有相关的提交 + 一些不需要的提交

将所有与功能 A 相关的提交从 B_Devel 复制到 A_Devel:

  1. git checkout A_Devel
  2. git cherry-pick A4

给予

      A1--A2--B1--B2--A3--A4 (A_Devel HEAD)
     /
o-o-X (master HEAD)
     \ 
      B3--B4--A4--B5 (B_Devel HEAD)

  1. git checkout B_Devel
  2. git cherry-pick B1 B2

给予

      A1--A2--B1--B2--A3--A4 (A_Devel HEAD)
     /
o-o-X (master HEAD)
     \ 
      B3--B4--A4--B5--B1--B2 (B_Devel HEAD)


现在删除不相关的提交

  1. git checkout A_Devel
  2. git rebase -i HEAD~~~~(我们要删除 B1、B2)
  3. 编辑器打开: pick B1 pick B2 pick A3 pick A4

删除前两行并保存并退出编辑器。等待变基完成。

现在我们将拥有:

      A1--A2--A3--A4 (A_Devel HEAD)
     /
o-o-X (master HEAD)
     \ 
      B3--B4--A4--B5--B1--B2 (B_Devel HEAD)

同样,对于分支 B_Devel:

  1. git checkout B_Devel
  2. git rebase -i HEAD~~~~~~(我们想更改最近 6 次提交中的内容)
  3. 编辑器打开: pick B3 pick B4 pick A4 pick B5 pick B1 pick B2

删除带有 A1 的行并重新排列剩余的“B”更改,使它们看起来像:

 pick B1
 pick B2
 pick B3
 pick B4
 pick B5

保存,退出,等待 rebase 完成,这最终会给我们:

      A1--A2--A3--A4 (A_Devel HEAD)
     /
o-o-X (master HEAD)
     \ 
      B1--B2--B3--B4--B5 (B_Devel HEAD)

【讨论】:

  • 是的,现在一直在这样做。工作得很好。谢谢!
【解决方案2】:

这绝对不是一个好的解决方案,但如果您浏览整个日志,理论上您可以使用git cherry-pick <commithash> 的组合将一个提交从一个分支提交到另一个分支,并将git rebase -i(交互式变基)用于重新排序分支中的提交。

Read more on this here.

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 2012-12-03
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多