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

时间:2011-02-12 22:34:22

标签: git git-rewrite-history

哪些非交互式git命令实现了从Before到After的变化?

在:

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

后:

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

4 个答案:

答案 0 :(得分:38)

在您的情况下,您可以重新定义互动: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

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

答案 1 :(得分:23)

试试这个:

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

git rebase可能有一种方式,但我并不是真的理解它。

答案 2 :(得分:5)

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

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

答案 3 :(得分:0)

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

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

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