Creating or cloning a Repository

git init Initializes a new Git repository in the current directory
git clone https://git[.]johnpili[.]com/path/to/repo.git Clones a repository using HTTPS protocol from a remote location
git clone ssh://git[.]johnpili[.]com/path/to/repo.git Clones a repository using SSH protocol from a remote location
git clone git://git[.]johnpili[.]com/path/to/repo.git Clones a repository using Git protocol from a remote location
git clone ~/handler Clones a local repository from the home directory’s handler folder
git clone –branch feature/query-loader https://git[.]johnpili[.]com/path/to/repo.git Clones a specific branch (feature/query-loader) from a remote repository

Staging Area

git status Shows the status of files in the working directory and staging area
git add main.go Adds the specific file ‘main.go’ to the staging area
git add . Adds all new and modified files in the current directory to the staging area
git add environment Adds the ’environment’ directory or file to the staging area
git rm main.go Removes ‘main.go’ from both the working directory and staging area
git mv config.xml environment Moves ‘config.xml’ to the ’environment’ directory and stages the change
git mv config.xml dev-config.xml Renames ‘config.xml’ to ‘dev-config.xml’ and stages the change
git reset Unstages all files, keeping the working directory unchanged
git reset main.go Unstages the specific file ‘main.go’, keeping the working directory unchanged
git diff config.xml Shows unstaged changes in ‘config.xml’ compared to the staging area

Commits: Creating Snapshots

git commit Opens default editor to write a commit message
and create a new commit
git commit -m “Initial commit” Creates a new commit with the specified message
without opening an editor
git commit -am “Message” Stages all modified tracked files and commits
them with the specified message
git commit –amend Modifies the last commit by adding staged changes
and/or editing the commit message
git tag -a v2025.1 ef5bb78 -m “Release version 2025.1” Creates an annotated tag for commit ef5bb78
with a specified message without editor
git tag Lists all tags in the repository

Commit Logs

git log Shows commit history with full commit messages
git log -3 Shows only the last 3 commits
git log –stat Shows commit history with files changed and number of modifications
git log –before=“2025-01-21” Shows commits made before January 21, 2025.
The Date formats in and are flexible (e.g., “2025-01-21”, “3 days ago”, “yesterday”)
git log –after=“2025-01-15” Shows commits made after January 15, 2025
git log -p main.go Shows commit history with patches (changes) for main.go file
git log –grep “Camunda” Shows commits whose message contains the word “Camunda”.
--grep is case-sensitive by default; use -i flag for case-insensitive search
git diff ef5bb78 ab0c0df Shows differences between two specific commits
git show ab0c0df Shows details of a specific commit (changes, message, author, etc.)
git show ab0c0df main.go Shows changes made to main.go file in the specific commit

Branching

git branch Lists all local branches (* marks current branch)
git branch feature/user-login Creates a new branch named ‘feature/user-login’ at current position
git checkout feature/query-loader Switches to existing branch ‘feature/query-loader’
git checkout -b feature/query-loader Creates and switches to new branch ‘feature/query-loader’
git switch -c feature/query-loader A modern alternative to git checkout.
Creates and switches to new branch ‘feature/query-loader’
git branch -m feature/backdoor Renames current branch to ‘feature/backdoor’
git merge develop Merges ‘develop’ branch into current branch
git branch -d feature/backdoor Deletes branch ‘feature/backdoor’ (if fully merged)
git branch -D feature/backdoor Forces deletion of branch ‘feature/backdoor’ (even if not merged)
git diff feature/query-loader develop Shows differences between ‘feature/query-loader’ and ‘develop’ branches
git diff feature/query-loader main.go Shows changes to main.go file in ‘feature/query-loader’ vs current branch
git branch –merged Lists branches merged into current branch
git branch –no-merged Lists branches not yet merged
git branch -v Shows last commit on each branch
git branch -r Lists remote branches
git branch -a Lists all branches (local and remote)
git log –graph –all Shows commit history of all branches with ASCII graph visualization
git log –graph –all –oneline A compact visualization of --graph

Rebase

git rebase develop Reapplies your current branch’s commits on top of the develop branch
git rebase –abort Cancels an in-progress rebase and returns to the state before rebase started
git rebase –continue Continues the rebase process after resolving conflicts
git rebase -i Opens interactive rebase mode, allowing you to modify, reorder, or squash commits

Important: Rebasing rewrites commit history, so it should generally be avoided on commits that have been pushed to shared repositories unless you’re absolutely sure about the implications.

Stashing

git stash Temporarily saves tracked, modified files and resets working directory
git stash save “Workflow sample” Creates a stash with a descriptive message for easier identification
git stash branch feature/workflow Creates a new branch from stash and switches to it
git stash -u Stashes both tracked and untracked files
git stash –all Stashes everything, including tracked, untracked, and ignored files
git stash list To show list of all stashes
git stash show Shows the changes stored in the most recent stash
git stash apply Applies the most recent stash but keeps it in the stash list
git stash pop Applies the most recent stash and removes it from the stash list
git stash drop Removes the most recent stash without applying it
git stash clear Removes all stashes from the stash list
git stash show stash@{1} Shows changes in the second most recent stash
git stash apply stash@{2} Applies the third stash in the list
git stash drop stash@{0} Removes the most recent stash (index 0)

Common stash workflows

  1. Quick branch switch:
git stash
git checkout other-branch
git stash pop  # when returning
  1. Creating a feature branch from stashed work:
git stash
git stash branch feature/new-work

Undoing changes

git checkout HEAD main.go Restores main.go file to its state in the latest commit (discards local changes)
git reset –hard HEAD~1 Moves branch pointer back one commit AND changes working directory and staging
git reset HEAD~1 Moves branch pointer back one commit but preserves working directory changes
git reset –hard ab0c0df Resets to specific commit AND changes working directory and staging
git reset ab0c0df Resets to specific commit but preserves working directory changes
git revert ab0c0df Creates new commit that undoes changes from the specified commit

Important notes:

  • Prefer revert over reset on shared branches
  • Use git reflog to recover from accidental resets
  • --hard operations cannot be undone

Remote Repositories

git remote add origin ssh://git.johnpili.com/path/to/repo.git Adds a new remote named ‘origin’ pointing to the specified repository URL
git remote -v Lists all remote repositories and their URLs
git fetch origin Downloads all branches and history from origin remote
git merge origin develop Merges the remote ‘develop’ branch into current local branch
git pull origin develop Combines fetch and merge - gets and merges remote develop branch
git push origin develop Uploads local develop branch commits to remote repository

References

  • Linux Magazine. “Git Cheat Sheet,” Issue #52, p.26, 2024.