All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ramkumar Ramachandra <artagnon@gmail.com>
To: Nguyen Thai Ngoc Duy <pclouds@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: How to split a big commit
Date: Mon, 4 Apr 2011 18:30:20 +0530	[thread overview]
Message-ID: <20110404130016.GA16975@kytes> (raw)
In-Reply-To: <BANLkTikFXzut7fY5Tr0u-abu5Q0rMUOCmA@mail.gmail.com>

Hi Nguyen,

Nguyen Thai Ngoc Duy writes:
> After a lot of small commits and a few mixed up large commits, it was
> too messy that I merged them all into one big commit then started
> spliting it into smaller, reasonable patches. Just wonder if anybody
> else faces the same thing and how they deal with it. I used "git reset
> --soft <big commit>^" and "git add -N" because there were new files,
> but it was clumsy.

To split a big commit, I simply reverse-diff-apply the changes that I
don't want in the big commit, and I stage all changes.  Then, I again
reverse-diff-apply all the staged changes, and keep that in the
unstaged portion.  Your repository should look like this now:

commit bigcommit
diff --git a/bigfile b/bigfile
+Desirable change
+Undesirable change

Staged changes:
diff --git a/bigfile b/bigfile
-Undesirable change

Unstaged changes:
diff --git a/bigfile b/bigfile
+Undesirable change

Now simply 'commit --amend' to remove the undesirable change from the
bigcommit, and commit the unstaged changes to produce a new
commit. Final result:

commit bigcommit
diff --git a/bigfile b/bigfile
+Desirable change

commit newcommit
diff --git a/bigfile b/bigfile
+Undesirable change

I can afford to do this kind of jugglery very easily because I use
Magit with Emacs.  After highlighting the relevant portions,
reverse-diff-apply is one keystroke :) But yes, you're probably right-
there should be an easier way to do this.  Maybe a 'git split' that
allows you to interactively select the portions of an existing commit
that you'd like to exclude from the commit and turn into a new commit?

Hope that helps.

-- Ram

  reply	other threads:[~2011-04-04 13:01 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-04-04 11:52 How to split a big commit Nguyen Thai Ngoc Duy
2011-04-04 13:00 ` Ramkumar Ramachandra [this message]
2011-04-04 14:25   ` Nguyen Thai Ngoc Duy
2011-04-05  0:08 ` Jonathan Nieder
2011-04-05  2:31   ` Lasse Makholm
2011-04-05  2:52   ` Nguyen Thai Ngoc Duy

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=20110404130016.GA16975@kytes \
    --to=artagnon@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=pclouds@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.