I am currently working on a project with multiple others. The problem is that we created a fork of an existed project and need to squash all our commits from after the forking process to a single commit for a pull-request on Bitbucket.
Is there any way (preferably using SourceTree, otherwise terminal) to squash already pushed commits to a single commit, such that the history within Bitbucket of all the commits are also only that one commit plus the commits which were already there before we forked the project?
Take as example just a simple project with a few files in only a master
branch.
Found a nice summary of the posted answers. This one is a bit more clear: squash pushed commits. It will require creating a second branch upon the creation of the fork. This second branch can have as many pushes to the remote server as needed.
Create a new personal branch that will be squashed.
# Start with the existing personal branch that contains all of your commits.
$ git checkout {ExistingBranchName}
# Create a new personal branch that will be squashed.
$ git checkout -b {BranchName}
Identify the first commit where your personal branch diverged from an existing CEF branch.
# Replace {BranchName} with your new branch name.
# Replace "master" with a different CEF branch as appropriate
# (e.g. "2272", "2171", etc).
$ git merge-base {BranchName} master
Start an interactive rebase using the commit hash returned from step 2.
$ git rebase --interactive {hash}
This will launch a text editor with a list of all commits in your personal branch. It should look something like this:
pick 59d2a23 Initial implementation
pick 752ae4c Add more features
pick cd302a3 Fix something
pick 5410de3 Fix something else
Change all but the first line to say squash
instead of pick
. The contents should now look like this:
pick 59d2a23 Initial implementation
squash 752ae4c Add more features
squash cd302a3 Fix something
squash 5410de3 Fix something else
Save the changes and close the file (Can be done by pressing esc
and type: :wq
.
A new file will now open containing the commit messages from all of the commits. Reword the commit message then save the changes and close the file.
Push the modifications to your personal remote repository.
# If the branch has already been pushed to the remote repository
# you will need to add the `--force` argument.
git push origin {BranchName}
# or git push origin {BranchName} --force