Git cheat sheet
Tags: git, github, beginners, productivity
Published: 2020-11-02 09:39:15

Git has become a basic tool in the software development lifecycle. And now, in an age where it seems the world is moving to a remote approach, mastering this skill will be of great advantage to all software professionals, since it makes you a better team player and improves the lifecycle.

There are many blogs teaching Git. These are the ones that I highly recommend:

* [Atlassian](https://www.atlassian.com/git/tutorials/setting-up-a-repository)
* [Git for everyone](https://anotheruiguy.gitbooks.io/gitforeveryone/content/index.html)

Moreover, I want to share the most common commands that I use in my daily workflow. Note that all will be using the command line:


##Get the repo
```sh
# It works with https or ssh
$ git clone 'https://github.com/git/git.git'
```
##Change Origin
```sh
# Sometimes we need to change the repo to other owner or location, 
# in order to avoid it to be cloned again, we can just change the remote origin.
$ git remote add origin 'https://github.com/moby/moby.git'

# We can verify the new remote is set correctly
$ git remote -v
> origin  https://github.com/moby/moby.git (fetch)
> origin  https://github.com/moby/moby.git (push)
```
##Get the latest changes
```sh
# Get the latest changes in the remote repository with 'git pull'
# Remember that specifying the remote 'origin' and the branch name is always a good practice
$ git pull origin <branch-name>

# Use 'git fetch' to sync your local repository with the remote repository
# This only includes the metadata, new branches, tags, and tree history
$ git fetch 
```
##Create a new branch
```sh
# Move and create at the same time to a new branch
# Tip: Use git-flow branch naming convention: feature/*, hotfix/* and so on.
$ git checkout -b <branch-name>
```
##Add your changes
```sh
# Add changes to Stage
$ git add <file-name>

# Add ALL changes to Stage
$ git add .

# Commit changes to the local repository
$ git commit -m "Commit message"

# Add all and commit at the same time (Only to tracked files)
$ git commit -am "Commit message"

# Push commits to the remote repository
$ git push origin <branch-name>
```
##Fix commits
```sh
# Wrong commit message? No problem. Edit last commit message
$ git commit --amend -m "New commit message"

# Did you forget some changes and don't want a new commit?
# Add them to the last commit
# Warning: Try not to use it a lot 
$ git add .
$ git commit --amend --no-edit
```
##See commit history
```sh
# Print commit tree in a pretty way
$ git log --oneline --decorate --graph --all
```
##Save unfinished work
```sh
#Save all tracked files (Uncommitted)
$ git stash

#Save all tracked files with a message (Uncommitted)
$ git stash push -m "Great message"

# Include untracked and ignored files
$ git stash --all 

# List saved work
$ git stash list
> stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
> stash@{1}: On master: 9cc0589... Add git-stash

# Apply last saved work to the working directory
$ git stash pop

# Apply specific saved work to the working directory
$ git stash pop stash@{1}

# Clean stash
# Warning: Be sure you don't need anything else before running this command
$ git clear
```
##Clean up a local repository
```sh
# A lot of branches that do no longer exist in the remote repository?
# Delete them from the local repository...
$ git fetch -p
```
##Handling mistakes (Warning: use locally only)
```sh
# Unstage file
$ git reset HEAD -- <file-name>

# Unwanted changes now?, Sync with HEAD
$ git reset --hard HEAD

# Want to start over? undo n-last commits
$ git reset --hard HEAD~n
```
##My git aliases
```sh
# I'm using Windows, so, instead of use bash aliases I use the git config option
git config --global alias.co=checkout
git config --global alias.br=branch
git config --global alias.cm=commit
git config --global alias.st=status
git config --global alias.unstage=reset HEAD --
git config --global alias.last=log -1 HEAD
git config --global alias.po=pull origin
git config --global alias.ps=!git push origin $(git current)
git config --global alias.current=branch --show-current
git config --global alias.pu=push origin
git config --global alias.pl=!git pull origin $(git current)
```