Git is the most popular distributed version-control system for tracking changes in source code during software development, and this is a simple collection of git commands that I have been using for the most of time.
Checking the basic configurations
I have been working on multiple git servers, so I have to ensure my user.name
and user.email
that I used are correct.
# Check user.name & user.email
git config --global --list #global
git config --list #local
# Update user.name & user.email
git config --global user.name "Heiswayi Nrird"
git config --global user.email "[email protected]"
#or on the current repository settings
git config user.name "Heiswayi Nrird"
git config user.email "[email protected]"
Creating and getting projects
# Initialize a local git repository at the current directory
git init
# Create a local copy of a remote repository in the current directory
git clone <GIT_REPO_URL>
The most common workflows - commit the changes
# Check for changes between local and remote
# and also show which branch I'm working on
git status
# Get everything ready to commit
git add . #add all new and changed files to staging
git add <FILENAME> #or add specific file to staging
# Commit the changes
git commit #used for writing long commit messages
git commit -m "<COMMIT_MESSAGE>" #or using a simple commit message
git commit -am "<COMMIT_MESSAGE>" #add all changed files and commit, except the new files
# Push the changes into the remote repository
git push
Branching
# Show branches
git branch #list local branches
git branch -a #or list all branches (local + remote)
# Switch working branch
git checkout <BRANCH_NAME>
# or create new branch and checkout the branch
git checkout -b <NEW_BRANCH_NAME> <BASE_BRANCH_NAME>
# Create new branch from base branch
git branch <NEW_BRANCH_NAME>
# Rename/move a branch
git branch -m <OLD_BRANCH_NAME> <NEW_BRANCH_NAME>
# update the branch on the remote repository
git push origin :<OLD_BRANCH_NAME> <NEW_BRANCH_NAME>
# Push local branch to remote repository
git push -u origin <NEW_BRANCH_NAME>
# Delete local branch
git branch -d <BRANCH_NAME>
git branch -D <BRANCH_NAME> #or with force deletion without checking merged status
# Delete remote branch
git push -d origin <BRANCH_NAME>
# Compare branches
git diff <FIRST_BRANCH_NAME>..<SECOND_BRANCH_NAME>
Merging
Before merging, switch to the target branch first: git checkout <TARGET_BRANCH_NAME>
# Merge into <TARGET_BRANCH_NAME>
git merge --no-ff <SOURCE_BRANCH_NAME> #always generate a merge commit
# Merge only from a specific commit
git cherry-pick <COMMIT_ID>
# Stop merging (in case of conflicts)
git merge --abort
Stashing your work
# Review the changes
git status
# Saving changes
git stash #only tracked files
git stash -u #include the untracked files
git stash -a #all including ignored files
# good practice to annotate the stashes
git stash save "<STASH_DESCRIPTION>"
# Get the saved changes, remove them from the stash and re-apply
git stash pop
# getting specific stash based on last argument (default stash@{0})
git stash pop stash@{2} #e.g. stash@{2}
# List the stashes
git stash list
# Delete the stashes
git stash drop stash@{1} #specific stash
git stash clear #delete all
Tagging
# Create a new release tag
git tag -a <VERSION_TAG> -m "<DESCRIPTION>"
# or create a tag at specific commit
git tag -a <VERSION_TAG> <COMMIT_ID>
# List all tags
git tag
# Pushing a tag to remote
git push origin <VERSION_TAG>
# Checkout a specific tag
git checkout <VERSION_TAG>
# Delete a specific tag
git tag -d <VERSION_TAG>
Reset
# Revert the existing commit
git revert <COMMIT_ID>
# Undo commit with both staging and working directory changed to match the repo
git reset --hard <COMMIT_ID> #on specific commit
git reset --hard HEAD~ #or on the latest commit
# Delete untracked files and directories (not staging)
git clean -fd
# Change most recent commit message
git commit --amend #using text editor to write commit message
git commit --amend -m "<NEW_MESSAGE>" #or with simple message
# Remove file/directory
git rm -rf <FILENAME|DIRECTORY> #apply to local and git
git rm -rf --cached <FILENAME|DIRECTORY> #or only apply to git
Getting the latest changes
Case 1: Don’t care about local changes
# Get latest code and reset the code
git fetch origin
git reset --hard origin/<TARGET_BRANCH_NAME>
# Delete the git folder and clone again
git rm -rf <PROJECT_FOLDER>
git clone <GIT_REPO_URL>
Case 2: Care about local changes
Recommended to use the command with a clean working copy. If you have any uncommitted local changes you want to retain, before using the command, you should stash (git stash
) your works first.
# Get latest code and integrate
git pull
Inspection and comparison
# View changes
git log --pretty=oneline
git log --graph --oneline --decorate #with graph
git log --pretty=format:"%cn committed %h on %cd" #formatted
# example output: Heiswayi Nrird committed f063fe9 on Sat Nov 16 13:40:35 2019 +0800
# Comparing 2 different commit IDs
git diff <COMMIT_ID_1> <COMMIT_ID_2>
# Comparing 2 branches
git diff <BRANCH_NAME_1>..<BRANCH_NAME_2>
Click here for more details on --pretty=format:"<STRING>"
.