I have git repository with many, many (2000+) commits, for example:
l-- m -- n
/
a -- b -- c -- d -- e -- f -- g -- h -- i --
For those who get alot of merge conflicts (and broken results) with rebase --onto
I'd like recommend this script which uses git filter-branch
:
#!/bin/sh
cut_sha="$1"
branch="$2"
git filter-branch \
--parent-filter "sed -e 's/-p $cut_sha[0-9a-f]*//'" \
--prune-empty \
-- $branch
git for-each-ref --format='%(refname)' refs/original | \
while read ref
do
git update-ref -d "$ref"
done
git reflog expire --expire=0 --all
git repack -ad
git prune
Source: https://github.com/adrienthebo/git-tools/blob/master/git-truncate
Instructions:
git-truncate.sh
).master
).2c75a32
) AND ensure the commit has no branches in parallel!$ ./git-truncate.sh 2c75a32 master
.IMPORTANT: The SHA must be "part" of the branch and it must be the first commit you want to delete. Don't pass the first commit you want to keep (the new "beginning of repository" commit)!