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

Posted

技术标签:

【中文标题】如何以非交互方式在 Git 中重新排序提交【英文标题】:how to re-order commits in Git non-interactively 【发布时间】:2011-06-26 05:56:59 【问题描述】:

什么非交互式 git 命令实现了从之前到之后的变化?

之前:

A---B---C---D

之后:

A---C'---B'---D'

【问题讨论】:

【参考方案1】:

在您的情况下,您可以重新设置交互式基础: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

如果你想用 C 重新排序 B:

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

您只需将它们重新排序为:

pick 33f41be C
pick 1f9133d B

写完后,看短日志:

$ git shortlog
 (3):
      A
      C
      B

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

【讨论】:

当这个答案显然没有回答问题时,为什么会获得投票? OP 要求以非交互方式执行此操作,而这个答案就是关于如何以交互方式执行此操作。 @AndreasWederbrand 可能是因为这是大多数人(包括我)来这里时所寻找的,尽管你是绝对正确的。 @AndreasWederbrand 人们搜索了“如何在 git 中重新排序提交”,这对他们有所帮助:v.【参考方案2】:

试试这个:

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

git rebase可能有办法,但我不是很明白。

【讨论】:

git rebase -i 一定会让你这么做;但不确定如何以非交互方式实现相同的目标 所有git rebase 所做的只是使用git format-patch 然后git am 重新应用它们(可能以不同的顺序)。不过,这是一个基本的交互过程,因为乱序重新应用补丁可能会失败并需要用户干预。 我认为这确实在没有 rebase -i 的情况下回答了这个问题,除了你订购了樱桃挑选 B、C、D 而不是 C、B、D 所以它实际上并没有解决问题:) @ThomsonComer 哎呀,似乎近 4 年没有人注意到这一点。谢谢。 这个解决方案很中肯。此外,对于交互式,它非常适用于 TortoiseGit:tortoisegit 显示日志,重置为“A”(HARD),tortoisegit 显示 reflog,右键单击条目 before 重置,“显示日志...”,然后开始挑选樱桃以重新排序您的提交。如有必要,首先存储未提交的本地更改。【参考方案3】:

请参阅How do I run git rebase --interactive in non-interactive manner? 以非交互方式使用 git rebase --interactive。

然后,如果您有重新排序提交的正式标准,您可以编写脚本,例如参见 Really flatten a git merge 以按原始提交日期重新排序提交。

【讨论】:

【参考方案4】:

如果您想在脚本中重新排序提交并且不想处理提交哈希,那么这似乎可以作为一般解决方案(基于 Paŭlo Ebermann 的回答):

git reset --hard @~3
git cherry-pick ORIG_HEAD~1
git cherry-pick ORIG_HEAD~2
git cherry-pick ORIG_HEAD

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

【讨论】:

以上是关于如何以非交互方式在 Git 中重新排序提交的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法以非交互方式压缩大量提交?

如何以非交互方式分析 Java 应用程序?

如何找到跨文件重命名和重新排序添加特定 Gradle 构建依赖项的 Git 提交?

如何以非交互方式为“psql”指定密码?

如何通过非交互方式压缩除最近提交之外的所有提交来减少臃肿的 Git 存储库的大小?

如何获取按最近提交排序的 Git 分支列表?