Export Changes Between Two Git Commits In SourceTree
I should start off by saying how much I love TortoiseGit and it has always been the reliable source control medium, even though it's a bit of a nightmare to set up initially to work alongside Bitbucket. But due to a new development environment for an external project, I am kinda forced to use preinstalled Git programs:
- Git Bash
I am more inclined to use a GUI when interacting with my repositories and use the command line when necessary.
One thing that has been missing from SourceTree ever since it was released, is the ability to export changes over multiple commits. I was hoping after many years this feature would be incorporated. Alas, no. After Googling around, I came across a StackOverflow post that showed the only way to export changes in Sourcetree based on multiple commits is by using a combination of the git archive and git diff commands:
git archive --output=archived_changes.zip HEAD $(git diff --diff-filter=ACMRTUXB --name-only hash1 hash2)
This can be run directly using the Terminal window for a repository in Sourcetree. The "hash1" and "hash2" values are the long 40 character length commit ID's.
The StackOverflow post has helped me in what I needed to achieve and as a learning process, I want to take things a step further in my post to understand what the archive command is actually doing for my own learning. So let's dissect the command into manageable chunks.
git archive --output=archived_changes.zip HEAD
This creates the archive of the whole repository into a zip file. We can take things further in the next section to select the commits we need.
git diff --diff-filter=ACMRTUXB
The git diff command shows changes in between commits. The filter option gives us more flexibility to select the files that are:
Thave their type (mode) changed
Bhave had their pairing Broken
--name-only hash1 hash2
The second part of the git diff command uses the "name-only" option that just shows which files have changed over multiple commits based on the hash values entered.
The git diff command needs to be wrapped around parentheses to act as a parameter for the git archive command.