git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Linus Torvalds <torvalds@linux-foundation.org>
To: Paolo Ciarrocchi <paolo.ciarrocchi@gmail.com>
Cc: Andi Kleen <andi@firstfloor.org>,
	Jakub Narebski <jnareb@gmail.com>,
	Avery Pennarun <apenwarr@gmail.com>,
	git@vger.kernel.org
Subject: Re: nicer frontend to get rebased tree?
Date: Sat, 23 Aug 2008 14:52:37 -0700 (PDT)	[thread overview]
Message-ID: <alpine.LFD.1.10.0808231440530.3363@nehalem.linux-foundation.org> (raw)
In-Reply-To: <4d8e3fd30808231404y7293eb56g4fbed5565ab2aa9a@mail.gmail.com>



On Sat, 23 Aug 2008, Paolo Ciarrocchi wrote:
>
> you got nice and detailed answers,  for example you can track a
> rebased tree in your working directory using git pull --rebase.
> What's wrong with that?

No, you really really cannot do that.

If the _tree_ you are tracking is itself rebasing (not just your own 
tree), then you cannot and absolutely SHOULD NOT use rebase (not directly, 
and not with "git pull --rebase".

Why?

Let's look at what happens. Let's say that your history looks like

	... -> A -> B -> C -> a -> b -> c

where the upper-case letters are from the tree you track, and the 
lower-case letters are the commits you added yourself.

Now, let's say that the tree you track gets rebased, and in the process 
'B' is removed (because it turns out it was buggy), and A and C get 
modified. What happens?

You now have

	... -> A -> B -> C -> a -> b -> c     <- your branch
	  \
	    other stuff -> A' -> C'     <- newly rebased branch

(where "other stuff" is whatever the remote branch was rebased on top 
of) and when you now try to rebase your stuff on top of the newly rebased 
branch, you are going to end up trying to rebase all the _old_ commits 
that weren't even yours (ie it's going to try to rebase A, B and C too!)

And that's not what you want! It will potentially not only generate lots 
of conflicts (because A' and A aren't the same, and C' and C aren't the 
same), and it will actually re-insert B - which was buggy - before it 
finally gets to the commits _you_ actually did (a, b and c).

So no, you canno even sanely rebase on top of another persons rebased 
tree, because the _other_ person threw away his history, and since you 
remember their _old_ history, it's basically now you who are in charge of 
it.

What you can do is to basically do

	git fetch nasty-tree
	git rebase C.. --onto nasty-tree

ie you can explicitly _tell_ rebase which commits you want to rebase. 
Obviously, "git rebase --interactive" can help you do this (ie you can get 
the whole list and edit out all the crud that you know isn't yours).

But this is why working on top of somebody elses tree that gets rebased is 
so hard. You lose all the history, because the other person basically 
threw it away and started over.

Don't get me wrong - it's _possible_ to do. See above about how you can 
pick-and-choose the parts you decide you want to keep (your "own" stuff). 

In fact, we could even do a form of "rebase" that only picks commits that 
you committed yourself, and call it "git rebase --my-commits nasty-tree", 
and that would often do the right thing (assuming the source tree only 
ever rebases its own commits, of course! If it rebases other peoples 
commits, it's so terminally broken that you should just refuse to work 
with that tree, and shoot the maintainer)

So we could do more helper functions for this, but the fact is, it's a 
really broken model. The real fix is to teach people not to rebase.

			Linus

  reply	other threads:[~2008-08-23 21:53 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-22 17:46 nicer frontend to get rebased tree? Andi Kleen
2008-08-22 17:55 ` Linus Torvalds
2008-08-22 18:27   ` Andi Kleen
2008-08-22 19:36     ` Linus Torvalds
2008-08-22 20:11       ` Paolo Ciarrocchi
2008-08-22 20:33         ` Linus Torvalds
2008-08-22 20:36         ` Björn Steinbrink
2008-08-22 20:46           ` Paolo Ciarrocchi
2008-08-22 20:29       ` Linus Torvalds
2008-08-22 21:23       ` Junio C Hamano
2008-08-23  7:10       ` Andi Kleen
2008-08-23  9:24         ` Paolo Bonzini
2008-08-23 16:36           ` Andi Kleen
2008-08-23 23:00             ` Paolo Bonzini
2008-08-23 15:55         ` Linus Torvalds
2008-08-23 16:45           ` Andi Kleen
2008-08-23 17:58             ` Linus Torvalds
2008-08-25  9:36               ` Ingo Molnar
2008-08-23 18:18             ` Björn Steinbrink
2008-08-23 18:56               ` Linus Torvalds
2008-08-23 20:08                 ` Björn Steinbrink
2008-08-23 21:38                 ` Documentating branches (was: nicer frontend to get rebased tree?) Marius Vollmer
2008-08-23 22:17                   ` Miklos Vajna
2008-08-23 22:30                     ` Documenting branches Marius Vollmer
2008-08-23 22:18                   ` Documentating branches Marius Vollmer
2008-08-22 17:56 ` nicer frontend to get rebased tree? Avery Pennarun
2008-08-22 18:31   ` Andi Kleen
2008-08-22 19:03     ` Paolo Ciarrocchi
2008-08-22 19:34     ` Jakub Narebski
2008-08-23  7:15       ` Andi Kleen
2008-08-23  8:52         ` Paolo Ciarrocchi
2008-08-23  9:21         ` Jakub Narebski
2008-08-23 16:53           ` Andi Kleen
2008-08-23 21:04             ` Paolo Ciarrocchi
2008-08-23 21:52               ` Linus Torvalds [this message]
2008-08-23 22:09                 ` Paolo Ciarrocchi
2008-08-23 22:13                 ` Björn Steinbrink
2008-08-24  0:30                 ` Junio C Hamano
2008-08-23 22:49             ` Jakub Narebski
2008-08-23 23:01             ` Theodore Tso
2008-08-23 23:01             ` A proposed solution (Was: nicer frontend to get rebased tree?) Theodore Tso
2008-08-22 20:11 ` nicer frontend to get rebased tree? Mikael Magnusson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.LFD.1.10.0808231440530.3363@nehalem.linux-foundation.org \
    --to=torvalds@linux-foundation.org \
    --cc=andi@firstfloor.org \
    --cc=apenwarr@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=jnareb@gmail.com \
    --cc=paolo.ciarrocchi@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).