Re: [PATCH] git-merge: add option --no-ff
On Mon, Sep 17, 2007 at 06:23:04PM +0200, Lars Hjemli wrote:
Show 92 quoted lines
> 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.
Show 8 quoted lines
> + 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