From: Phillip Wood <phillip.wood123@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Alex Henrie <alexhenrie24@gmail.com>,
git@vger.kernel.org, newren@gmail.com
Subject: Re: [PATCH RFC] rebase: respect --ff-only option
Date: Mon, 5 Jul 2021 14:54:44 +0100 [thread overview]
Message-ID: <41852b7c-6ac7-3a3b-9f2d-6e537f52cd2a@gmail.com> (raw)
In-Reply-To: <xmqq8s2lnkta.fsf@gitster.g>
Hi Junio
On 05/07/2021 10:58, Junio C Hamano wrote:
> Phillip Wood <phillip.wood123@gmail.com> writes:
>
>> As I understand it the motivation for this change is to have 'git -c
>> pull.rebase=true pull --ff-only' actually fast forward. Why cant we
>> just change pull not to rebase in that case?
>> ...
>> Is there a use for this outside of 'git pull --ff-only'? I'm far from
>> convinced we want this new option but if we do end up adding it I
>> think it should error out in combination with '-i' or '-x' as '-i'
>> implies the user wants to change the existing commits and '-x' can end
>> up changing them as well.
>>
>> I think this patch addresses a valid problem but it seems to me that
>> the approach taken pushes complexity into rebase to handle a case when
>> pull does not need to invoke rebase in the first place.
>
> I share the sentiment, but my conclusion would be different.
>
> Even though we explain that "pull" is _like_ "fetch" followed by
> "merge" (or "rebase"), at the conceptual level, "pull --ff-only"
> should not have to invoke merge or rebase backend. If the branch
> fast-fowards to the fetched tip, "pull" should be able to just
> update the branch and check it out, and if it doesn't, "pull" should
> just be able to fail.
>
> Similarly, "pull --ff" (i.e. fast-forwading allowed) should be able
> to just update the branch and check it out when the current tip of
> the branch can be fast-forwarded to the fetched tip.
>
> But as you said, pull.rebase=interactive will break such a clean
> separation of concerns. You can leave "pull" oblivious of what
> "rebase -i" wants to do when seeing a fast-forwardable history by
> teaching "rebase" (and "merge") backend to take "--ff-only", "--ff",
> and "--no-ff" options and having "pull" pass them through.
My main concern with the new rebase option was about a user invoking
'git rebase -i --ff-only' directly.
If a user has pull.rebase=interactive and runs 'git pull --ff-only' then
I'm not clear what they expect to happen. Assuming we can fast-forward
would they expect pull to run 'rebase -i' which would open their editor
with the todo list or would they expect that '--ff-only' means "I just
want to fast-forward, I don't want to run 'rebase -i'". If it is the
latter then we can just invoke 'git merge --ff-only' (so long as we
don't mind running the post-merge hook in this case) and not worry about
adding more complexity to 'git rebase'
The relevant section of the pull man page only talks about merging in
relation to --ff-only
--ff, --no-ff, --ff-only
Specifies how a merge is handled when the merged-in history
is already a descendant of the current history. --ff is the
default unless merging an annotated (and possibly signed)
tag that is not stored in its natural place in the
refs/tags/ hierarchy, in which case --no-ff is assumed.
With --ff, when possible resolve the merge as a fast-forward
(only update the branch pointer to match the merged branch;
do not create a merge commit). When not possible (when the
merged-in history is not a descendant of the current
history), create a merge commit.
With --no-ff, create a merge commit in all cases, even when
the merge could instead be resolved as a fast-forward.
With --ff-only, resolve the merge as a fast-forward when
possible. When not possible, refuse to merge and exit with a
non-zero status.
> We can teach "pull" that certain backends (namely "rebase -i" in
> this case) want to handle "ff logic" [*] themselves, and other
> backends (i.e. "rebase" and "merge") do not mind if "pull" handles
> "ff logic" for them, but that will break the abstraction (e.g. do we
> really want to teach "pull" that "rebase -i" wants to rewrite all
> the commits even when the history fast-forwards?) and will become a
> source of duplicated logic.
>
> Another thing to worry about are hooks. post-rebase
There is no post-rebase hook. There is the post-rewrite hook, I haven't
checked if we invoke it with no input of skip it entirely when we
fast-forward.
> or post-merge
> operations would want to be carried out even when the history would
> fast-forward, and making "pull" to perform the fast-forwarding and
> know which hooks should be called with what parameter so that we
> could pretend as if the "merge" or "rebase" backend was indeed ran,
> breaks the abstraction.
>
> So, even though I wish that the world was simpler and we could
> handle "ff logic" inside "pull", I am not sure if it is a realistic
> wish.
I think if we decide that 'pull --ff-only' always implies merging then
the world stays fairly simple. On the other hand if we want to somehow
combine rebasing with --ff-only it will be more complicated. If we go
for the latter then unless someone comes up with a good use for 'rebase
--ff-only' in another context I would prefer the new rebase option to be
marked with PARSE_OPT_HIDDEN and that we also avoid making incidental
changes the existing rebase options.
Best Wishes
Phillip
>
> [Footnote]
>
> * By "ff logic", I am referring to what should happen in the 3x2=6
> matrix when one of ("--ff", "--ff-only", or "--no-ff") is given
> and the history (does or does not) fast-forward.
>
next prev parent reply other threads:[~2021-07-05 13:54 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-05 4:45 [PATCH RFC] rebase: respect --ff-only option Alex Henrie
2021-07-05 8:53 ` Phillip Wood
2021-07-05 9:58 ` Junio C Hamano
2021-07-05 12:09 ` Felipe Contreras
2021-07-05 13:54 ` Phillip Wood [this message]
2021-07-07 0:30 ` Felipe Contreras
2021-07-05 15:29 ` Phillip Wood
2021-07-05 16:50 ` Junio C Hamano
2021-07-05 19:23 ` Junio C Hamano
2021-07-05 19:48 ` Alex Henrie
2021-07-06 13:52 ` Phillip Wood
2021-07-06 14:43 ` Ævar Arnfjörð Bjarmason
2021-07-07 1:13 ` Felipe Contreras
2021-07-05 9:27 ` Ævar Arnfjörð Bjarmason
2021-07-05 12:00 ` Felipe Contreras
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=41852b7c-6ac7-3a3b-9f2d-6e537f52cd2a@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=alexhenrie24@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=newren@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
/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).