如何在Git中以非交互方式重新排序提交记录

34
什么非交互式 git 命令可以实现从 Before 到 After 的改变?
Before:
A---B---C---D

之后:

A---C'---B'---D'
4个回答

30

在你的情况下,你可以交互式地进行变基:git rebase -i HEAD~4,然后你可以重新排序你的选择。

例如,我们在分支中添加三个文件:

git add A
git commit -m "A"

git add B
git commit -m "B"

git add C
git commit -m "C"

您的短日志将是:

$ git shortlog
 (3):
      A
      B
      C

如果您想重新排列B和C:

$ git rebase -i HEAD~2
pick 1f9133d B
pick 33f41be C

你只需要重新调整它们的顺序:

pick 33f41be C
pick 1f9133d B

写完后,请查看短日志:

$ git shortlog
 (3):
      A
      C
      B

通过重新排序,您可以对所有提交执行相同的操作。这就像所见即所得一样,非常酷 :)


30
为什么这个回答明显没有回答问题,却能得到赞成票?OP要求以非交互的方式完成,而这个回答全都是关于如何交互式地完成。 - Andreas Wederbrand
8
@AndreasWederbrand,可能因为大多数人(包括我在内)来到这里时都在寻找这个,尽管你完全正确。 - hugo der hungrige
@AndreasWederbrand 有人搜索了“如何在git中重新排序提交”,这个帮助了他们 :v。 - Larry N
假设在 BC 之间有一千个提交(或者如果你认为在代码编辑器中一千行不算多的话,就是一百万个)。如何通过交互式变基以可管理的方式完成这个任务? - Olsgaard

26

试试这个:

git reset --hard A
git cherry-pick C
git cherry-pick B
git cherry-pick D

也许可以用 git rebase 来实现,不过我并没有真正理解它。


1
git rebase -i 肯定可以让你做到这一点;但不确定如何以非交互方式实现相同的事情。 - James Tauber
2
所有 git rebase 做的就是使用 git format-patch 然后使用 git am 重新应用它们(可能以不同的顺序)。然而,这是一个基本上交互式的过程,因为以错误的顺序重新应用补丁可能会失败并需要用户干预。 - Ben Jackson
1
我认为这就回答了不使用rebase -i的问题,除非您订购了樱桃选择B、C、D,而不是C、B、D,所以这并没有解决问题 :) - Thomson Comer
1
@ThomsonComer 哎呀,似乎已经有将近4年没有注意到这个了。谢谢。 - Paŭlo Ebermann
1
这个解决方案非常简洁明了。此外,对于交互式操作,它在TortoiseGit上的表现也非常完美:tortoisegit show log,reset to "A" (HARD),tortoisegit show reflog,右键单击重置之前的条目,“显示日志...”,然后开始挑选以重新排序您的提交。如果需要,可以先将未提交的本地更改存储起来。 - Antonio

6

0
如果您想在脚本中重新排序提交记录,而不想处理提交哈希值,那么这似乎是一个通用的解决方案(基于Paŭlo Ebermann的答案):
git reset --hard @~3
git cherry-pick ORIG_HEAD~1
git cherry-pick ORIG_HEAD~2
git cherry-pick ORIG_HEAD

我假设连续运行这个命令序列两次将会将提交树恢复到之前的状态,除了更改已更改的提交哈希值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接