如何在git中重新排序最后两个提交?

时间:2015-10-28 10:11:18

标签: git

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

现在我有:

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

我希望:

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

4 个答案:

答案 0 :(得分:32)

一般情况下,您必须使用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.

答案 1 :(得分:20)

我真的建议阅读this answer about how to reorder commits,之后你会感觉自己像个摇滚明星,我保证。

除此之外,这里是你如何使用一个简单的rebase(假设你站在你想要改变的分支上):

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 :(得分:3)

假设没有冲突:

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

答案 3 :(得分:0)

晚了一点,但是从理解git命令的工作量角度来看,我写了以下答案。其他答案将借助交互式变基命令使您的工作更短。我也遇到过类似情况,这就是我解决问题的方式-

假设这是您最近的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. 转到第3次提交

    git reset HEAD~2

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

  2. 这时,我们将分支从master切换到lol(请看第一个树形图)-

    git checkout lol

    现在,如果您执行git status,可能会发现某些文件处于未跟踪状态 这部分是因为您在中检查了上一次提交 历史记录,其中没有那些文件处于跟踪模式,但是您的远程 存储库中有它们。因此,您现在只需要忽略这些文件即可。但是git 如果我们保留这些文件,将不会让您继续使用我们的方法 未追踪。因此,我们通过执行git add *然后加上git stash来添加所有文件,这会将这些文件保存在临时堆栈中(忽略它们 暂时,然后让我们稍后在此堆栈中弹出这些文件 我们需要)。

  3. 现在,我们需要在当前分支“ lol”上移动“第四”提交。去做 我们需要使用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>