# how to reorder commits

6 messages from 2009-07-20 to 2009-07-21. Participants: Rustom Mody, Santi Béjar, Daniel Barkalow.
Thread: https://gitlist.dev/t/20168

## Rustom Mody, 2009-07-20 15:07

Subject: how to reorder commits
Message-ID: <f46c52560907200807heed4bbfkde15cccd2ae8151d@mail.gmail.com>
URL: https://gitlist.dev/e/f46c52560907200807heed4bbfkde15cccd2ae8151d%40mail.gmail.com

```
I have a sequence of commits. I tried to reorder the top two in this way.
$ git rebase -i HEAD^^

flip the two pick lines and exit vi

I find my file full of conflict markers.
So what is the way of doing:
HEAD becomes current HEAD^
HEAD^ becomes current HEAD
without having to handle conflicts ??

```

## Santi Béjar, 2009-07-20 15:37

Subject: Re: how to reorder commits
Message-ID: <adf1fd3d0907200837k63f21504v3d660f9503962fcf@mail.gmail.com>
URL: https://gitlist.dev/e/adf1fd3d0907200837k63f21504v3d660f9503962fcf%40mail.gmail.com
In-Reply-To: <f46c52560907200807heed4bbfkde15cccd2ae8151d@mail.gmail.com>

```
2009/7/20 Rustom Mody <rustompmody@gmail.com>:
> I have a sequence of commits. I tried to reorder the top two in this way.
> $ git rebase -i HEAD^^
>
> flip the two pick lines and exit vi
>
> I find my file full of conflict markers.

"git rebase" applies the changes between the commit and the parent,
and if the changes have conflicts this is what you get.

> So what is the way of doing:
> HEAD becomes current HEAD^
> HEAD^ becomes current HEAD

$ git branch old
$ git reset --hard HEAD~2
$ git read-tree old
$ git commit -C old
$ git read-tree old^
$ git commit -C old^

But normally you reorder "changes", not trees.

HTH,
Santi

```

## Rustom Mody, 2009-07-20 16:01

Subject: Re: how to reorder commits
Message-ID: <f46c52560907200901w67edbbdcpe405f28d98953354@mail.gmail.com>
URL: https://gitlist.dev/e/f46c52560907200901w67edbbdcpe405f28d98953354%40mail.gmail.com
In-Reply-To: <adf1fd3d0907200837k63f21504v3d660f9503962fcf@mail.gmail.com>

```
On Mon, Jul 20, 2009 at 9:07 PM, Santi Béjar<santi@agolina.net> wrote:
> 2009/7/20 Rustom Mody <rustompmody@gmail.com>:
>> I have a sequence of commits. I tried to reorder the top two in this way.
>> $ git rebase -i HEAD^^
>>
>> flip the two pick lines and exit vi
>>
>> I find my file full of conflict markers.
>
> "git rebase" applies the changes between the commit and the parent,
> and if the changes have conflicts this is what you get.
>
>> So what is the way of doing:
>> HEAD becomes current HEAD^
>> HEAD^ becomes current HEAD
>
> $ git branch old
> $ git reset --hard HEAD~2
> $ git read-tree old
> $ git commit -C old
> $ git read-tree old^
> $ git commit -C old^

Beautiful -- plumbing is nifty!

>
> But normally you reorder "changes", not trees.

Which may not always be conflict-free?

```

## Santi Béjar, 2009-07-20 16:16

Subject: Re: how to reorder commits
Message-ID: <adf1fd3d0907200916x752cba3cw901965788acae0c5@mail.gmail.com>
URL: https://gitlist.dev/e/adf1fd3d0907200916x752cba3cw901965788acae0c5%40mail.gmail.com
In-Reply-To: <f46c52560907200901w67edbbdcpe405f28d98953354@mail.gmail.com>

```
2009/7/20 Rustom Mody <rustompmody@gmail.com>:
> On Mon, Jul 20, 2009 at 9:07 PM, Santi Béjar<santi@agolina.net> wrote:
>> But normally you reorder "changes", not trees.
>
> Which may not always be conflict-free?

No. But the fact that there is no porcelain way to do it may show that
reordering trees is not what you normally want, even if reordering
trees is conflict-free.

HTH,
Santi

```

## Daniel Barkalow, 2009-07-20 21:27

Subject: Re: how to reorder commits
Message-ID: <alpine.LNX.2.00.0907201717570.2147@iabervon.org>
URL: https://gitlist.dev/e/alpine.LNX.2.00.0907201717570.2147%40iabervon.org
In-Reply-To: <f46c52560907200807heed4bbfkde15cccd2ae8151d@mail.gmail.com>

```
On Mon, 20 Jul 2009, Rustom Mody wrote:

> I have a sequence of commits. I tried to reorder the top two in this way.
> $ git rebase -i HEAD^^
> 
> flip the two pick lines and exit vi
> 
> I find my file full of conflict markers.
> So what is the way of doing:
> HEAD becomes current HEAD^
> HEAD^ becomes current HEAD
> without having to handle conflicts ??

Note that what you're asking for here would add both changes in HEAD^ and 
*remove* some changes in HEAD (to get to the state where only the change 
that was made first has been made).

What you tried with rebase is correct, but if your changes in those 
commits intersect, impossible to do automatically:

Original:

 This is an example.

Change 1:

-This is an example.
+This is a better example.

Change 2:

-This is a better example.
+This is a better sentence.

Now, make change 2 without change 1. Even if you can split the changes as
(1) "an"->"a better"; (2) "example"->"sentence", you get:

 This is an sentence.

When the correct version would be:

 This is a sentence.

But there's no automated way to know this, so you get conflict markers.

	-Daniel
*This .sig left intentionally blank*

```

## Rustom Mody, 2009-07-21 07:53

Subject: Re: how to reorder commits
Message-ID: <f46c52560907210053k53c092c6t3268231ed08153d3@mail.gmail.com>
URL: https://gitlist.dev/e/f46c52560907210053k53c092c6t3268231ed08153d3%40mail.gmail.com
In-Reply-To: <873a8r132o.fsf@krank.kagedal.org>

```
On Tue, Jul 21, 2009 at 2:31 AM, David Kågedal<david@kagedal.org> wrote:
>
> Latest stgit actually has it. You can push a patch with the --set-tree
> flag. So your sequence of commands would have been (with the latest
> two commits as stg patches called "old" and "older")
>
> $ stg series
... example snipped ...

Thanks for the info but I gather that stgit does not run on windows?
I need git to run on both on linux and windows.

```
