chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,529 @@
|
||||
# Git Error Patterns
|
||||
|
||||
Common Git errors with diagnosis and solutions.
|
||||
|
||||
## Push/Pull Errors
|
||||
|
||||
### Failed to push: rejected
|
||||
|
||||
```
|
||||
! [rejected] main -> main (non-fast-forward)
|
||||
error: failed to push some refs to 'origin'
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Remote has commits you don't have locally
|
||||
2. Force push required (history rewritten)
|
||||
3. Branch protection rules
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Option 1: Pull and merge first (safest)
|
||||
git pull origin main
|
||||
git push origin main
|
||||
|
||||
# Option 2: Pull with rebase
|
||||
git pull --rebase origin main
|
||||
git push origin main
|
||||
|
||||
# Option 3: Force push (CAREFUL - overwrites remote)
|
||||
# Only if you intentionally rewrote history
|
||||
git push --force-with-lease origin main
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Remote contains work you do not have locally
|
||||
|
||||
```
|
||||
hint: Updates were rejected because the remote contains work that you do not have locally.
|
||||
```
|
||||
|
||||
**Same as above** - pull first, then push.
|
||||
|
||||
```bash
|
||||
# Standard workflow
|
||||
git fetch origin
|
||||
git merge origin/main # Or: git rebase origin/main
|
||||
git push
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Permission denied (publickey)
|
||||
|
||||
```
|
||||
Permission denied (publickey).
|
||||
fatal: Could not read from remote repository.
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. SSH key not added to agent
|
||||
2. SSH key not added to GitHub/GitLab
|
||||
3. Wrong SSH key
|
||||
4. Using HTTPS URL instead of SSH
|
||||
|
||||
**Diagnosis**:
|
||||
```bash
|
||||
# Test SSH connection
|
||||
ssh -T git@github.com
|
||||
ssh -vT git@github.com # Verbose for debugging
|
||||
|
||||
# Check loaded keys
|
||||
ssh-add -l
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Add SSH key to agent
|
||||
eval "$(ssh-agent -s)"
|
||||
ssh-add ~/.ssh/id_ed25519 # Or your key file
|
||||
|
||||
# Generate new key if needed
|
||||
ssh-keygen -t ed25519 -C "your@email.com"
|
||||
|
||||
# Copy public key to GitHub/GitLab
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
# Then add in GitHub Settings -> SSH Keys
|
||||
|
||||
# Or use HTTPS instead of SSH
|
||||
git remote set-url origin https://github.com/user/repo.git
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Authentication failed
|
||||
|
||||
```
|
||||
remote: Invalid username or password.
|
||||
fatal: Authentication failed for 'https://github.com/...'
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Wrong credentials
|
||||
2. Password auth disabled (GitHub)
|
||||
3. Token expired
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Use Personal Access Token instead of password
|
||||
# Generate at: GitHub -> Settings -> Developer settings -> Personal access tokens
|
||||
|
||||
# Update stored credentials
|
||||
git credential reject
|
||||
protocol=https
|
||||
host=github.com
|
||||
# Press Enter twice
|
||||
|
||||
# Or use credential helper
|
||||
git config --global credential.helper cache
|
||||
git config --global credential.helper 'cache --timeout=3600'
|
||||
|
||||
# Or switch to SSH
|
||||
git remote set-url origin git@github.com:user/repo.git
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Merge Conflicts
|
||||
|
||||
### Automatic merge failed
|
||||
|
||||
```
|
||||
CONFLICT (content): Merge conflict in file.js
|
||||
Automatic merge failed; fix conflicts and then commit the result.
|
||||
```
|
||||
|
||||
**Resolution Workflow**:
|
||||
```bash
|
||||
# 1. See conflicting files
|
||||
git status
|
||||
|
||||
# 2. Open file and look for conflict markers
|
||||
<<<<<<< HEAD
|
||||
your changes
|
||||
=======
|
||||
their changes
|
||||
>>>>>>> branch-name
|
||||
|
||||
# 3. Edit file to resolve (remove markers, keep desired code)
|
||||
|
||||
# 4. Stage resolved files
|
||||
git add file.js
|
||||
|
||||
# 5. Complete merge
|
||||
git commit
|
||||
# Or if rebasing: git rebase --continue
|
||||
```
|
||||
|
||||
**Tools**:
|
||||
```bash
|
||||
# Use merge tool
|
||||
git mergetool
|
||||
|
||||
# Configure VS Code as merge tool
|
||||
git config --global merge.tool vscode
|
||||
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
|
||||
```
|
||||
|
||||
**Abort if needed**:
|
||||
```bash
|
||||
git merge --abort
|
||||
# Or
|
||||
git rebase --abort
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Cannot pull with rebase: unstaged changes
|
||||
|
||||
```
|
||||
error: cannot pull with rebase: You have unstaged changes.
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Option 1: Stash changes
|
||||
git stash
|
||||
git pull --rebase
|
||||
git stash pop
|
||||
|
||||
# Option 2: Commit changes first
|
||||
git add .
|
||||
git commit -m "WIP"
|
||||
git pull --rebase
|
||||
|
||||
# Option 3: Discard changes (CAREFUL)
|
||||
git checkout -- .
|
||||
git pull --rebase
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Checkout/Switch Errors
|
||||
|
||||
### Cannot checkout: local changes would be overwritten
|
||||
|
||||
```
|
||||
error: Your local changes to the following files would be overwritten by checkout
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Option 1: Stash changes
|
||||
git stash
|
||||
git checkout other-branch
|
||||
git stash pop # To get changes back
|
||||
|
||||
# Option 2: Commit changes
|
||||
git add .
|
||||
git commit -m "WIP"
|
||||
git checkout other-branch
|
||||
|
||||
# Option 3: Discard changes (CAREFUL)
|
||||
git checkout -- file.js # Single file
|
||||
git checkout -- . # All files
|
||||
git reset --hard # Everything including staged
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Pathspec did not match any file
|
||||
|
||||
```
|
||||
error: pathspec 'branch-name' did not match any file(s) known to git
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Branch doesn't exist
|
||||
2. Typo in branch name
|
||||
3. Remote branch not fetched
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# List all branches
|
||||
git branch -a
|
||||
|
||||
# Fetch remote branches
|
||||
git fetch origin
|
||||
|
||||
# Checkout remote branch
|
||||
git checkout -b branch-name origin/branch-name
|
||||
# Or (newer Git)
|
||||
git switch branch-name
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Reset/Revert Errors
|
||||
|
||||
### HEAD detached
|
||||
|
||||
```
|
||||
You are in 'detached HEAD' state.
|
||||
```
|
||||
|
||||
**What it means**: You checked out a commit, not a branch.
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Go back to branch
|
||||
git checkout main
|
||||
|
||||
# Create new branch from current state
|
||||
git checkout -b new-branch-name
|
||||
|
||||
# See where HEAD is
|
||||
git log --oneline -1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Cannot do soft reset with paths
|
||||
|
||||
```
|
||||
fatal: Cannot do soft reset with paths.
|
||||
```
|
||||
|
||||
**Solution**: Use different command:
|
||||
```bash
|
||||
# To unstage file
|
||||
git restore --staged file.js
|
||||
# Or older Git:
|
||||
git reset HEAD file.js
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Refusing to reset in dirty worktree
|
||||
|
||||
```
|
||||
fatal: Failed to resolve 'HEAD~1' as a valid ref.
|
||||
```
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Stash changes first
|
||||
git stash
|
||||
git reset --hard HEAD~1
|
||||
git stash pop
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Stash Errors
|
||||
|
||||
### No stash entries found
|
||||
|
||||
```
|
||||
No stash entries found.
|
||||
```
|
||||
|
||||
**Check stashes**:
|
||||
```bash
|
||||
# List all stashes
|
||||
git stash list
|
||||
|
||||
# If empty, nothing was stashed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Conflict when applying stash
|
||||
|
||||
```
|
||||
CONFLICT (content): Merge conflict in file.js
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Resolve conflicts manually (same as merge conflicts)
|
||||
# Then either:
|
||||
git stash drop # Remove stash after resolving
|
||||
|
||||
# Or if you want to keep stash:
|
||||
# Just resolve conflicts, add, and commit
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Rebase Errors
|
||||
|
||||
### Cannot rebase: uncommitted changes
|
||||
|
||||
```
|
||||
error: cannot rebase: You have unstaged changes.
|
||||
```
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
git stash
|
||||
git rebase origin/main
|
||||
git stash pop
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Rebase conflict
|
||||
|
||||
```
|
||||
CONFLICT (content): Merge conflict in file.js
|
||||
error: could not apply abc1234... commit message
|
||||
```
|
||||
|
||||
**Resolution**:
|
||||
```bash
|
||||
# 1. Fix conflicts in files
|
||||
|
||||
# 2. Stage resolved files
|
||||
git add file.js
|
||||
|
||||
# 3. Continue rebase
|
||||
git rebase --continue
|
||||
|
||||
# Or abort entire rebase
|
||||
git rebase --abort
|
||||
|
||||
# Skip this commit (lose its changes)
|
||||
git rebase --skip
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Submodule Errors
|
||||
|
||||
### Submodule not initialized
|
||||
|
||||
```
|
||||
fatal: no submodule mapping found in .gitmodules for path 'submodule-path'
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Initialize submodules
|
||||
git submodule init
|
||||
git submodule update
|
||||
|
||||
# Or clone with submodules
|
||||
git clone --recurse-submodules repo-url
|
||||
|
||||
# Update existing clone
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Submodule HEAD detached
|
||||
|
||||
```
|
||||
HEAD detached at abc1234
|
||||
```
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
cd submodule-path
|
||||
git checkout main # Or desired branch
|
||||
cd ..
|
||||
git add submodule-path
|
||||
git commit -m "Update submodule to main"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## LFS Errors
|
||||
|
||||
### File exceeds GitHub file size limit
|
||||
|
||||
```
|
||||
remote: error: File large-file.zip is 150.00 MB; this exceeds GitHub's file size limit of 100.00 MB
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Install Git LFS
|
||||
brew install git-lfs # macOS
|
||||
git lfs install
|
||||
|
||||
# Track large files
|
||||
git lfs track "*.zip"
|
||||
git lfs track "*.psd"
|
||||
git add .gitattributes
|
||||
|
||||
# If already committed, need to rewrite history
|
||||
git filter-branch --tree-filter 'git lfs track "*.zip"' HEAD
|
||||
# Or use BFG Repo Cleaner
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### LFS objects missing
|
||||
|
||||
```
|
||||
Encountered 1 file that should have been a pointer, but wasn't
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Fetch LFS objects
|
||||
git lfs fetch --all
|
||||
|
||||
# Or pull LFS objects
|
||||
git lfs pull
|
||||
|
||||
# Migrate existing files to LFS
|
||||
git lfs migrate import --include="*.psd"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration Errors
|
||||
|
||||
### Author identity unknown
|
||||
|
||||
```
|
||||
Author identity unknown
|
||||
Please tell me who you are.
|
||||
```
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
git config --global user.email "you@example.com"
|
||||
git config --global user.name "Your Name"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Unsafe repository
|
||||
|
||||
```
|
||||
fatal: detected dubious ownership in repository
|
||||
```
|
||||
|
||||
**Causes**: Repository owned by different user (common in Docker/WSL).
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Add exception for this repo
|
||||
git config --global --add safe.directory /path/to/repo
|
||||
|
||||
# Or for all repos (less secure)
|
||||
git config --global --add safe.directory '*'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference Table
|
||||
|
||||
| Error | Category | Quick Fix |
|
||||
|-------|----------|-----------|
|
||||
| Push rejected | Push | `git pull --rebase` then push |
|
||||
| Permission denied | Auth | Check SSH key: `ssh-add -l` |
|
||||
| Auth failed | Auth | Use Personal Access Token |
|
||||
| Merge conflict | Merge | Edit file, remove markers, `git add` |
|
||||
| Unstaged changes | Checkout | `git stash` first |
|
||||
| Pathspec not found | Branch | `git fetch` then checkout |
|
||||
| HEAD detached | Branch | `git checkout main` |
|
||||
| No stash entries | Stash | Nothing was stashed |
|
||||
| Rebase conflict | Rebase | Fix conflict, `git rebase --continue` |
|
||||
| File too large | LFS | Use Git LFS for large files |
|
||||
| Identity unknown | Config | Set user.email and user.name |
|
||||
Reference in New Issue
Block a user