I think the best way to acchive this is by creating an orphan branch from 2 and then doing a rebase, this way:
git checkout 2
git checkout --orphan newmaster # creates a new orphan branch with no parents
git commit -C 2 # commits all the contents from 2 using same commit message of 2
git rebase --onto HEAD 2 master # rebase all contents from master to this new branch
git push -f origin master:refs/heads/master # push the new master branch
Note we are using -f (force) on the last command, this should be an exception, no the rule and all of this should be done on a "freezed" repo, commit 1 will be unreachable now and any blob or content associated to that commit will be removed by git gc if there is no other references remaining (you can run git gc by hand, or it runs automatically depending on the setup of your git server)
Another option: using git-filter-branch
If your problem are heavy files taking too much repository space, you don't need to rewrite the history to delete these files from repostory, git-filter-branch is the tool designed for this kind of situations, this is a basic example:
git filter-branch --tree-filter 'rm path/to/heavyfile; true'
It reconstruct all the history of current branch (e.g. master branch), but, execute your bash command for each commit, removing /path/to/heavyfile for all commits on this case. Of course you can improve the script, for example, removing entire directories, renaming files or even calling your own external commands
The best thing of this, is that this action can be easily undone in case you made some mistake, undo a filter-branch is as easy as:
git reset --hard HEAD@{1}
More on git-filter-branch: http://git-scm.com/docs/git-filter-branch
More on rewriting history with git: http://git-scm.com/book/en/Git-Tools-Rewriting-History