# Git 快速参考

*分支、合并、变基、暂存、远程仓库*

> Source: Pro Git (git-scm.com/book) · MIT

## 配置

### 用户设置

```
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --global core.editor vim
git config --list     # show all settings
```

### 初始化与克隆

```
git init              # new repo in current dir
git clone <url>       # copy remote repo
git clone <url> dir   # clone into dir/
```

## 基础操作

### 状态与暂存

```
git status            # working tree status
git add file.txt      # stage a file
git add .             # stage all changes
git add -p            # stage interactively
```

### 提交

```
git commit -m "msg"   # commit staged changes
git commit -am "msg"  # stage tracked + commit
git commit --amend    # edit last commit
```

### 查看差异

```
git diff              # unstaged changes
git diff --staged     # staged changes
git diff HEAD~1       # vs previous commit
git diff branchA branchB
```

## 分支管理

### 分支操作

```
git branch            # list local branches
git branch -a         # list all (incl. remote)
git branch feat       # create branch
git branch -d feat    # delete (safe)
git branch -D feat    # delete (force)
```

### 切换分支

```
git checkout feat     # switch to branch
git checkout -b feat  # create + switch
git switch feat       # switch (modern)
git switch -c feat    # create + switch (modern)
```

### 合并

```
git merge feat        # merge feat into current
git merge --no-ff feat # always create merge commit
git merge --abort     # cancel conflicted merge
```

## 远程仓库

### 管理远程

```
git remote -v                # list remotes
git remote add origin <url>  # add remote
git remote remove origin     # remove remote
```

### Fetch、Pull、Push

```
git fetch origin      # download updates
git pull              # fetch + merge
git pull --rebase     # fetch + rebase
git push origin main  # push to remote
git push -u origin feat # push + set upstream
```

## 日志

### 查看历史

```
git log               # full commit log
git log --oneline     # compact one-line format
git log --oneline -10 # last 10 commits
git log --graph --oneline --all # branch graph
git log -p            # show patches (diffs)
git log --stat        # show file change stats
```

### 过滤日志

```
git log --author="Alice"
git log --since="2024-01-01"
git log -- path/file  # commits touching file
git log -S "keyword"  # search content changes
```

## 暂存

```
git stash             # save working changes
git stash push -m "wip" # save with message
git stash list        # list all stashes
git stash pop         # apply + remove top stash
git stash apply       # apply but keep stash
git stash drop        # remove top stash
git stash clear       # remove all stashes
```

## 撤销更改

### 取消暂存与丢弃

```
git restore file.txt           # discard working changes
git restore --staged file.txt  # unstage file
git checkout -- file.txt       # discard (legacy)
```

### Reset

| Command | Description |
|---------|-------------|
| `git reset --soft HEAD~1` | 撤销提交，保留暂存区 |
| `git reset --mixed HEAD~1` | 撤销提交，保留工作区（默认） |
| `git reset --hard HEAD~1` | 撤销提交，丢弃所有更改 |

### Revert

```
git revert <commit>   # new commit undoing changes
git revert HEAD       # undo last commit (safe)
```

## 标签

```
git tag v1.0                  # lightweight tag
git tag -a v1.0 -m "Release" # annotated tag
git tag                       # list tags
git push origin v1.0          # push single tag
git push origin --tags        # push all tags
git tag -d v1.0               # delete local tag
```

## .gitignore

### 模式示例

```
# .gitignore
*.log           # all .log files
build/          # build directory
!important.log  # exception (do track)
/TODO           # only root TODO
doc/**/*.pdf    # pdfs in doc/ subtree
```

### 常用模式

| Command | Description |
|---------|-------------|
| `*.ext` | 匹配指定扩展名的所有文件 |
| `dir/` | 整个目录 |
| `!pattern` | 取反（重新包含） |
| `**/name` | 匹配任意子目录中的文件 |
| `?` | 单字符通配符 |
