Re: How to split a big commit
- From
Ramkumar Ramachandra <artagnon@gmail.com>
- Date
- Apr 4, 2011, 13:00 UTC
- Message-ID
- <20110404130016.GA16975@kytes>
- In-Reply-To
- <BANLkTikFXzut7fY5Tr0u-abu5Q0rMUOCmA@mail.gmail.com>
Hi Nguyen,
Nguyen Thai Ngoc Duy writes:
Show 6 quoted lines
> 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