【问题标题】:How to reorder last two commits in git?如何在git中重新排序最后两个提交?
【发布时间】:2015-10-28 10:11:17
【问题描述】:

我想在 git 中重新排序最后两次提交:

现在我有:

$ git log --oneline -4
1e0ecba (HEAD, my-branch) Fix for T255
82d45dc django_extensions
af3953b improvements according to CR
dae63ff Fullscreen support

我想拥有:

$ git log --oneline -4
82d45dc (HEAD, my-branch) django_extensions
1e0ecba Fix for T255
af3953b improvements according to CR
dae63ff Fullscreen support

【问题讨论】:

  • git lg 只是一个别名,以防您想知道。 See here how to set it up
  • 已更正,因此人们不必再怀疑了;)

标签: git


【解决方案1】:

我真心推荐阅读this answer about how to reorder commits,我保证,之后你会觉得自己像个 git 摇滚明星。


除此之外,您还可以通过简单的变基来执行此操作(假设您站在要变基的分支上):

git rebase -i HEAD~2

接下来,更改提示中提交的顺序。

pick f4648aee My first commit
pick 00adf09a My second commit

pick 00adf09a My second commit
pick f4648aee My first commit

如果你问我,简直难以置信。

【讨论】:

  • 快速、简单、直观。很好的答案!
  • 万一每次提交都有变化,事情就没有那么简单了。如果无法自动合并更改,则需要手动编辑合并,然后将文件添加回来。
【解决方案2】:

一般来说你必须使用git rebase --interactive - 这里是详细答案how to reorder any number of commits

但如果你想重新排序最后两次提交,你可以使用这个 git 别名:

添加到~/.gitconfig:

[alias]
    reorder = "!GIT_SEQUENCE_EDITOR=\"sed -i -n 'h;1n;2p;g;p'\" git rebase -i HEAD~2"

然后:

$ git reorder
Rebasing(2/2)
Successfully rebased and updated refs/heads/my-branch.

【讨论】:

  • 我个人会坚持使用普通的交互式 rebase。
  • @TimBiegeleisen 我需要这个别名,因为我喜欢在上次提交时对代码进行一些个人调整。在开发过程中,当我创建新提交时,我需要重新排序 my-special-commit 以将其保留为最后......如果我想推送它,我会这样做: git push origin HEAD~1:my-branch
  • 要使其在 macOS 系统上工作,请使用“sed -i '' -n”而不是“sed -i -n”。
  • @noisy 在这种情况下,我更愿意将本地更改提交到本地分支,然后将公共开发合并到调整后的分支中。在您的分支上进行更改,然后,当您准备好提交时,签出最后一个公共提交,提交您的更改,返回您的本地分支,并合并您的新提交。这样您就可以获得完整的本地工作历史记录,而无需重新设置基准,并且公共历史记录不会影响您的本地更改。
  • 这对于在许多 git repos 中以编程方式修改倒数第二次提交的提交消息非常方便(我承认这是一个深奥的用例)
【解决方案3】:

假设没有冲突:

  • git rebase -i HEAD~4
  • 重新排序提交 + 保存

【讨论】:

    【解决方案4】:

    聚会有点晚了,但我从了解很少有 git 命令起作用的角度写了以下答案。其他答案将在交互式 rebase 命令的帮助下以更短的方式完成您的工作。我遇到过类似的情况,这就是我解决问题的方法 -

    假设这是您最近 4 次提交的样子。

    * ca6807e - (HEAD -> lolo) third (4 seconds ago) <Kaustubh Butte>
    | 
    * 61a069c - (master) fourth (18 hours ago) <Kaustubh Butte>
    | 
    * f3b0255 - (lol) second (2 days ago) <Kaustubh Butte>
    | 
    * c2f5e4f - first (2 days ago) <Kaustubh Butte>
    

    现在根据您的问题,您希望将提交历史记录如下(忽略其余的提交 ID)-

    * 0fe6482 - (HEAD -> master) fourth (5 seconds ago) <Kaustubh Butte>
    | 
    * 2c3ba40 - (lol) third (4 minutes ago) <Kaustubh Butte>
    | 
    * f3b0255 - (lolo) second (2 days ago) <Kaustubh Butte>
    | 
    * c2f5e4f - first (2 days ago) <Kaustubh Butte>
    

    要做到这一点,请按照以下步骤 -

    1. 转到第三次最后提交

      git reset HEAD~2

      现在您的 HEAD 将指向“第二次”提交

    2. 此时,我们将分支从master切换到lol(看第一张树图)-

      git checkout lol

      现在,如果您执行git status,您可能会发现一些文件在未跟踪 这是因为您在 在跟踪模式下没有这些文件但您的遥控器的历史记录 存储库有它们。所以你现在必须忽略这些文件。但是混帐 如果我们保留这些文件,将不会让您继续使用我们的方法 未跟踪。因此,我们通过 git add * 添加所有这些文件,然后 git stash 将这些文件保存在临时堆栈中(忽略它们 暂时然后允许我们稍后从这个堆栈中弹出这些文件 我们需要)。

    3. 现在我们需要将我们的“第四次”提交移到当前分支“大声笑”上。去做 我们需要使用git cherry-pick 命令。复制提交 id '第四'提交,在我的情况下是ca6807e。现在输入git cherry-pick ca6807e。现在树结构看起来像这样 -

      * 2c3ba40 - (HEAD -> lol) third (3 seconds ago) <Kaustubh Butte>
      |   
      | * 61a069c - (master) fourth (18 hours ago) <Kaustubh Butte>
      |/  
      | 
      * f3b0255 - (lolo) second (2 days ago) <Kaustubh Butte>
      | 
      * c2f5e4f - first (2 days ago) <Kaustubh Butte>
      

    现在您只需切换回 master 分支并在其上重新设置 lol 分支。

    git checkout master
    git rebase lol
    

    现在您已经成功地交换了最后两个提交。这是树结构现在的样子 -

    * 0fe6482 - (HEAD -> master) fourth (5 seconds ago) <Kaustubh Butte>
    | 
    * 2c3ba40 - (lol) third (4 minutes ago) <Kaustubh Butte>
    | 
    * f3b0255 - (lolo) second (2 days ago) <Kaustubh Butte>
    | 
    * c2f5e4f - first (2 days ago) <Kaustubh Butte>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 2015-03-03
      • 2010-11-29
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      相关资源
      最近更新 更多