git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Paolo Bonzini <bonzini@gnu.org>
Cc: <git@vger.kernel.org>
Subject: Re: [PATCH] provide a new "theirs" strategy, useful for rebase --onto
Date: Fri, 06 Jun 2008 16:08:45 -0700	[thread overview]
Message-ID: <7vfxrqrwjm.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: E1K4a1Q-0002hq-QE@fencepost.gnu.org

Paolo Bonzini <bonzini@gnu.org> writes:

> +For example, `git commit --amend` also has this effect, and it can
> +happen that you use it even though you had already pushed to the
> +remote repository before amending your commit.  You can then
> +use `git rebase` (with the --onto option) to transform the `--amend`
> +commit into a separate commit (as if you had not used the `--amend`
> +option).  The situation is like this:
> +
> +------------
> +    o---D---E  origin/master
> +         \
> +          E'---F---G---H---I  master
> +------------
> +
> +because the parent of the amended commit E' is D, that is
> +origin/master^.  To avoid a forced update from master to
> +origin/master, you need the history to look like this:
> +
> +------------
> +    o---D---E  origin/master
> +             \
> +              E''---F'---G'---H'---I'  master
> +------------
> +
> +You can achieve this with:
> +
> +    git-rebase -s theirs --onto origin/master origin/master^ master
> +
> +The merge strategy `-s theirs` resolves conflicts in favor of the commits
> +being rebased---in this case, you know that the only conflicts will occur
> +when replaying E', and you definitely E'' to have those changes.

Isn't this a very risky thing to suggest as if it is a generally
applicable solution?  What happens if others have already worked on top of
E and your history looked like this?

    o---D---E---X---Y  origin/master
         \
          E'---F---G---H---I  master

The reader would want this history:


    o---D---E---X---Y  origin/master
                     \
                      E''--F'--G'--H'--I'  master

where difference between Y and E'' contains the change between E and E'.

However, neither "rebase -s theirs --onto Y D master" (use of D is more in
the spirit of your original example than literal origin/master^) nor
"rebase -s theirs --onto Y origin/master^ master" (which is nonsense but
careless readers would be tempted to "adjust" your example to their
situation) would give such a tree.  E'' should not have the same tree as
E' in this case.

I think I know why you wanted to do it in the original context without X
and Y.  Use of "-s theirs" would allow you to record the tree of E'
without conflicts.  But even that I do not agree is a good thing to do.

Because original E' was an amend of E, its log message explained
everything E did and more.  You cannot leave that same commit message in
E''.  What you did in E was already explained in the history, so now you
would want to talk about the incremental change on top of it when you
desribe E''.  For that, replaying of E' must stop to allow you to fix up
the log message.  It shouldn't silently go on.

Yes, you may want an easy way to say "the result should have the same tree
as E'" while replaying of E' on top of E _when_ you have to resolve the
conflict.  But that is a separate issue ("git checkout $other_head --
$conflicted_paths", or somesuch).  Using this in rebase is a horrible
example inviting misuse and a broken history, I think.

  parent reply	other threads:[~2008-06-06 23:10 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-06 10:59 [PATCH] provide a new "theirs" strategy, useful for rebase --onto Paolo Bonzini
2008-06-06 11:27 ` Peter Karlsson
2008-06-06 11:28 ` Paolo Bonzini
2008-06-06 14:14 ` Miklos Vajna
2008-06-06 23:08 ` Junio C Hamano [this message]
2008-06-08  2:54   ` Paolo Bonzini
2008-06-08  8:16     ` Junio C Hamano
2008-06-08 13:38       ` Paolo Bonzini
2008-06-08 20:59         ` Junio C Hamano
2008-06-08 23:06           ` Paolo Bonzini

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=7vfxrqrwjm.fsf@gitster.siamese.dyndns.org \
    --to=gitster@pobox.com \
    --cc=bonzini@gnu.org \
    --cc=git@vger.kernel.org \
    /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).