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
- Quick branch switch:
git stash
git checkout other-branch
git stash pop # when returning
- 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
overreset
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.