From: Junio C Hamano <gitster@pobox.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: Could this be done simpler?
Date: Wed, 24 Jun 2009 18:04:51 -0700 [thread overview]
Message-ID: <7veit9m8cs.fsf@alter.siamese.dyndns.org> (raw)
In-Reply-To: <alpine.LFD.2.01.0906241426120.3154@localhost.localdomain> (Linus Torvalds's message of "Wed\, 24 Jun 2009 14\:35\:13 -0700 \(PDT\)")
Linus Torvalds <torvalds@linux-foundation.org> writes:
> Ok, so I have a practice of occasionally doing octopus merges when I have
> two branches with trivial fixes from the same person.
>
> That all works fine when they use the "multiple branches in the same
> repository" approach (eg x86 "tip" tree), but other people tend to prefer
> to use multiple repositories for different features, rather than branches.
> And git generally lets you do things either way with no real difference.
>
> But for the octopus case, it does make a difference. You can easily make
> octopus merges only from one repository.
>
> Which is kind of sad.
>
> So I did kernel commit c6223048259006759237d826219f0fa4f312fb47 by
> basically doing the 'git pull" logic by hand, and while this was just a
> trial and maybe I'll never feel the urge to do it again, I'm wondering it
> maybe we should make it easier to do.
Every once in a while I have this urge to see how it feels to be Linus
by pretending to be him, trying what he did.
(1) So where is he?
$ git pull
...
From git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
f234012..28d0325 master -> linus
* [new tag] v2.6.31-rc1 -> v2.6.31-rc1
Updating f234012..28d0325
Fast forward
...
(2) Let's pretend to be Linus, just before he made this merge.
$ git checkout c62230^
(3) Let's see what he did with that thing.
$ git show c62230
commit c6223048259006759237d826219f0fa4f312fb47
Merge: bd453cd d5bb68a 3a6a6c1
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date: Wed Jun 24 14:17:14 2009 -0700
Merge branches 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/{vfs-2.6,audit-current}
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
another race fix in jfs_check_acl()
Get "no acls for this inode" right, fix shmem breakage
inline functions left without protection of ifdef (acl)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current:
audit: inode watches depend on CONFIG_AUDIT not CONFIG_AUDIT_SYSCALL
Ah, so we know the two repositories and branches involved.
(4) Let's pretend to be Linus. Fetch the first branch and drop the
necessary information in FETCH_HEAD.
$ git fetch \
git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 \
for-linus
(5) Continue pretending to be Linus, complete the octopus. The key is to
let the "fetch" phase of this to append to the FETCH_HEAD, not
replacing it.
$ git pull --append \
git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current \
for-linus
(6) Did I succeed? Let's see.
$ git diff c62230
Yay, identical tree.
(7) How does the log message look?
$ git show
commit cb1e4198421091ea5844d93624d5d5499537dbe0
Merge: bd453cd d5bb68a 3a6a6c1
Author: Junio C Hamano <gitster@pobox.com>
Date: Wed Jun 24 17:45:09 2009 -0700
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6; branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current into HEAD
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
another race fix in jfs_check_acl()
Get "no acls for this inode" right, fix shmem breakage
inline functions left without protection of ifdef (acl)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current:
audit: inode watches depend on CONFIG_AUDIT not CONFIG_AUDIT_SYSCALL
Hmm, Linus's combined notation on the summary line that uses {} is
much nicer.
> Right now the "git pull" syntax is
>
> git pull <repo> <branch>*
>
> and you cannot specify multiple repositories, only multiple branches.
>
> But at the same time, it should be pretty unambiguous whether an argument
> is a repository or a branch (':' in a remote repository, or "/" or ".." at
> the beginning of a local one - all invalid in branch names).
>
> So it _should_ be syntactically unambiguous to allow
>
> git pull (<repo> <branch>*)+
>
> for the octopus case. Hmm?
Strictly speaking, you are not quite correct. Arguments after <repo> can
be storing refspecs and they do come with colon.
Conclusion. git-fmt-merge-msg may need to learn the trick of using {}.
No other changes needed.
Side note.
People sometimes say, and I am certain I agreed to them on more than one
occasions, that Octopus hurt bisectability and does not have much value in
real life. I've always thought this bisectability issue was a downside of
Octopus merges, but now I think about it, perhaps "git bisect" can be
taught to dynamically decompose an Octopus merges into a sequence of
two-head virtual merges while bisecting. We strongly discourage and do
not allow conflicting Octopus merges, so when you need to bisect a history
with an Octopus that looks like this:
---o---A
\
---o---B---M---o
/
---o---C
it should be able to mechanically decompose it, without conflicts, into
---o---A
\
---o---B---M1--M2--o
/
---o---C
where the tree of M and the tree of M2 are identical.
next prev parent reply other threads:[~2009-06-25 1:05 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-24 21:35 Could this be done simpler? Linus Torvalds
2009-06-25 1:04 ` Junio C Hamano [this message]
2009-06-25 14:33 ` Randal L. Schwartz
2009-06-25 16:32 ` Matthias Andree
2009-06-25 17:25 ` Junio C Hamano
2009-06-25 21:54 ` Matthias Andree
2009-06-27 0:26 ` Junio C Hamano
2009-06-25 18:32 ` Junio C Hamano
2009-06-25 17:19 ` Michael J Gruber
2009-06-25 22:02 ` Christian Couder
2009-06-25 22:23 ` Christian Couder
2009-06-25 22:29 ` Junio C Hamano
2009-06-25 22:50 ` Linus Torvalds
2009-06-25 23:17 ` Junio C Hamano
2009-06-25 22:55 ` Christian Couder
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=7veit9m8cs.fsf@alter.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=torvalds@linux-foundation.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).