https://github.com/shinbatsu/git-tips
Some useful info about working with git
https://github.com/shinbatsu/git-tips
basics git guide tips-and-tricks
Last synced: 5 months ago
JSON representation
Some useful info about working with git
- Host: GitHub
- URL: https://github.com/shinbatsu/git-tips
- Owner: Shinbatsu
- License: mit
- Created: 2021-11-28T13:18:39.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2025-07-19T15:33:57.000Z (6 months ago)
- Last Synced: 2025-07-20T14:42:24.115Z (6 months ago)
- Topics: basics, git, guide, tips-and-tricks
- Language: Shell
- Homepage: https://git-scm.com
- Size: 179 KB
- Stars: 8
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Useful Git Stuff

A compact guide to mastering Git through essential commands, common pitfalls, time-saving shortcuts, expert tips, workflow patterns, and interview preparation.
1. [Most Used Commands](#most-used-commands)
2. [Popular Issues](#common-issues-and-fixes)
3. [Well Known Hotkeys](#essential-hotkeys)
4. [Some Tips and Tricks](#tips-and-tricks)
5. [Interview Questions](#interview-questions)
6. [Trunc Based Guide FSM](#trunk-based-workflow-fsm-guide)
7. [Commit Convention](#commit-convention)
> [!NOTE]
> It's really that simple — it covers everything you need to know about Git!
## Most Used Commands
These Git commands follow the typical development workflow—from starting a project to sharing changes. Learning them covers most daily Git usage and boosts your productivity. Ordered by typical workflow.
### 1. `git init`
Initializes a new Git repo in the current directory.
```bash
git init
```
### 2. `git clone`
Copies an existing remote repo to your local machine.
```bash
git clone
```
### 3. `git status`
Shows the current state of your workdir.
```bash
git status
```
### 4. `git add`
Stages changes, telling Git which files to include in the next commit.
```bash
git add # Add a specific file
git add . # Add all changes
git add -A # Add all changes, including deletions
```
### 5. `git diff`
Shows the difference files.
```bash
git diff # Compare working directory to staging
git diff --staged # Compare staging to last commit
git diff # Compare files
```
### 6. `git commit`
Creates a snapshot of the staged changes with a descriptive message.
```bash
git commit -m "Commit Header" -m "Commit body"
```
### 7. `git log`
Displays the history of commits in the current branch.
```bash
git log
```
### 8. `git branch`
Lists, creates, or deletes local branches.
```bash
git branch -a # List branches
git branch # Create a new branch
git branch -d # Delete a branch
```
### 9. `git checkout`
Switches to another branch or restores file changes.
```bash
git checkout # Switch to a branch(creates if not exists)
git checkout -b # Create and switch to a new branch
git checkout -- # Discard local changes
```
### 10. `git merge`
Merge selected branch(its files) into current(`git branch`).
```bash
git merge
```
### 11. `git pull`
Fetches the latest changes from the remote and merges them into current branch.
```bash
git pull
```
### 12. `git push`
Sends local branch changes to the remote repo.
```bash
git push origin
```
## Common Issues and Fixes
Mistakes happens, so this section covers common problems and best solutions for each case.
### 1. Wrong User Name or Email
**Issue:** Commits are showing the wrong author name/email.
```bash
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
```
If it's a local repo-specific setting:
```bash
git config user.name "Your Name"
git config user.email "you@example.com"
```
### 2. Forgot to Add some Files into Commit
**Issue:** Commit created, but some changes weren’t added.
```bash
git add . # add more changes
git commit --amend --no-edit
```
### 3. Committed to the Wrong Branch
**Issue:** You made changes on `main` instead of a feature branch.
```bash
git checkout -b feature-branch
# or if the branch already exists
# git checkout feature-branch
git cherry-pick
```
### 4. Merge Conflicts
**Issue:** Conflicts when merging branches.
Git will highlight conflicts in the files. Manually edit them(Some IDEs may help a lot), then:
```bash
git add
git commit
```
Use tools like `git mergetool` for assistance.
### 5. Accidentally Deleted a File
**Issue:** Deleted a file you didn’t mean to.
```bash
git checkout HEAD --
```
### 6. Overwritten Local Changes with Pull
**Issue:** You pulled changes and lost your uncommitted local changes.
If not staged:
```bash
git fsck --lost-found
```
For safety, stash changes before pulling:
```bash
git stash
```
### 7. Large File Accidentally Committed
**Issue:** Accidentally added a large file to Git history.
Use `BFG Repo-Cleaner` or `git filter-branch`.
### 8. Need to Undo Last Commit
**Issue:** Last commit has a mistake.
```bash
git reset --soft HEAD~1 # Keeps changes
```
To discard the commit and changes:
```bash
git reset --hard HEAD~1
```
### 9. Forgot to Switch Branch Before Work
**Issue:** You made changes on the wrong branch.
```bash
git stash
git checkout correct-branch
git stash pop
```
### 10. Lost Commits After Rebase
**Issue:** Commits disappeared after a rebase.
```bash
git reflog
# Find the commit and recover:
git checkout
```
### 11. Differences in Line Endings (Windows vs Linux)
**Issue:** Files keep showing as changed due to line endings.
Add `.gitattributes` with following line:
```
* text=auto
```
Or set config:
```bash
git config --global core.autocrlf true # Windows
git config --global core.autocrlf input # Linux
```
### 12. Accidentally Stashed and Lost Work
**Issue:** You ran `git stash` and now your changes are gone.
```bash
git stash list
git stash pop stash@{0} # or use apply to keep stash
git stash apply stash@{0}
```
### 13. Need to Revert a Pushed Commit
**Issue:** A bad commit has already been pushed.
```bash
git revert
```
Creates a new commit that undoes the bad one.
### 14. Too Many Small Commits
**Issue:** You want to combine multiple commits into one.
```bash
git rebase -i HEAD~ # where amount of commits
```
### 15. Push Rejected Due to Out-of-Date Branch
**Issue:** Remote has changes you don't.
```bash
git pull --rebase
git push
```
### 16. Need to Rename a Branch
**Issue:** The branch name is incorrect.
```bash
git branch -m new-name
git push origin :old-name new-name
```
### 17. Working on Wrong Base Branch
**Issue:** Your feature branch was created from the wrong base.
```bash
git rebase --onto correct-base wrong-base feature-branch
```
### 18. Deleted a Branch by Mistake
**Issue:** You deleted a local or remote branch accidentally.
**Fix (local):**
```bash
git reflog
# Find the branch commit and recreate
```
**Fix (remote):**
Ask a teammate to push it again if needed.
### 19. Want to See File History
**Issue:** You want to track the changes made to a specific file.
```bash
git log --
git blame
```
### 20. Detached HEAD State
**Issue:** You checked out a commit, not a branch.
```bash
git checkout -b new-branch # To save your state
```
Or just checkout a branch to exit:
```bash
git checkout main
```
### 21. Files Are Committed, but Changes Don’t Appear After Pull
**Issue:** You committed files (e.g., configs or logs), but after pulling, changes don’t sync properly—likely because Git is tracking the file but ignoring internal changes.
**Cause:** The file was added before updating `.gitignore`, or line endings / file permissions confuse Git on some systems. Sometimes it may be useful if you want track the file but not its changes(lines).
- To force Git to track changes again:
```bash
git rm --cached
git add
git commit -m "Re-track file changes"
```
- Double-check `.gitattributes` and `.gitignore` to ensure nothing blocks updates.
## Essential Hotkeys
Here is a list of my shorcuts that i've using each day. It will improve your speed a lot but require some words to memorize.
This repo contains a file named `gc`. Add this into your PATH.
You can do this manyally or using gc_install.sh that must be executed via git bash terminal.
```shell
gc
Usage: gc [option]
Mandatory arguments:
--setup -s --> git setup and configuration
--init -i --> creation of new project
--add -a --> adding files to git
--delete -d --> deleting files from git
--commit -c --> git commit helper
--branch -b --> git branching info
--merge -m --> git merging info
--rebase -rb --> git rebase info
--update -u --> updating current repo
--stash -st --> stashing in current repo
--inspect -in --> git inspection, log,show...
--remote -r --> git remote helper
--patch -p --> git patching helper
--debug -dg --> git debugging
--email -e --> git email helper
--tags -t --> git tags helper
--reset -rs --> git reset helper
--conflict -cn --> git conflict resolving helper
--revert -rv --> git reverting helper
--fix-mistakes -f --> fix mistakes in git
--submodules -sm --> git submodules helper
--archive -ar --> archive your repo
--help -h ? --> prints usage of git-cheat
--version -v --> prints version of git-cheat
```
## Tips and Tricks
Handy tricks to make you look like a seasoned Git expert—alias setups, stash magic, rebase powers, and much more.
* **Use Hooks for Automation**
Use `.git/hooks/pre-commit` to auto-lint, format, or reject bad commits.
```bash
#!/bin/sh
black .
```
* **Compare Any Two Commits (Not Just HEAD)**
```bash
git diff
```
* **Show Pretty Commit History**
```bash
git log --graph --oneline --decorate --all
```
Great for reviewing merges and diverging branches.
* **Prune Deleted Remotes**
```bash
git remote prune origin
```
Cleans up remote-tracking branches that no longer exist.
* **Ignore Local Changes Without .gitignore**
```bash
git update-index --assume-unchanged path/to/file
```
Keeps file tracked but ignores local changes.
* **Temporarily Keep Changes Without Committing**
```bash
git stash push -m "partial work" path/to/file
```
Experienced users stash selectively—not everything at once.
* **Clean All Untracked Files Including Ignored**
```bash
git clean -xfd
```
## Interview Questions
A categorized collection of real Git interview questions, sorted by experience level. Most are from actual interviews.
### 🟢 Beginner Level
#### 1. What is a Version Control System (VCS)?
A VCS tracks changes made by developers, maintaining code history, enabling bug fixes, new code additions, and easy restoration of previous working versions.
#### 2. What does `git status` do?
Shows the difference between the working directory and the index (staging area), helping track changes that are staged or unstaged.
#### 3. What does `git add` do?
Adds files or changes to the staging area (index) for the next commit. You can add all changes (`git add .`), specific files (`git add `), or folders (`git add /`).
#### 4. What is the "Index" or "Staging Area"?
A temporary area where changes are formatted and reviewed before committing.
#### 5. How to create a Git repository?
Run `git init` in a project folder to create a `.git` directory and initialize the repository.
#### 6. What is the difference between `git remote` and `git clone`?
- `git remote`: Adds a named remote URL to an existing repository.
- `git clone`: Creates a new local repository by copying an existing remote one.
#### 7. What does `git stash` do?
Temporarily saves changes in the working directory to a stack, allowing branch switching without losing edits.
#### 8. How to delete a Git branch?
- Locally: `git branch -d `
- Remotely: `git push origin --delete `
---
### 🟠 Intermediate Level
#### 1. What is the `git reflog` command?
Tracks all changes in branch references (like commits, checkouts), helping recover lost branches or commits.
#### 2. What does a commit object contain?
- Snapshot of project files at a point in time.
- Reference to parent commit(s).
- Unique SHA-1 hash identifier.
#### 3. What are Git config levels?
- **System**: Applies to all users on the system (`--system`).
- **Global**: Applies to the current user (`--global`).
- **Local**: Applies to the current repository (`--local`, default).
#### 4. What is a detached HEAD?
When HEAD points to a commit or tag instead of a branch, causing "floating" commits not linked to any branch. Avoid by creating a new branch from that commit (`git checkout -b `).
#### 5. What does `git annotate` do?
Shows line-by-line commit info for a file, indicating which commit introduced each line.
#### 6. Difference between `git stash apply` and `git stash pop`?
- `apply`: Applies stash but keeps it in the stash list.
- `pop`: Applies stash and removes it from the stash list.
#### 7. Difference between `git diff` and `git status`?
- `git diff`: Shows specific content changes between commits or working directory and index.
- `git status`: Shows which files are staged, unstaged, or untracked.
#### 8. Difference between `git pull` and `git fetch`?
- `git fetch`: Downloads changes but doesn’t merge.
- `git pull`: Fetches and merges changes (`git fetch + git merge`).
#### 9. Why is Git easy to work with?
- Powerful branching and merging.
- Distributed system with local and remote repos.
- Pull requests enable collaboration.
- Speeds up release cycles.
---
### 🟣 Advanced Level
#### 1. How to squash multiple commits into one?
Run `git rebase -i HEAD~N` to combine the last N commits into a single commit. Use carefully as it rewrites history.
#### 2. How to recover a deleted branch that was pushed remotely?
Use `git reflog` to find the last commit of the branch and recreate it by checking out that commit as a new branch.
#### 3. How to resolve Git conflicts?
- Identify conflicted files.
- Manually edit to resolve conflicts.
- Stage resolved files (`git add`).
- Commit the merge (`git commit`).
- Push changes.
#### 4. What command lists branches merged to master?
`git branch --merged` shows branches merged into the current branch. `--no-merged` shows unmerged branches.
#### 5. Best practice: amend a commit or create a new one?
Prefer creating a new commit to avoid losing history or mixing unrelated changes.
#### 6. How to revert a bad commit already pushed?
- Fix and commit new changes.
- Or use `git revert ` to create a new commit that undoes the bad one.
#### 7. What does `git cherry-pick` do?
Applies specific commits from one branch onto another, useful for backporting or selective changes.
---
## Trunk-Based Workflow (FSM Guide)
A simplified Finite State Machine diagram to help you follow trunk-based development practices.
```mermaid
stateDiagram-v2
[*] --> Main
%% --- Start feature work ---
Main --> FeatureBranch : create feature branch
FeatureBranch --> Working : modify or create files
Working --> Staging : stage changes (git add)
Staging --> Committing : commit changes (git commit)
Committing --> Working : need more changes
Committing --> Reviewing : ready for review or merge
%% --- Optional PR flow ---
Reviewing --> PullRequest : create pull request
PullRequest --> CodeReview : request review
CodeReview --> ChangesRequested : reviewer requests changes
CodeReview --> Approved : reviewer approves
ChangesRequested --> Working : apply review feedback
Approved --> Merging : merge branch
%% --- Direct merge path (no PR) ---
Reviewing --> Merging : merge without pull request
%% --- Merge and CI ---
Merging --> MergeConflict : merge conflict detected
MergeConflict --> ConflictResolving : resolve conflicts manually
ConflictResolving --> Working : edit and stage again
Merging --> CI : run CI pipeline
CI --> CI_Passed : CI passed
CI --> CI_Failed : CI failed
CI_Passed --> Main : return to trunk
CI_Failed --> Working : fix code
%% --- Commit management ---
Committing --> Amending : amend commit
Amending --> Reviewing : continue review
Committing --> Squashing : squash commits
Squashing --> Reviewing : continue review
Committing --> Reverting : revert commit
Reverting --> Working : reapply or fix
%% --- Undo path ---
Working --> Undoing : discard local changes
Undoing --> Working
%% --- Cancel PR ---
PullRequest --> CancellingPR : cancel pull request
CancellingPR --> Main
%% --- Hotfix path ---
Main --> HotfixBranch : create hotfix branch
HotfixBranch --> Working
%% --- Dirty commit directly to main ---
Main --> DirectCommit : commit directly to main
DirectCommit --> Working
%% --- Closing loop ---
ConflictResolving --> Staging
Reverting --> Staging
Amending --> Staging
Squashing --> Staging
Working --> Staging
CI_Failed --> Staging
```
## Commit Convention
Standardizing commit messages improves readability, traceability, and automation (e.g., changelogs, releases). This section outlines a consistent format based on commonly used conventions.
### Commit Format
```
():
```
- **Example**: `feat(auth): add JWT-based login`
### Special Commit Types
- **Initial Commit**:
`chore: init`
- **Merge Commit**:
`Merge branch 'feature/login'` (Git default)
- **Revert Commit**:
`Revert "feat(auth): add JWT-based login"`
---
### Types
Use one of the following types:
Type Description
---------------------------------------------------------------------------------
`feat` New feature added to the API or UI
`fix` Bug fix for an existing feature
`refactor` Code restructure without changing behavior
`perf` Performance-related improvements
`style` Code style changes (formatting, spaces, etc.) with no logic impact
`test` Adding or correcting tests
`docs` Documentation-only changes
`build` Changes affecting build tools, CI/CD, dependencies
`ops` Operations-related (deployment, infra, monitoring)
`chore` Misc tasks like `.gitignore` or non-functional changes
---
### Scope (Optional)
The scope adds context to the change (e.g., `auth`, `db`, `ui`):
- Format: `(): description`
- Example: `fix(api): handle empty response case`
- Don’t use issue numbers as scope names
---
### Breaking Changes
If a commit introduces a breaking change:
- Add an **exclamation mark**:
`feat(api)!: remove deprecated status endpoint`
- In the **footer**, start with:
`BREAKING CHANGE: explain what broke and how to migrate`
---
### Description Rules
- Always required
- Use **imperative mood**, e.g., “add login”, not “added” or “adds”
- Start with lowercase
- **No period** at the end
---
### Body (Optional)
Use the body to explain **why** the change was made and how it differs from prior behavior.
---
### Footer (Optional, but Required for Breaking Changes)
Includes:
- Issue references (e.g., `Closes #42`)
- Details on breaking changes
Example:
```
BREAKING CHANGE: auth service now requires email verification
```
---
### Versioning Guide
Used for automating version bumps (e.g., semantic-release):
- **Breaking changes** → major version
- `feat`, `fix` commits → minor version
- Other changes → patch version