git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jeff King <peff@peff.net>
To: "Randal L. Schwartz" <merlyn@stonehenge.com>
Cc: git@vger.kernel.org
Subject: Re: I want "fast forward my workdir to upstream if it's safe"
Date: Thu, 7 May 2009 22:30:28 -0400	[thread overview]
Message-ID: <20090508023028.GA1218@coredump.intra.peff.net> (raw)
In-Reply-To: <86prekfv7z.fsf@blue.stonehenge.com>

On Thu, May 07, 2009 at 02:40:00PM -0700, Randal L. Schwartz wrote:

> So, what I need is a command, likely an option to "git merge" that says "do
> everything that a git merge would do except abort if it would have been a
> merge commit".  In other words, abort if the workdir is dirty or is not a
> fast-forward update to the upstream.  Bonus if it exits non-zero if
> something went wrong.

Can you define more clearly what you want, because you are asking for
conflicting things. "abort if it would have been a merge commit" is
purely about fast forward. But it sounds like you also care about "would
merge have succeeded". So I think you are asking for:

  1. There are no local commits on the branch.

and one of:

  2a. There are no local edits.

  2b. There are no local edits in the same files as those that are
      affected by any new commits from upstream.

  2c. Any local edits you have done would not cause a conflict if merged
      with what's in upstream.

And before I discuss those further, let me address:

> Please don't tell me "use these three commands in this script".
> I want a *command* I can tell people in #git.

by saying that I don't think there is currently a single command to
cover both (1) and (2) (any of the (2) options). So we need to talk
about "use these three commands in a script" for a moment to figure out
what such a command _should_ do, and then we can talk about putting it
into a single command (and presumably making that command part of the
git distribution) that you can tell people about in #git.

Both (1) and (2) involve finding out who your upstream is. As of 1.6.3,
this is easy to do as:

  upstream=`git for-each-ref --format='%(upstream)' `git symbolic-ref HEAD`

One you have that, (1) is easy:

  test -z "`git rev-list -1 $upstream..HEAD`"

(2a) is also pretty easy:

  git diff-files --quiet && git diff-index --quiet

(2b) is a bit harder, but do-able:

  git diff-tree --name-only HEAD $upstream | sort >them
  (git diff-files --name-only; git diff-index --name-only) | sort >us
  test -z "`comm -12 us them`"

(2c) is the trickiest (and of course, therefore probably the one you
want ;) ).  I'm not sure there is a simple way to do it short of hacking
git-merge to actually try the merge and roll it back. Because you really
have to deal not just with merging actual text file content but with
custom merge drivers.

So what is it that you're looking for?

-Peff

PS I took your request at face value, but I actually think this question
shows that the asker is not using git as it was intended. Unless you are
very clueful (i.e., willing to sort out any mess caused by a failed
merge), you should almost certainly be merging with a clean working
tree. In other words, you should not be afraid of making a commit, and
_then_ merging, as you might be in a non-distributed VCS.

  parent reply	other threads:[~2009-05-08  2:30 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-07 21:40 I want "fast forward my workdir to upstream if it's safe" Randal L. Schwartz
2009-05-07 23:18 ` Wincent Colaiuta
2009-05-07 23:20   ` Randal L. Schwartz
2009-05-08  2:30 ` Jeff King [this message]
2009-05-08  6:53   ` Andreas Ericsson
2009-05-08  7:01     ` Jeff King
2009-05-08 12:34   ` Eyvind Bernhardsen
2009-05-08 14:02     ` Randal L. Schwartz
2009-05-08 15:57     ` Junio C Hamano
2009-05-08 16:15       ` Jakub Narebski
2009-05-11 20:11       ` Eyvind Bernhardsen
2009-05-08 21:34     ` Miles Bader

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

  List information: http://vger.kernel.org/majordomo-info.html

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

  git send-email \
    --in-reply-to=20090508023028.GA1218@coredump.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=merlyn@stonehenge.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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).