chore: 重构 OpenCode 命令和技能文档体系
- 新增:统一的 git 命令文档(add/commit/push/pull 等) - 新增:整合的 Gitea 技能文档(API、运行器、工作流等) - 新增:工作流模板(Android、Go、Node.js 等) - 移除:已弃用的旧命令脚本和发布脚本 - 改进:.gitignore 添加敏感文件保护规则 - 改进:AGENTS.md 完善了开发规范和示例 此次重组统一了命令和技能的文档结构,便于后续维护和扩展。
This commit is contained in:
565
skill/git/SKILL.md
Normal file
565
skill/git/SKILL.md
Normal file
@@ -0,0 +1,565 @@
|
||||
---
|
||||
name: git
|
||||
description: Git workflow best practices with commit conventions, tagging, and common operations for both polyrepo and monorepo
|
||||
---
|
||||
|
||||
# Git Workflow Best Practices
|
||||
|
||||
You are an expert in Git version control and repository management.
|
||||
|
||||
## Core Principles
|
||||
|
||||
1. **Default Main Branch**: Use `main` as the primary branch (not `master`)
|
||||
2. **Conventional Commits**: Follow [Conventional Commits](https://www.conventionalcommits.org/) specification
|
||||
3. **Semantic Versioning**: Use `major.minor.patch` format (e.g., `0.1.0`, `1.2.3`)
|
||||
4. **Repository Types**: Support both polyrepo and monorepo workflows
|
||||
5. **Clean History**: Maintain meaningful commit history and proper tagging
|
||||
|
||||
## Repository Types
|
||||
|
||||
### Polyrepo (Single Repository)
|
||||
|
||||
- Each project has its own repository
|
||||
- Tag format: `<version>` (e.g., `1.2.0`)
|
||||
- Version files at project root
|
||||
- Simpler workflow for independent projects
|
||||
|
||||
### Monorepo (Multiple Subprojects)
|
||||
|
||||
- Multiple projects in a single repository
|
||||
- Detect from `AGENTS.md` file or directory structure (e.g., `packages/`, `apps/`)
|
||||
- Tag format: `<subproject>-<version>` (e.g., `ios-1.2.0`, `android-0.3.1`)
|
||||
- Commit scope includes subproject name when changes affect single project
|
||||
- Each subproject maintains independent versioning
|
||||
|
||||
**Monorepo Detection Rules:**
|
||||
- Check if `AGENTS.md` explicitly indicates monorepo
|
||||
- Look for common monorepo directory structures:
|
||||
- `packages/`, `apps/`, `services/`, `modules/`, `projects/`
|
||||
- If uncertain, default to polyrepo
|
||||
|
||||
## Commit Message Convention
|
||||
|
||||
### Format
|
||||
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
<body>
|
||||
|
||||
<footer>
|
||||
```
|
||||
|
||||
### Commit Types
|
||||
|
||||
| Type | Description | Version Impact | Examples |
|
||||
|------|-------------|----------------|----------|
|
||||
| `feat` | New feature | minor +1 | Add user authentication |
|
||||
| `fix` | Bug fix | patch +1 | Fix memory leak in cache |
|
||||
| `perf` | Performance improvement | patch +1 | Optimize database queries |
|
||||
| `BREAKING CHANGE` or `!` | Breaking change | major +1 | Remove deprecated API |
|
||||
| `docs` | Documentation only | None | Update README |
|
||||
| `style` | Code style/formatting | None | Fix indentation |
|
||||
| `refactor` | Code refactoring | None | Reorganize file structure |
|
||||
| `test` | Add/modify tests | None | Add unit tests for auth |
|
||||
| `chore` | Maintenance tasks | None | Update dependencies |
|
||||
| `ci` | CI/CD changes | None | Update workflow config |
|
||||
| `build` | Build system changes | None | Update webpack config |
|
||||
|
||||
### Commit Message Language
|
||||
|
||||
- **Default (macOS/Linux)**: Use Chinese (中文)
|
||||
- **Windows**: Use English (due to Cursor Shell tool encoding issues)
|
||||
- **Content**: Focus on "why" rather than "what"
|
||||
- **Length**: Subject line ≤ 50 characters, body line ≤ 72 characters
|
||||
|
||||
### Scope (for Monorepo)
|
||||
|
||||
When changes affect a single subproject, include scope:
|
||||
- Format: `<type>(<scope>): <subject>`
|
||||
- Example: `feat(ios): add OGG Opus upload support`
|
||||
- Example: `fix(electron): resolve clipboard injection issue`
|
||||
|
||||
When changes affect multiple subprojects or the entire repository, omit scope:
|
||||
- Example: `chore: update shared dependencies`
|
||||
|
||||
### Examples
|
||||
|
||||
**Polyrepo commits:**
|
||||
```bash
|
||||
feat: add user authentication with OAuth2
|
||||
fix: resolve bluetooth connection timeout
|
||||
docs: update API documentation
|
||||
chore: update project dependencies
|
||||
```
|
||||
|
||||
**Monorepo commits:**
|
||||
```bash
|
||||
feat(ios): add OGG Opus upload support
|
||||
fix(android): resolve memory leak in cache manager
|
||||
refactor(electron): reorganize main process code
|
||||
chore: update shared ESLint configuration
|
||||
```
|
||||
|
||||
## Version Management
|
||||
|
||||
### Semantic Versioning
|
||||
|
||||
Format: `major.minor.patch` (e.g., `0.1.0`, `1.2.3`, `2.0.0`)
|
||||
|
||||
- **Default starting version**: `0.1.0`
|
||||
- **Major** (X.0.0): Breaking changes, API incompatibility
|
||||
- **Minor** (0.X.0): New features, backward compatible
|
||||
- **Patch** (0.0.X): Bug fixes, backward compatible
|
||||
|
||||
### Version Increment Rules
|
||||
|
||||
| Change Type | Version Change | Example |
|
||||
|-------------|----------------|---------|
|
||||
| Breaking change | major +1, reset minor/patch | `1.2.3` → `2.0.0` |
|
||||
| New feature (`feat`) | minor +1, reset patch | `1.2.3` → `1.3.0` |
|
||||
| Bug fix (`fix`) | patch +1 | `1.2.3` → `1.2.4` |
|
||||
| Performance (`perf`) | patch +1 | `1.2.3` → `1.2.4` |
|
||||
|
||||
### When to Update Version
|
||||
|
||||
**Update version** (user-perceivable changes):
|
||||
- New features (`feat`)
|
||||
- Bug fixes that affect users (`fix`)
|
||||
- Performance improvements users can notice (`perf`)
|
||||
- Breaking changes (major version bump)
|
||||
|
||||
**Don't update version** (internal changes):
|
||||
- Documentation (`docs`)
|
||||
- Tests (`test`)
|
||||
- Refactoring without behavior change (`refactor`)
|
||||
- Code style (`style`)
|
||||
- Build configuration (`build`)
|
||||
- CI/CD changes (`ci`)
|
||||
- Maintenance tasks (`chore`)
|
||||
|
||||
**Decision criteria:**
|
||||
1. Will this be packaged into the final product?
|
||||
2. Will users notice this change?
|
||||
3. Does it affect the product that users download/use?
|
||||
|
||||
If answer is "yes" → update version. Otherwise → skip version update.
|
||||
|
||||
## Project Type Detection
|
||||
|
||||
### Common Project Types
|
||||
|
||||
| Project Type | Version File | Version Field |
|
||||
|--------------|--------------|---------------|
|
||||
| iOS | `*.xcodeproj/project.pbxproj` | `MARKETING_VERSION` |
|
||||
| npm/Node.js | `package.json` | `version` |
|
||||
| Android (Groovy) | `app/build.gradle` | `versionName` |
|
||||
| Android (Kotlin DSL) | `app/build.gradle.kts` | `versionName` |
|
||||
| Python (pyproject) | `pyproject.toml` | `[project] version` or `[tool.poetry] version` |
|
||||
| Python (setup) | `setup.py` | `version` |
|
||||
| Rust | `Cargo.toml` | `[package] version` |
|
||||
| Go | Git tag only | - |
|
||||
| Flutter | `pubspec.yaml` | `version` |
|
||||
| .NET | `*.csproj` | `<Version>` or `<PackageVersion>` |
|
||||
|
||||
### Detection Strategy
|
||||
|
||||
1. **Check AGENTS.md first**: If version rules are defined, use them
|
||||
2. **Auto-detect**: Scan for version files based on project structure
|
||||
3. **Fallback**: If no version file found, only create Git tag (like Go projects)
|
||||
|
||||
## Tag Management
|
||||
|
||||
### Tag Format
|
||||
|
||||
**Polyrepo:**
|
||||
```bash
|
||||
<version>
|
||||
Examples: 1.2.0, 0.3.1, 2.0.0
|
||||
```
|
||||
|
||||
**Monorepo:**
|
||||
```bash
|
||||
<subproject>-<version>
|
||||
Examples: ios-1.2.0, android-0.3.1, electron-2.0.0
|
||||
```
|
||||
|
||||
### Tag Annotation
|
||||
|
||||
- **Use same content as commit message** for tag annotation
|
||||
- Tag annotations are used as Release notes by CI/CD
|
||||
- Multi-line commits should have multi-line annotations
|
||||
|
||||
**Single-line example:**
|
||||
```bash
|
||||
git tag -a "1.2.0" -m "feat: add user authentication"
|
||||
```
|
||||
|
||||
**Multi-line example (recommended):**
|
||||
```bash
|
||||
git tag -a "1.2.1" \
|
||||
-m "fix: resolve bluetooth connection timeout" \
|
||||
-m "" \
|
||||
-m "- Increase connection timeout to 30s" \
|
||||
-m "- Add retry mechanism for failed connections" \
|
||||
-m "- Improve error messages"
|
||||
```
|
||||
|
||||
**Monorepo example:**
|
||||
```bash
|
||||
git tag -a "android-1.2.1" \
|
||||
-m "fix(android): resolve bluetooth connection timeout" \
|
||||
-m "" \
|
||||
-m "- Increase connection timeout to 30s" \
|
||||
-m "- Add retry mechanism for failed connections"
|
||||
```
|
||||
|
||||
### Tag Operations
|
||||
|
||||
**Create annotated tag:**
|
||||
```bash
|
||||
git tag -a "<tag-name>" -m "<message>"
|
||||
```
|
||||
|
||||
**Push single tag:**
|
||||
```bash
|
||||
git push origin <tag-name>
|
||||
```
|
||||
|
||||
**Push all tags:**
|
||||
```bash
|
||||
git push --tags
|
||||
# or
|
||||
git push origin --tags
|
||||
```
|
||||
|
||||
**List recent tags:**
|
||||
```bash
|
||||
git tag --list | sort -V | tail -5
|
||||
```
|
||||
|
||||
**Delete local tag:**
|
||||
```bash
|
||||
git tag -d <tag-name>
|
||||
```
|
||||
|
||||
**Delete remote tag:**
|
||||
```bash
|
||||
git push origin --delete <tag-name>
|
||||
# or
|
||||
git push origin :refs/tags/<tag-name>
|
||||
```
|
||||
|
||||
## Common Git Operations
|
||||
|
||||
### Check File Changes
|
||||
|
||||
**View changed files (working directory):**
|
||||
```bash
|
||||
git status
|
||||
```
|
||||
|
||||
**View unstaged changes:**
|
||||
```bash
|
||||
git diff
|
||||
```
|
||||
|
||||
**View staged changes:**
|
||||
```bash
|
||||
git diff --cached
|
||||
# or
|
||||
git diff --staged
|
||||
```
|
||||
|
||||
**List changed files only:**
|
||||
```bash
|
||||
git diff --name-only
|
||||
git diff --cached --name-only
|
||||
```
|
||||
|
||||
**View specific file changes:**
|
||||
```bash
|
||||
git diff <file-path>
|
||||
git diff --cached <file-path>
|
||||
```
|
||||
|
||||
### Staging and Committing
|
||||
|
||||
**Add files to staging area:**
|
||||
```bash
|
||||
git add <file>
|
||||
git add .
|
||||
git add -A
|
||||
```
|
||||
|
||||
**Check what's staged:**
|
||||
```bash
|
||||
git diff --cached --name-only
|
||||
```
|
||||
|
||||
**Commit with message:**
|
||||
```bash
|
||||
# Single line
|
||||
git commit -m "feat: add new feature"
|
||||
|
||||
# Multi-line (macOS/Linux)
|
||||
git commit -m "$(cat <<'EOF'
|
||||
feat: add new feature
|
||||
|
||||
- Detail 1
|
||||
- Detail 2
|
||||
EOF
|
||||
)"
|
||||
|
||||
# Multi-line (Windows - use multiple -m flags)
|
||||
git commit -m "feat: add new feature" -m "- Detail 1" -m "- Detail 2"
|
||||
```
|
||||
|
||||
**Commit and tag in workflow:**
|
||||
```bash
|
||||
# 1. Check staging area
|
||||
git diff --cached --name-only
|
||||
|
||||
# 2. Commit changes
|
||||
git commit -m "feat: add user authentication"
|
||||
|
||||
# 3. Create tag
|
||||
git tag -a "1.2.0" -m "feat: add user authentication"
|
||||
|
||||
# 4. Push both commit and tag
|
||||
git push origin main
|
||||
git push origin 1.2.0
|
||||
```
|
||||
|
||||
### Pushing Changes
|
||||
|
||||
**Push current branch:**
|
||||
```bash
|
||||
git push origin $(git branch --show-current)
|
||||
# or
|
||||
git push origin main
|
||||
```
|
||||
|
||||
**Push with upstream tracking:**
|
||||
```bash
|
||||
git push -u origin <branch-name>
|
||||
```
|
||||
|
||||
**Push all tags:**
|
||||
```bash
|
||||
git push --tags
|
||||
# or
|
||||
git push origin --tags
|
||||
```
|
||||
|
||||
**Push specific tag:**
|
||||
```bash
|
||||
git push origin <tag-name>
|
||||
```
|
||||
|
||||
**Push commit and tag together:**
|
||||
```bash
|
||||
git push origin main && git push origin <tag-name>
|
||||
```
|
||||
|
||||
### Branch Operations
|
||||
|
||||
**View current branch:**
|
||||
```bash
|
||||
git branch --show-current
|
||||
```
|
||||
|
||||
**List all branches:**
|
||||
```bash
|
||||
git branch -a
|
||||
```
|
||||
|
||||
**Create new branch:**
|
||||
```bash
|
||||
git branch <branch-name>
|
||||
git checkout -b <branch-name>
|
||||
# or (modern)
|
||||
git switch -c <branch-name>
|
||||
```
|
||||
|
||||
**Switch branch:**
|
||||
```bash
|
||||
git checkout <branch-name>
|
||||
# or (modern)
|
||||
git switch <branch-name>
|
||||
```
|
||||
|
||||
**Delete branch:**
|
||||
```bash
|
||||
git branch -d <branch-name>
|
||||
git branch -D <branch-name> # force delete
|
||||
```
|
||||
|
||||
### History and Logs
|
||||
|
||||
**View commit history:**
|
||||
```bash
|
||||
git log --oneline -10
|
||||
git log --graph --oneline --all
|
||||
```
|
||||
|
||||
**View recent tags:**
|
||||
```bash
|
||||
git tag --list | sort -V | tail -5
|
||||
```
|
||||
|
||||
**View commit details:**
|
||||
```bash
|
||||
git show <commit-hash>
|
||||
git show <tag-name>
|
||||
```
|
||||
|
||||
**Search commit history:**
|
||||
```bash
|
||||
git log --grep="<pattern>"
|
||||
git log --author="<name>"
|
||||
```
|
||||
|
||||
## Workflow Best Practices
|
||||
|
||||
### Standard Commit Workflow
|
||||
|
||||
1. **Check staging area:**
|
||||
```bash
|
||||
git diff --cached --name-only
|
||||
```
|
||||
- If empty, add files first: `git add .`
|
||||
|
||||
2. **Collect information (in parallel):**
|
||||
```bash
|
||||
git status
|
||||
git diff --cached
|
||||
git log --oneline -10
|
||||
git tag --list | sort -V | tail -5
|
||||
```
|
||||
|
||||
3. **Determine repository type:**
|
||||
- Check `AGENTS.md` for monorepo indicator
|
||||
- Analyze changed file paths for subproject scope
|
||||
|
||||
4. **Auto-detect project type:**
|
||||
- Read `AGENTS.md` for version rules
|
||||
- Scan for version files (package.json, build.gradle, etc.)
|
||||
- Determine if version update is needed
|
||||
|
||||
5. **Generate commit message:**
|
||||
- Analyze changes
|
||||
- Follow Conventional Commits format
|
||||
- Include scope for monorepo single-project changes
|
||||
|
||||
6. **Update version number (if needed):**
|
||||
- Calculate new version based on change type
|
||||
- Update version file
|
||||
- Add version file to staging: `git add <version-file>`
|
||||
- Verify: `git diff --cached --name-only`
|
||||
|
||||
7. **Commit changes:**
|
||||
```bash
|
||||
git commit -m "<message>"
|
||||
```
|
||||
|
||||
8. **Create tag (if version updated):**
|
||||
```bash
|
||||
# Polyrepo
|
||||
git tag -a "<version>" -m "<message>"
|
||||
|
||||
# Monorepo
|
||||
git tag -a "<subproject>-<version>" -m "<message>"
|
||||
```
|
||||
|
||||
9. **Push to remote:**
|
||||
```bash
|
||||
git push origin main
|
||||
git push origin <tag-name> # if tag created
|
||||
```
|
||||
|
||||
### Sync Configuration Workflow
|
||||
|
||||
**Pull latest config changes:**
|
||||
```bash
|
||||
cd ~/.config/opencode
|
||||
git status # check for local changes
|
||||
git pull origin main
|
||||
git log --oneline -5 # view updates
|
||||
```
|
||||
|
||||
**Push config changes:**
|
||||
```bash
|
||||
cd ~/.config/opencode
|
||||
git status # check changes
|
||||
git add command/ skill/ opencode.json
|
||||
git commit -m "feat: add new git skill"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
## Platform-Specific Considerations
|
||||
|
||||
### macOS/Linux
|
||||
|
||||
- **Commit language**: Use Chinese (中文)
|
||||
- **Multi-line commits**: Use heredoc with `cat <<'EOF'`
|
||||
- **Encoding**: UTF-8 without BOM (default)
|
||||
|
||||
### Windows
|
||||
|
||||
- **Commit language**: Use English only (Cursor Shell encoding issue)
|
||||
- **Multi-line commits**: Use multiple `-m` flags
|
||||
- **Prohibited methods**:
|
||||
- No Chinese commit messages
|
||||
- No `Out-File -Encoding utf8` (adds BOM)
|
||||
- No PowerShell here-strings `@"..."@`
|
||||
- No Write tool for temp files (encoding issues)
|
||||
|
||||
## Error Prevention
|
||||
|
||||
1. **Always check staging area first**: Don't commit empty staging area
|
||||
2. **Verify version file is staged**: After updating version, confirm with `git diff --cached --name-only`
|
||||
3. **No --amend after push**: Never amend commits that are already pushed
|
||||
4. **Tag naming conflicts**: Check existing tags before creating new ones
|
||||
5. **Branch protection**: Never force push to main/master without explicit user request
|
||||
6. **Sensitive data**: Never commit secrets, API keys, or credentials
|
||||
|
||||
## Integration with CI/CD
|
||||
|
||||
- **Tag annotations**: Used as Release notes
|
||||
- **Version consistency**: Git tag must match version file
|
||||
- **Automated releases**: Tags trigger CI/CD pipelines
|
||||
- **Semantic versioning**: CI/CD determines release type from version bump
|
||||
|
||||
## Quick Reference
|
||||
|
||||
**Check status:**
|
||||
```bash
|
||||
git status
|
||||
git diff --cached --name-only
|
||||
```
|
||||
|
||||
**Commit with tag:**
|
||||
```bash
|
||||
git commit -m "feat: add feature"
|
||||
git tag -a "1.2.0" -m "feat: add feature"
|
||||
git push origin main && git push origin 1.2.0
|
||||
```
|
||||
|
||||
**Push all tags:**
|
||||
```bash
|
||||
git push --tags
|
||||
```
|
||||
|
||||
**View recent history:**
|
||||
```bash
|
||||
git log --oneline -10
|
||||
git tag --list | sort -V | tail -5
|
||||
```
|
||||
|
||||
**View changes:**
|
||||
```bash
|
||||
git diff # unstaged changes
|
||||
git diff --cached # staged changes
|
||||
git diff main..feature # compare branches
|
||||
```
|
||||
663
skill/git/quick-reference.md
Normal file
663
skill/git/quick-reference.md
Normal file
@@ -0,0 +1,663 @@
|
||||
# Git Quick Reference
|
||||
|
||||
Quick reference guide for common Git operations.
|
||||
|
||||
## File Changes and Status
|
||||
|
||||
### View Changed Files
|
||||
|
||||
```bash
|
||||
# Show working directory status
|
||||
git status
|
||||
|
||||
# Show short status
|
||||
git status -s
|
||||
|
||||
# List changed files only (unstaged)
|
||||
git diff --name-only
|
||||
|
||||
# List changed files only (staged)
|
||||
git diff --cached --name-only
|
||||
# or
|
||||
git diff --staged --name-only
|
||||
|
||||
# Show file change statistics
|
||||
git diff --stat
|
||||
git diff --cached --stat
|
||||
```
|
||||
|
||||
### View Detailed Changes
|
||||
|
||||
```bash
|
||||
# View unstaged changes
|
||||
git diff
|
||||
|
||||
# View staged changes
|
||||
git diff --cached
|
||||
# or
|
||||
git diff --staged
|
||||
|
||||
# View specific file changes
|
||||
git diff <file-path>
|
||||
git diff --cached <file-path>
|
||||
|
||||
# View changes between commits
|
||||
git diff <commit1>..<commit2>
|
||||
git diff HEAD~1..HEAD
|
||||
|
||||
# View changes between branches
|
||||
git diff main..feature-branch
|
||||
```
|
||||
|
||||
## Staging and Committing
|
||||
|
||||
### Add Files to Staging
|
||||
|
||||
```bash
|
||||
# Add specific file
|
||||
git add <file-path>
|
||||
|
||||
# Add all files in directory
|
||||
git add .
|
||||
|
||||
# Add all files in repository
|
||||
git add -A
|
||||
|
||||
# Add files interactively
|
||||
git add -p
|
||||
|
||||
# Add only modified files (not new files)
|
||||
git add -u
|
||||
```
|
||||
|
||||
### Check Staging Area
|
||||
|
||||
```bash
|
||||
# List files in staging area
|
||||
git diff --cached --name-only
|
||||
|
||||
# Show detailed staged changes
|
||||
git diff --cached
|
||||
```
|
||||
|
||||
### Commit Changes
|
||||
|
||||
```bash
|
||||
# Simple commit
|
||||
git commit -m "feat: add user authentication"
|
||||
|
||||
# Multi-line commit (macOS/Linux)
|
||||
git commit -m "$(cat <<'EOF'
|
||||
feat: add user authentication
|
||||
|
||||
- Add OAuth2 support
|
||||
- Implement JWT tokens
|
||||
- Add login/logout endpoints
|
||||
EOF
|
||||
)"
|
||||
|
||||
# Multi-line commit (Windows)
|
||||
git commit -m "feat: add user authentication" \
|
||||
-m "" \
|
||||
-m "- Add OAuth2 support" \
|
||||
-m "- Implement JWT tokens" \
|
||||
-m "- Add login/logout endpoints"
|
||||
|
||||
# Commit with automatic staging
|
||||
git commit -am "fix: resolve issue"
|
||||
|
||||
# Amend last commit (before push only!)
|
||||
git commit --amend -m "new message"
|
||||
```
|
||||
|
||||
## Tag Management
|
||||
|
||||
### Create Tags
|
||||
|
||||
```bash
|
||||
# Create annotated tag
|
||||
git tag -a "1.2.0" -m "feat: add new feature"
|
||||
|
||||
# Create lightweight tag
|
||||
git tag "1.2.0"
|
||||
|
||||
# Create tag with multi-line message
|
||||
git tag -a "1.2.1" \
|
||||
-m "fix: resolve connection issue" \
|
||||
-m "" \
|
||||
-m "- Increase timeout to 30s" \
|
||||
-m "- Add retry mechanism"
|
||||
|
||||
# Create tag for specific commit
|
||||
git tag -a "1.2.0" <commit-hash> -m "message"
|
||||
|
||||
# Monorepo tag
|
||||
git tag -a "ios-1.2.0" -m "feat(ios): add feature"
|
||||
```
|
||||
|
||||
### List Tags
|
||||
|
||||
```bash
|
||||
# List all tags
|
||||
git tag
|
||||
|
||||
# List tags with pattern
|
||||
git tag -l "v1.*"
|
||||
|
||||
# List recent tags (sorted)
|
||||
git tag --list | sort -V | tail -5
|
||||
|
||||
# Show tag details
|
||||
git show <tag-name>
|
||||
```
|
||||
|
||||
### Push Tags
|
||||
|
||||
```bash
|
||||
# Push single tag
|
||||
git push origin <tag-name>
|
||||
|
||||
# Push all tags
|
||||
git push --tags
|
||||
# or
|
||||
git push origin --tags
|
||||
|
||||
# Push commit and tag together
|
||||
git push origin main && git push origin 1.2.0
|
||||
```
|
||||
|
||||
### Delete Tags
|
||||
|
||||
```bash
|
||||
# Delete local tag
|
||||
git tag -d <tag-name>
|
||||
|
||||
# Delete remote tag
|
||||
git push origin --delete <tag-name>
|
||||
# or
|
||||
git push origin :refs/tags/<tag-name>
|
||||
|
||||
# Delete multiple tags
|
||||
git tag -d tag1 tag2 tag3
|
||||
```
|
||||
|
||||
## Branch Operations
|
||||
|
||||
### View Branches
|
||||
|
||||
```bash
|
||||
# Show current branch
|
||||
git branch --show-current
|
||||
|
||||
# List local branches
|
||||
git branch
|
||||
|
||||
# List all branches (local + remote)
|
||||
git branch -a
|
||||
|
||||
# List remote branches only
|
||||
git branch -r
|
||||
|
||||
# Show branch with last commit
|
||||
git branch -v
|
||||
```
|
||||
|
||||
### Create and Switch Branches
|
||||
|
||||
```bash
|
||||
# Create new branch
|
||||
git branch <branch-name>
|
||||
|
||||
# Create and switch to new branch (old way)
|
||||
git checkout -b <branch-name>
|
||||
|
||||
# Create and switch to new branch (modern)
|
||||
git switch -c <branch-name>
|
||||
|
||||
# Switch to existing branch (old way)
|
||||
git checkout <branch-name>
|
||||
|
||||
# Switch to existing branch (modern)
|
||||
git switch <branch-name>
|
||||
|
||||
# Switch to previous branch
|
||||
git switch -
|
||||
```
|
||||
|
||||
### Delete Branches
|
||||
|
||||
```bash
|
||||
# Delete local branch (safe)
|
||||
git branch -d <branch-name>
|
||||
|
||||
# Delete local branch (force)
|
||||
git branch -D <branch-name>
|
||||
|
||||
# Delete remote branch
|
||||
git push origin --delete <branch-name>
|
||||
# or
|
||||
git push origin :<branch-name>
|
||||
```
|
||||
|
||||
## Pushing and Pulling
|
||||
|
||||
### Push Changes
|
||||
|
||||
```bash
|
||||
# Push current branch
|
||||
git push
|
||||
|
||||
# Push to specific remote and branch
|
||||
git push origin main
|
||||
|
||||
# Push current branch to remote
|
||||
git push origin $(git branch --show-current)
|
||||
|
||||
# Push with upstream tracking
|
||||
git push -u origin <branch-name>
|
||||
|
||||
# Push all branches
|
||||
git push --all
|
||||
|
||||
# Push all tags
|
||||
git push --tags
|
||||
|
||||
# Force push (dangerous!)
|
||||
git push --force
|
||||
# Better: force push with lease
|
||||
git push --force-with-lease
|
||||
```
|
||||
|
||||
### Pull Changes
|
||||
|
||||
```bash
|
||||
# Pull from tracked remote
|
||||
git pull
|
||||
|
||||
# Pull from specific remote and branch
|
||||
git pull origin main
|
||||
|
||||
# Pull with rebase
|
||||
git pull --rebase
|
||||
|
||||
# Pull and prune deleted remote branches
|
||||
git pull --prune
|
||||
```
|
||||
|
||||
### Fetch Changes
|
||||
|
||||
```bash
|
||||
# Fetch from all remotes
|
||||
git fetch
|
||||
|
||||
# Fetch from specific remote
|
||||
git fetch origin
|
||||
|
||||
# Fetch and prune deleted remote branches
|
||||
git fetch --prune
|
||||
|
||||
# Fetch all branches and tags
|
||||
git fetch --all --tags
|
||||
```
|
||||
|
||||
## History and Logs
|
||||
|
||||
### View Commit History
|
||||
|
||||
```bash
|
||||
# View recent commits
|
||||
git log
|
||||
|
||||
# View compact history
|
||||
git log --oneline
|
||||
|
||||
# View recent 10 commits
|
||||
git log --oneline -10
|
||||
|
||||
# View history with graph
|
||||
git log --graph --oneline --all
|
||||
|
||||
# View history with stats
|
||||
git log --stat
|
||||
|
||||
# View history with patches
|
||||
git log -p
|
||||
```
|
||||
|
||||
### Search History
|
||||
|
||||
```bash
|
||||
# Search commits by message
|
||||
git log --grep="feature"
|
||||
|
||||
# Search by author
|
||||
git log --author="John"
|
||||
|
||||
# Search by date
|
||||
git log --since="2024-01-01"
|
||||
git log --after="2 weeks ago"
|
||||
git log --before="yesterday"
|
||||
|
||||
# Search by file
|
||||
git log -- <file-path>
|
||||
|
||||
# Search code changes
|
||||
git log -S "function_name"
|
||||
```
|
||||
|
||||
### View Commit Details
|
||||
|
||||
```bash
|
||||
# Show specific commit
|
||||
git show <commit-hash>
|
||||
|
||||
# Show specific tag
|
||||
git show <tag-name>
|
||||
|
||||
# Show HEAD commit
|
||||
git show HEAD
|
||||
|
||||
# Show previous commit
|
||||
git show HEAD~1
|
||||
git show HEAD^
|
||||
```
|
||||
|
||||
## Undoing Changes
|
||||
|
||||
### Discard Changes
|
||||
|
||||
```bash
|
||||
# Discard unstaged changes in file
|
||||
git checkout -- <file-path>
|
||||
# or (modern)
|
||||
git restore <file-path>
|
||||
|
||||
# Discard all unstaged changes
|
||||
git checkout -- .
|
||||
# or (modern)
|
||||
git restore .
|
||||
|
||||
# Unstage file (keep changes)
|
||||
git reset HEAD <file-path>
|
||||
# or (modern)
|
||||
git restore --staged <file-path>
|
||||
|
||||
# Unstage all files
|
||||
git reset HEAD
|
||||
# or (modern)
|
||||
git restore --staged .
|
||||
```
|
||||
|
||||
### Reset Commits
|
||||
|
||||
```bash
|
||||
# Undo last commit, keep changes staged
|
||||
git reset --soft HEAD~1
|
||||
|
||||
# Undo last commit, keep changes unstaged
|
||||
git reset HEAD~1
|
||||
# or
|
||||
git reset --mixed HEAD~1
|
||||
|
||||
# Undo last commit, discard changes (dangerous!)
|
||||
git reset --hard HEAD~1
|
||||
|
||||
# Reset to specific commit
|
||||
git reset --hard <commit-hash>
|
||||
```
|
||||
|
||||
### Revert Commits
|
||||
|
||||
```bash
|
||||
# Create new commit that undoes a commit
|
||||
git revert <commit-hash>
|
||||
|
||||
# Revert without committing
|
||||
git revert -n <commit-hash>
|
||||
|
||||
# Revert multiple commits
|
||||
git revert <commit1>..<commit2>
|
||||
```
|
||||
|
||||
## Stash Operations
|
||||
|
||||
### Save Changes
|
||||
|
||||
```bash
|
||||
# Stash current changes
|
||||
git stash
|
||||
|
||||
# Stash with message
|
||||
git stash save "work in progress"
|
||||
|
||||
# Stash including untracked files
|
||||
git stash -u
|
||||
|
||||
# Stash including untracked and ignored files
|
||||
git stash -a
|
||||
```
|
||||
|
||||
### Apply Stash
|
||||
|
||||
```bash
|
||||
# Apply most recent stash
|
||||
git stash apply
|
||||
|
||||
# Apply and remove from stash list
|
||||
git stash pop
|
||||
|
||||
# Apply specific stash
|
||||
git stash apply stash@{2}
|
||||
```
|
||||
|
||||
### Manage Stash
|
||||
|
||||
```bash
|
||||
# List all stashes
|
||||
git stash list
|
||||
|
||||
# Show stash changes
|
||||
git stash show
|
||||
git stash show -p
|
||||
|
||||
# Drop specific stash
|
||||
git stash drop stash@{1}
|
||||
|
||||
# Clear all stashes
|
||||
git stash clear
|
||||
```
|
||||
|
||||
## Remote Operations
|
||||
|
||||
### View Remotes
|
||||
|
||||
```bash
|
||||
# List remotes
|
||||
git remote
|
||||
|
||||
# List remotes with URLs
|
||||
git remote -v
|
||||
|
||||
# Show remote details
|
||||
git remote show origin
|
||||
```
|
||||
|
||||
### Manage Remotes
|
||||
|
||||
```bash
|
||||
# Add remote
|
||||
git remote add <name> <url>
|
||||
|
||||
# Remove remote
|
||||
git remote remove <name>
|
||||
|
||||
# Rename remote
|
||||
git remote rename <old-name> <new-name>
|
||||
|
||||
# Change remote URL
|
||||
git remote set-url <name> <new-url>
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### View Configuration
|
||||
|
||||
```bash
|
||||
# View all config
|
||||
git config --list
|
||||
|
||||
# View global config
|
||||
git config --global --list
|
||||
|
||||
# View local config
|
||||
git config --local --list
|
||||
|
||||
# View specific config
|
||||
git config user.name
|
||||
git config user.email
|
||||
```
|
||||
|
||||
### Set Configuration
|
||||
|
||||
```bash
|
||||
# Set user name
|
||||
git config --global user.name "Your Name"
|
||||
|
||||
# Set user email
|
||||
git config --global user.email "your.email@example.com"
|
||||
|
||||
# Set default branch name
|
||||
git config --global init.defaultBranch main
|
||||
|
||||
# Set default editor
|
||||
git config --global core.editor "code --wait"
|
||||
|
||||
# Set credential helper
|
||||
git config --global credential.helper store
|
||||
```
|
||||
|
||||
## Workflow Examples
|
||||
|
||||
### Standard Commit and Tag Workflow
|
||||
|
||||
```bash
|
||||
# 1. Check status
|
||||
git status
|
||||
git diff --cached --name-only
|
||||
|
||||
# 2. Stage changes
|
||||
git add .
|
||||
|
||||
# 3. Commit
|
||||
git commit -m "feat: add user authentication"
|
||||
|
||||
# 4. Create tag
|
||||
git tag -a "1.2.0" -m "feat: add user authentication"
|
||||
|
||||
# 5. Push commit and tag
|
||||
git push origin main
|
||||
git push origin 1.2.0
|
||||
```
|
||||
|
||||
### Complete Staging to Push Workflow
|
||||
|
||||
```bash
|
||||
# Check what files changed
|
||||
git status
|
||||
|
||||
# View changes
|
||||
git diff
|
||||
|
||||
# Stage specific files
|
||||
git add src/auth.js src/api.js
|
||||
|
||||
# Verify staging
|
||||
git diff --cached --name-only
|
||||
|
||||
# Commit with message
|
||||
git commit -m "feat: implement OAuth2 authentication"
|
||||
|
||||
# Push to remote
|
||||
git push origin main
|
||||
```
|
||||
|
||||
### Push All Tags Workflow
|
||||
|
||||
```bash
|
||||
# List local tags
|
||||
git tag
|
||||
|
||||
# View recent tags
|
||||
git tag --list | sort -V | tail -5
|
||||
|
||||
# Push all tags to remote
|
||||
git push --tags
|
||||
|
||||
# Verify tags on remote
|
||||
git ls-remote --tags origin
|
||||
```
|
||||
|
||||
### Quick Status Check
|
||||
|
||||
```bash
|
||||
# Full status
|
||||
git status
|
||||
|
||||
# Changed files only
|
||||
git diff --name-only
|
||||
git diff --cached --name-only
|
||||
|
||||
# Recent commits and tags
|
||||
git log --oneline -5
|
||||
git tag --list | sort -V | tail -5
|
||||
|
||||
# Current branch
|
||||
git branch --show-current
|
||||
```
|
||||
|
||||
## Tips and Tricks
|
||||
|
||||
### Aliases
|
||||
|
||||
Add to `~/.gitconfig`:
|
||||
|
||||
```ini
|
||||
[alias]
|
||||
st = status
|
||||
co = checkout
|
||||
br = branch
|
||||
ci = commit
|
||||
unstage = restore --staged
|
||||
last = log -1 HEAD
|
||||
lg = log --graph --oneline --all
|
||||
tags = tag -l --sort=-v:refname
|
||||
```
|
||||
|
||||
Usage:
|
||||
```bash
|
||||
git st
|
||||
git co main
|
||||
git lg
|
||||
```
|
||||
|
||||
### Useful One-Liners
|
||||
|
||||
```bash
|
||||
# Delete all merged branches
|
||||
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
|
||||
|
||||
# View file in specific commit
|
||||
git show <commit>:<file-path>
|
||||
|
||||
# Count commits by author
|
||||
git shortlog -sn
|
||||
|
||||
# Find when a line was changed
|
||||
git blame <file-path>
|
||||
|
||||
# Show what changed in each commit for a file
|
||||
git log -p <file-path>
|
||||
|
||||
# List files in a commit
|
||||
git diff-tree --no-commit-id --name-only -r <commit>
|
||||
```
|
||||
Reference in New Issue
Block a user