git:如何重新排序(严重)提交序列

时间:2011-08-05 23:13:19

标签: git git-rebase

我正在从zip快照构建一个回顾性项目历史。我已经从快照中构建了一个长分支提交序列。我现在在最后添加了一些“发现”快照,这些快照应该位于提交序列中间的不同位置。

我正在尝试使用git rebase -i <startCommit>重新排序git快照。我只需交换选择列表顺序。这应该只是重写提交对象的情况,但保持底层树相同(因为快照没有改变)。

在这种情况下,看起来像rebase仍在尝试创建补丁并且有很多冲突,而不是简单的重新安排。对于这种特殊情况,是否有更合适的命令?我没有合并,只有一个分支。整个回购仍然非常本地和私人。

3 个答案:

答案 0 :(得分:3)

不要为rebase而烦恼。建立一个新的分支。如果X是提交使用的sha1或treeish,那么:

git checkout X -- .
git add -A
git commit -C X

按照您想要的时间顺序重复所有提交。

我们颠倒过去5次提交顺序的示例:

git checkout -b temp old_branch~5
git checkout old_branch -- .
git add -A
git commit -C old_branch
git checkout old_branch~1 -- .
git add -A
git commit -C old_branch~1
git checkout old_branch~2 -- .
git add -A
git commit -C old_branch~2
git checkout old_branch~3 -- .
git add -A
git commit -C old_branch~3
git checkout old_branch~4 -- .
git add -A
git commit -C old_branch~4

git push . HEAD:old_branch -f
git checkout old_branch
git branch -d temp

git log -5 # to see the new history

希望这会有所帮助。

答案 1 :(得分:0)

我无法帮助改变rebase,但我可以解释为什么它不是“简单的重新安排”。例如,取一个文件,每个修订版附加一行文本。在第一次提交时,它看起来像:

Commit 1

在第二次提交时,由于您最初将它们排除在外,它看起来像:

Commit 1
Commit 2
Commit 3

在第三次提交时,它是第二个快照,它看起来像:

Commit 1
Commit 2

Git正在处理补丁,所以对于git来说,这一系列提交看起来像是:

  • 添加一个文件,其中包含一行“提交1”
  • 在“提交1”
  • 行之后添加说“提交2”和“提交3”的行
  • 在显示“提交2”
  • 的行之后删除显示“提交3”的行

重新排序时,它看起来像:

  • 添加一个文件,其中包含一行“提交1”
  • 在显示“提交2”
  • 的行之后删除显示“提交3”的行
  • 在“提交1”
  • 行之后添加说“提交2”和“提交3”的行

进入第二步,看不到与“提交2”匹配的行,不知道该怎么做,因此需要手动合并。

您手动解析合并,然后在下一步,git看到2行所需的行,并再次需要手动合并。

答案 2 :(得分:0)

如果您的历史记录如下:

a->b->c->d->e->f

ef应放在ad之间的某处

您仍然可以执行rebase -i,但是在您希望插入快照的位置之前将edit放在提交上。当git暂停进行该编辑时,将快照放在工作目录中并添加/提交。继续使用rebase直到下一个点,冲洗,重复。

如果需要说明,您还需要删除最初错位的提交ef,这些提交会处理错位的快照。