Опция --squash
для git merge
может быть полезна и доступна в git 1.4.1 и новее.Это ставит эффекты слияния, но не создает коммит.Таким образом, если 143eff
является самым старым коммитом, который вы хотите включить в сдавленный коммит, текущая ветвь будет master
, а коммит "один месяц назад" - dcb7e5
, вы можете сделать:
# Save the old position of "master" by creating a branch old-master:
$ git checkout master
$ git branch old-master
# Create and checkout a branch called "new-master" that's at the old commit:
$ git checkout -b new-master 143eff
# Stage the effects of merging the "one month ago" commit:
$ git merge --squash dcb7e5
Updating 143eff3..dcb7e5b
Fast-forward
Squash commit -- not updating HEAD
[... status output showing the staged changes ..]
# Create the squashed commit:
$ git commit -m "A commit squashing history up to a month ago"
# (You could use --amend if you want them to be squashed into 143eff
# instead of being a commit after that.)
Теперь вы можете проверить с помощью git diff dcb7e5 new-master
, что они действительно одинаковы.
Далее, вы хотите перенести остальную часть вашей работы на нового мастера:
$ git rebase --onto new-master dcb7e5 master
Это будетоставьте вас на перебазированном master
, в котором должна быть нужная вам история.(Опять же, вы можете проверить это с помощью git diff old-master master
и git log
. При перемещении мастера на github вам нужно будет добавить --force
, так как вы переписали историю:
# Push master to github, with "--force", since you've rewritten history:
$ git push --force origin master
Теперь вы можете удалить new-master
, который находится в коммите сквоша, с:
git branch -d new-master
Очевидно, github запускает git gc --auto
на толчках, так что вы скоро увидите немного экономии места ...