Partial Checkout of a repo
If you have to work on a big repo and don’t want to clone the entire repo on your machine, you could checkout only part of the repo using sparse checkout option.
This allows you to choose only folders you want to work on within the repo.
- Create the directory name same as your repo name
mkdir mybigrepo && cd mybigrepo
2. Fetch git info on the repo
git remote add -f origin https://github.com/mygituser/mybigrepo.git
3. Specify directories within repo that you want to get
git config core.sparseCheckout true
echo "builds" >> .git/info/sparse-checkout
echo "products/myproduct1" >> .git/info/sparse-checkout
4. Pull the directories specified
git pull origin master
This should get you the directories you want.
5. If at a later stage you decide you want additional folders, update your sparse-checkout file
echo "products/myproduct2" >> .git/info/sparse-checkout
git read-tree -mu HEAD
git pull origin master
Squash commits and amend commit messages
I always like to commit as often as I can, so I don’t lose any changes. But I don’t always want my commits to go in separately. Rebase allows us to reapply commits. To squash a bunch of commits into one we can use git interactive option. The interactive command allows us to change the commits within an editor.
The interactive option opens the default editor. You can change this and set it to use your favorite editor. Mine happens to be emacs.
git config --global core.editor emacs
If I want to squash my last 4 commits into one commit, I start with entering the rebase command.
git rebase -i HEAD~4
This is what the opened file looks like
pick 6f7623f7 remove legacy files (#21)
pick 14366fc3 added recent builds
pick f4fa9525 fixed issue with refresh
pick d3ba2c02 updated version info
Rebase 4b4ecd33..d3ba2c02 onto 4b4ecd33 (4 commands)
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
# Note that empty commits are commented out
To squash my commits I change the first four lines to what I want to do. In this case, I will squash the last three commits.
pick 6f7623f7 remove legacy files (#21)
pick 14366fc3 added recent builds
s f4fa9525 fixed issue with refresh
s d3ba2c02 updated version info
When I save this file it will take me to the editor again to verify my edit message. In my case it will be the commit I chose to keep and squash into.
added recent builds
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# ...
I usually change the commit message to a more descriptive message that covers all the three commits and save.
Once this is done we push with the force option(–force or -f). That will force the change in the history of the repo.
git push -f
The branch history will now show only the last commit (14366fc3) and if there was any before that.
To simply amend a commit message you can use
git commit --amend
This will similarly open up in an editor and allow you to change the message. You have to push force once done.
It is fine to leave multiple commits if they cover different functionality changes. We can always squash them later when merging into master as well.