All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Baumann <waste.manager@gmx.de>
To: Lars Hjemli <hjemli@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] git-merge: add option --no-ff
Date: Wed, 19 Sep 2007 00:51:34 +0200	[thread overview]
Message-ID: <20070918225134.GA5906@xp.machine.xx> (raw)
In-Reply-To: <11900461843997-git-send-email-hjemli@gmail.com>

On Mon, Sep 17, 2007 at 06:23:04PM +0200, Lars Hjemli wrote:
> This option forces fast-forward merges to create a "true" merge commit,
> i.e. a commit with multiple parents.
> 
> Although a fast-forward merge would normally be the right thing to do with
> git branches, it is suboptimal when operating on git-svn branches since it
> makes 'git-svn dcommit' fail to recognize the correct upstream subversion
> branch. But performing such a merge with --no-ff specified will both make
> git-svn dcommit recognize the correct upstream and create the logically
> correct history in subversion (the merge performed in git will be recorded
> as a single revision in subversion, not as a series of revisions seemingly
> cherry-picked from the merged branch).
> 
> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
> ---
> 
> When updating git-svn.txt, I noticed that we might want to update the 
> section "DESIGN PHILOSOPHY". Eric?
> 
> 
>  Documentation/git-svn.txt       |   13 +++++++++++++
>  Documentation/merge-options.txt |    5 +++++
>  git-merge.sh                    |   13 +++++++++++--
>  t/t6028-merge-up-to-date.sh     |   25 +++++++++++++++++++++++++
>  4 files changed, 54 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
> index be2e34e..c510c21 100644
> --- a/Documentation/git-svn.txt
> +++ b/Documentation/git-svn.txt
> @@ -475,6 +475,19 @@ use 'git-svn rebase' to update your work branch instead of 'git pull' or
>  when committing into SVN, which can lead to merge commits reversing
>  previous commits in SVN.
>  
> +If you use 'git-svn dcommit' to commit your local work to the upstream
> +subversion branch, merge commits are usually handled correctly, i.e.
> +git-svn will only follow the first parent of each merge commit and create
> +a single subversion revision for each of them. An exception is when two
> +subversion branches has been merged locally and the merge ended up as a
> +fast-forward operation. This will make git-svn belive that there are no
> +local changes to dcommit. To work around this issue, one can redo the
> +merge using the --no-ff option:
> +
> +       $ git reset --hard HEAD@{1}   ## undo the fast-forward merge
> +       $ git merge --no-ff <branch>
> +
> +
>  DESIGN PHILOSOPHY
>  -----------------
>  Merge tracking in Subversion is lacking and doing branched development
> diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt
> index d64c259..b34b888 100644
> --- a/Documentation/merge-options.txt
> +++ b/Documentation/merge-options.txt
> @@ -25,3 +25,8 @@
>  	If there is no `-s` option, a built-in list of strategies
>  	is used instead (`git-merge-recursive` when merging a single
>  	head, `git-merge-octopus` otherwise).
> +
> +--no-ff::
> +	Force the creation of a merge commit even when the merge would
> +	have resolved as a fast-forward operation. See gitlink:git-svn[1]
> +	for a use-case for this option.
> diff --git a/git-merge.sh b/git-merge.sh
> index 3a01db0..13b98e6 100755
> --- a/git-merge.sh
> +++ b/git-merge.sh
> @@ -3,7 +3,7 @@
>  # Copyright (c) 2005 Junio C Hamano
>  #
>  
> -USAGE='[-n] [--summary] [--no-commit] [--squash] [-s <strategy>] [-m=<merge-message>] <commit>+'
> +USAGE='[-n] [--summary] [--no-commit] [--no-ff] [--squash] [-s <strategy>] [-m=<merge-message>] <commit>+'
>  
>  SUBDIRECTORY_OK=Yes
>  . git-sh-setup
> @@ -165,6 +165,10 @@ do
>  		merge_msg="$1"
>  		have_message=t
>  		;;
> +	--no-ff)
> +		no_ff=t
> +		no_fast_forward_strategies=$all_strategies
> +		;;
>  	-*)	usage ;;
>  	*)	break ;;
>  	esac
> @@ -444,7 +448,12 @@ done
>  # auto resolved the merge cleanly.
>  if test '' != "$result_tree"
>  then
> -    parents=$(git show-branch --independent "$head" "$@" | sed -e 's/^/-p /')
> +    if test $no_ff = 't'
This should be quoted, e.g.
  +    if test "$no_ff" = 't'

Otherwise I get an error like the following:

  xp:/tmp/va (a)$ git merge b
  Renamed msg.cc->common/msg.cc
  Auto-merged common/msg.cc
  Renamed msg.h->common/msg.h
  Auto-merged common/msg.h
  Renamed sampler/ConcurrentQueue.h->common/ConcurrentQueue.h
  Auto-merged common/ConcurrentQueue.h
  Renamed sampler/TimeoutSemaphore.h->common/TimeoutSemaphore.h
  Auto-merged common/TimeoutSemaphore.h
  /home/peter/usr/bin/git-merge: line 451: test: =: unary operator expected
  Merge made by recursive.


> +    then
> +        parents=$(git rev-parse "$head" "$@" | sed -e 's/^/-p /')
> +    else
> +        parents=$(git show-branch --independent "$head" "$@" | sed -e 's/^/-p /')
> +    fi
>      result_commit=$(printf '%s\n' "$merge_msg" | git commit-tree $result_tree $parents) || exit
>      finish "$result_commit" "Merge made by $wt_strategy."
>      dropsave

-Peter

  parent reply	other threads:[~2007-09-18 22:51 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-17 12:17 [PATCH] git-merge: add option --no-ff Lars Hjemli
2007-09-17 12:39 ` Andreas Ericsson
2007-09-17 13:16   ` Lars Hjemli
2007-09-17 13:23     ` Johannes Schindelin
2007-09-17 13:37       ` Chris Shoemaker
2007-09-17 13:40         ` Lars Hjemli
2007-09-17 13:52         ` Johannes Schindelin
2007-09-17 13:38       ` Lars Hjemli
2007-09-17 13:57         ` Johannes Schindelin
2007-09-17 14:12           ` Lars Hjemli
2007-09-17 15:05             ` Johannes Schindelin
2007-09-17 15:17               ` Lars Hjemli
2007-09-17 16:23                 ` Lars Hjemli
2007-09-18  0:50                   ` Eric Wong
2007-09-18  1:09                     ` Junio C Hamano
2007-09-18  1:39                       ` Eric Wong
2007-09-18  6:12                     ` Lars Hjemli
2007-09-18  6:23                       ` Eric Wong
2007-09-18  6:53                       ` Junio C Hamano
2007-09-18  7:30                         ` Sam Vilain
2007-09-18  9:12                           ` Sam Vilain
2007-09-18 11:19                             ` Lars Hjemli
2007-09-18 11:50                               ` Sam Vilain
2007-09-18 12:03                                 ` Lars Hjemli
2007-09-18 13:22                                   ` Sam Vilain
2007-09-18 14:01                                     ` Lars Hjemli
2007-09-18 14:34                                       ` Sam Vilain
2007-09-18 12:29                               ` Johannes Schindelin
2007-09-18 12:38                                 ` Lars Hjemli
2007-09-18  8:02                         ` Lars Hjemli
2007-09-18 22:51                   ` Peter Baumann [this message]
2007-09-19  7:09                     ` Lars Hjemli
2007-09-17 16:07             ` Chris Shoemaker
2007-09-17 16:14               ` Lars Hjemli

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=20070918225134.GA5906@xp.machine.xx \
    --to=waste.manager@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=hjemli@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.