44 lines
1.5 KiB
Markdown
44 lines
1.5 KiB
Markdown
# History Traps
|
|
|
|
## Reset
|
|
|
|
- `git reset --hard` loses uncommitted changes PERMANENTLY — no undo
|
|
- `--hard` vs `--soft` vs `--mixed` — each moves different things
|
|
- Reset of pushed commit = history diverges — you need force push
|
|
- Reset with untracked files = untracked survive — can surprise you
|
|
|
|
## Revert
|
|
|
|
- Revert creates NEW commit — doesn't delete the original
|
|
- Revert of merge commit needs `-m 1` or `-m 2` — without it, error
|
|
- Revert of revert = re-applies changes — confusing history
|
|
- Revert of old commit can conflict with later commits
|
|
|
|
## Amend
|
|
|
|
- `--amend` changes SHA — amended commit is DIFFERENT commit
|
|
- Amend of pushed commit = same problems as rebase
|
|
- `--amend` without staging = only changes message
|
|
- Accidental amend on wrong commit = use reflog to recover
|
|
|
|
## Reflog
|
|
|
|
- Reflog is LOCAL — doesn't sync with remote
|
|
- Reflog expires (default 90 days) — old commits lost
|
|
- `git gc` can clean unreachable commits before expiration
|
|
- Reflog of deleted branch is in HEAD reflog, not branch reflog
|
|
|
|
## Cherry-pick
|
|
|
|
- Cherry-pick creates new commit with different SHA
|
|
- Cherry-picking then merging = duplicate commits in history
|
|
- Cherry-pick of merge commit needs `-m` flag
|
|
- Conflicts in cherry-pick = resolve same as rebase
|
|
|
|
## Blame
|
|
|
|
- `git blame` shows last change, not original author
|
|
- Blame ignores whitespace changes with `-w`
|
|
- `git log -p filename` shows full history of changes
|
|
- Blame on moved code: use `git log --follow` for renamed files
|