From: Dominique Quatravaux <domq@google.com>
To: git@vger.kernel.org
Subject: git rebase and merge commits
Date: Wed, 20 Oct 2010 18:45:45 +0200 [thread overview]
Message-ID: <AANLkTikroNPehcyBsueCnJ5hR0idd3cBP4m1KNccdRqL@mail.gmail.com> (raw)
Hi all, I'm trying to write "git shove", a wrapper around git rebase
--interactive that would turn this
# A---B---C---K targetbranch
# / \
# D---E---F---G---H---I--J srcbranch
into this:
# A---B---C---I'---K' targetbranch
# / \
# D---E---F---G---H'---J' srcbranch
#
(ie I has been shoved into targetbranch).
It seemed to me that the first step should be to simply rebase I, H, and J (in
this order) onto C. Unfortunately git rebase --interactive -p C proposes a
git-rebase-todo that contains only "noop"; if I forcefully put this instead,
edit iiii I
edit hhhh H
edit jjjj J
it seems to me that the HEAD jumps backward to the original H on the second
rebase step, instead of daisy-chaining H behind I. This is with git 1.7.3.1.
Here are the outputs of git log --graph --pretty=oneline --abbrev-commit at each
rebase step:
1/3
* a810395 I
* 1cfccc7 H
|\
| * c477d4e C
| * 7002290 B
| * aa9f1d0 A
* | b614d31 G
* | 2ad4496 F
|/
* 0d512e9 E
* b6cbc2b D
2/3
* 1cfccc7 H
|\
| * c477d4e C
| * 7002290 B
| * aa9f1d0 A
* | b614d31 G
* | 2ad4496 F
|/
* 0d512e9 E
* b6cbc2b D
3/3
* 3a41a45 J
* a810395 I
* 1cfccc7 H
|\
| * c477d4e C
| * 7002290 B
| * aa9f1d0 A
* | b614d31 G
* | 2ad4496 F
|/
* 0d512e9 E
* b6cbc2b D
Is there a way to do a real rebase of a merge commit?
FWIW, here is the script I use to create my toy environment in the current
directory:
function _make_commit() {
echo "$1" > "$1"
git add "$1"
git commit -a -m "$1"
git tag "$1" HEAD
}
function _prepare_merged_history() {
git init
_make_commit "D"
git checkout -b targetbranch
_make_commit "E"
_make_commit "A"
_make_commit "B"
_make_commit "C"
_make_commit "K"
git checkout E
git checkout -b srcbranch
_make_commit "F"
_make_commit "G"
git merge -m "H" C
git tag H HEAD
_make_commit "I"
_make_commit "J"
}
function _git_rebase_todo_line() {
echo -n "pick "
git rev-list -n 1 --pretty=oneline --abbrev-commit --abbrev=7 "$1"
}
function _make_git_rebase_todo() {
{
_git_rebase_todo_line refs/tags/I
_git_rebase_todo_line refs/tags/H
_git_rebase_todo_line refs/tags/J
} > git-rebase-todo
}
[ -d ".git" ] && exit
_prepare_merged_history
_make_git_rebase_todo
Thanks in advance,
--
Dominique Quatravaux
+41 79 609 40 72
next reply other threads:[~2010-10-20 16:46 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-20 16:45 Dominique Quatravaux [this message]
2010-10-20 17:32 ` git rebase and merge commits Jonathan Nieder
2010-10-20 17:44 ` Joshua Jensen
2010-10-20 18:12 ` Joshua Jensen
2010-10-25 11:23 ` Dominique Quatravaux
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=AANLkTikroNPehcyBsueCnJ5hR0idd3cBP4m1KNccdRqL@mail.gmail.com \
--to=domq@google.com \
--cc=git@vger.kernel.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).