我想在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
答案 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>
为此,请按照以下步骤操作-
转到第3次提交
git reset HEAD~2
现在您的HEAD将指向“第二次提交”
这时,我们将分支从master切换到lol(请看第一个树形图)-
git checkout lol
现在,如果您执行git status
,可能会发现某些文件处于未跟踪状态
这部分是因为您在中检查了上一次提交
历史记录,其中没有那些文件处于跟踪模式,但是您的远程
存储库中有它们。因此,您现在只需要忽略这些文件即可。但是git
如果我们保留这些文件,将不会让您继续使用我们的方法
未追踪。因此,我们通过执行git add *
然后加上git
stash
来添加所有文件,这会将这些文件保存在临时堆栈中(忽略它们
暂时,然后让我们稍后在此堆栈中弹出这些文件
我们需要)。
现在,我们需要在当前分支“ 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>