I think for right now the git squash and rebase sounds like something that could be beneficial in keeping the commits from bloating out of control. When working on a larger codebase, with a lot of developer working in tandem, I think git log will be helpful in allowing me to understand the changes that have occurred while working on a branch.
From my understanding merging would be like shuffling a deck of cards by combining them in order chronologically, where as rebase would be taking a slice of cards(commits) and putting them atop the rest of the deck(master).
Git stash is useful when you are working on changes on a feature branch and need to switch over to another branch before deciding to commit them. This helps to reduce unneccessary commits before the work is finished, helps to catch you if you accidentally work on a branch you weren't intending to, or taking changes from one branch and applying them onto another.
Git reset will restore a branch to its last commit. You could also indicate a specific commit that you wish to rollback/reset to.
Git reset --soft would allow you to undo your changes, but if you so desired you could restore them. Git reset --hard is permanently erasing the changes.