In the fast-paced world of software development, efficiency is paramount. Every keystroke saved, every minute optimized, contributes to a smoother, more productive workflow. Recently, a cryptic Git one-liner from "leaked docs" sparked a flurry of interest across developer communities, hinting at the existence of powerful, yet often overlooked, Git commands that could unlock new levels of productivity. At CoddyKit, we believe in empowering developers with the knowledge to master their tools, and today, we're diving deep into the realm of advanced Git productivity.

Beyond the familiar git add, git commit, and git push, lies a treasure trove of commands designed to tackle complex scenarios, streamline collaboration, and even rewrite history with surgical precision. This comprehensive guide is crafted for intermediate to senior developers eager to elevate their Git game, providing practical insights, real-world use cases, and expert tips to transform your version control experience.

Beyond the Basics: Unearthing Git's Power Tools

While the core Git commands are sufficient for daily tasks, truly mastering Git means understanding its more specialized utilities. These commands are not just obscure; they are game-changers for specific, often challenging, development scenarios.

git worktree: Managing Multiple Contexts Simultaneously

Imagine needing to work on a hotfix for production while simultaneously developing a new feature on a separate branch. Traditionally, this involves stashing your changes, switching branches, applying the hotfix, then switching back and unstashing. This context switching can be disruptive and error-prone. Enter git worktree.

git worktree allows you to create multiple working directories, each pointing to a different branch or commit, all sharing the same underlying repository. This means you can have several branches checked out simultaneously, each in its own directory, without interfering with each other.

Real-World Use Cases:

  • Hotfixes & Urgent Patches: Immediately switch to a production branch in a new worktree to apply a fix, without disturbing your ongoing feature development.
  • Feature Development & Experimentation: Work on a new feature in one worktree, while keeping your main branch clean and ready for pulls in another.
  • Testing Multiple Versions: Test different versions of your application (e.g., a release branch and a development branch) side-by-side.
  • Code Reviews: Easily check out a colleague's branch for review in a separate worktree without disrupting your own work.

Pros:

  • Eliminates Context Switching: No more stashing and unstashing.
  • Increased Productivity: Seamlessly jump between tasks.
  • Isolation: Each worktree is completely independent.

Cons:

  • Disk Space: Each worktree consumes additional disk space (though it shares most of the .git objects).
  • Management Overhead: Can lead to many directories if not managed well.

Example: Creating a New Worktree for a Hotfix

Let's say you're on your feature/new-dashboard branch, and an urgent bug report comes in for the main branch.

# From your main repository directory
git worktree add ../hotfix-prod main
# Now you have a new directory 'hotfix-prod' containing the 'main' branch
cd ../hotfix-prod
# Apply your fix, commit, and push
git add .
git commit -m "FIX: Urgent production bug"
git push origin main
# Go back to your feature development
cd ../my-repo
# ... continue working on feature/new-dashboard

Once the hotfix is deployed, you can remove the worktree:

git worktree remove ../hotfix-prod
# Or, if you're in the main repo and the worktree directory is empty
git worktree prune

git rerere: Reusing Recorded Resolutions for Merge Conflicts

Have you ever encountered the same merge conflict repeatedly, especially when frequently rebasing a long-lived feature branch onto a rapidly evolving main branch? It's tedious to resolve the same conflict logic multiple times. git rerere (REuse REcorded REsolutions) is Git's answer to this frustration.

When enabled, git rerere records how you resolve a merge conflict. The next time Git encounters the exact same conflict, it will attempt to automatically apply your previous resolution, saving you valuable time and effort.

Real-World Use Cases:

  • Long-Lived Feature Branches: Constantly rebasing onto main, encountering recurring conflicts.
  • Shared Configuration Files: Teams often have conflicts in configuration files that are resolved similarly.
  • Applying Patches: Repeatedly applying a patch that conflicts with a common base.

Pros:

  • Massive Time Saver: Automates resolution of recurring conflicts.
  • Consistency: Ensures conflicts are resolved consistently.

Cons:

  • Context Sensitivity: If the surrounding code changes significantly, rerere might apply an outdated resolution, potentially leading to subtle bugs. Always review auto-resolved conflicts.
  • Initial Setup: Requires explicit enablement.

Example: Enabling and Using git rerere

First, enable rerere globally or for a specific repository:

git config --global rerere.enabled true
# Or per-repo:
# git config rerere.enabled true

Now, perform a rebase or merge that causes a conflict. Resolve the conflict as usual, then add and continue:

git rebase main
# ... conflicts occur ...
# Resolve conflicts in your editor
git add .
git rebase --continue

The resolution is now recorded. The next time you rebase and the same conflict appears, Git will output something like:

CONFLICT (content): Merge conflict in file.txt
Recorded resolution for 'file.txt'.
Automatic merge failed; fix conflicts and then commit the result.

Wait, "Automatic merge failed"? Yes, that's Git telling you it tried to apply the resolution. If it was fully successful, you wouldn't even see the conflict. If it only partially resolved, or the context changed slightly, you might still need to intervene. However, often it will resolve it fully and you'll just see a message like "Resolved 'file.txt' using previous resolution." and the rebase will proceed without stopping.

Surgical History Rewriting and Cleanup

Sometimes, the past needs a little tidying up. Whether it's removing sensitive data, shrinking a bloated repository, or simply making your commit history more readable, Git offers powerful, albeit destructive, tools for rewriting history.

git filter-repo (Modern History Rewriting)

For significant history rewriting, git filter-branch was the traditional tool. However, it's notoriously slow, complex, and prone to errors. Git 2.22+ introduced git filter-repo (a separate tool, recommended by Git maintainers), which is significantly faster and safer for complex operations like removing large files or sensitive data.

Note: git filter-repo is a standalone script and needs to be installed separately (e.g., via pip: pip install git-filter-repo). Always back up your repository before using any history-rewriting command, and communicate with your team, as this changes shared history.

Real-World Use Cases:

  • Removing Large Files: Accidentally committed a large binary or archive? filter-repo can purge it from all history, shrinking your repository size.
  • Stripping Sensitive Data: Remove passwords, API keys, or personal information committed by mistake.
  • Global Email/Author Changes: Correct author information across the entire commit history.
  • Splitting a Repository: Extract a subdirectory into a new, independent Git repository.

Pros:

  • Extremely Powerful: Can perform almost any history transformation.
  • Fast & Efficient: Far superior to git filter-branch.
  • Cleaner History: Results in a more manageable and often smaller repository.

Cons:

  • Destructive: Irreversibly changes commit SHAs.
  • Requires Force Push: After rewriting, you must force push, affecting all collaborators.
  • Installation: Not bundled with Git, requires separate installation.

Example: Removing a Large File from History

Let's say you accidentally committed a large dump.sql file, and now your repo is bloated.

# 1. Install git-filter-repo if you haven't already
# pip install git-filter-repo

# 2. Make a bare clone as a backup (CRITICAL!)
# git clone --mirror your-repo.git backup-repo.git

# 3. Navigate to your working repository
cd my-project

# 4. Run filter-repo to remove the file
git filter-repo --path dump.sql --invert-paths --force
# This command keeps all paths *except* dump.sql, effectively removing it.
# The --force flag is needed if you have uncommitted changes or untracked files.

# 5. Push the rewritten history (communicate with your team first!)
git push --force --all
git push --force --tags

# 6. Instruct team members to re-clone or rebase their work
# (The best way is usually for everyone to delete their local clone and re-clone)

This is a powerful operation that requires careful coordination, especially in a team environment. Always ensure everyone is aware and has pulled the latest changes before the rewrite, and then re-clones or rebases after the force push.

git reflog: Your Repository's Safety Net

Ever accidentally git reset --hard too far, or deleted a branch only to realize you needed a commit from it? The git reflog is your best friend in these moments of panic. It's a record of every point your HEAD has ever pointed to, across all branches, even if those branches no longer exist.

Think of reflog as a local, time-stamped journal of your repository's activity. It tracks references like HEAD@{0}, HEAD@{1}, etc., representing the state of your HEAD at specific past moments.

Real-World Use Cases:

  • Recovering Lost Commits: Easily find and recover commits that seem to have vanished after a destructive rebase or reset.
  • Undoing Mistakes: Revert to a previous state of your repository, even if you've already committed changes.
  • Understanding History: Trace your steps and understand how your HEAD moved over time.

Pros:

  • Invaluable for Disaster Recovery: The ultimate undo button for local changes.
  • Simple to Use: Just git reflog to see the history.

Cons:

  • Local Only: The reflog is specific to your local repository; it's not shared with remotes.
  • Entries Expire: Reflog entries are eventually pruned (default is 90 days for reachable entries, 30 days for unreachable).

Example: Recovering a Lost Commit

You're on feature/login and accidentally run git reset --hard origin/main, losing your last three commits on feature/login.

# 1. Realize your mistake
git status # Oh no, my changes are gone!

# 2. Check the reflog
git reflog
# Output might look like:
# a1b2c3d HEAD@{0}: reset: moving to origin/main
# e4f5g6h HEAD@{1}: commit: Add login form validation
# i7j8k9l HEAD@{2}: commit: Implement basic login page
# ...

# 3. Find the commit hash before the reset (e.g., e4f5g6h)

# 4. Reset to that commit
git reset --hard e4f5g6h
# Your commits are back!

The reflog is a powerful safety net. Get comfortable using it, and you'll fear destructive Git commands much less.

git blame (with advanced options): Understanding Code Provenance

git blame shows who last modified each line of a file. While often associated with finding "who broke it," its true power lies in understanding code evolution, context, and why certain decisions were made. Advanced options make it even more insightful.

Real-World Use Cases:

  • Debugging: Identify the commit that introduced a bug and the developer who made the change.
  • Code Understanding: Understand the history of a complex piece of code or a specific function.
  • Refactoring: Determine if a section of code is old and rarely touched, or frequently modified.

Pros:

  • Pinpoints Changes: Quickly identifies the commit and author for any line.
  • Historical Context: Helps understand the "why" behind code.

Cons:

  • Can Be Misleading: Blame only shows the last change to a line, not necessarily the original author or the change that introduced a bug in a different part of the system.
  • Noise: Without options, can be overwhelming for large files.

Example: Using git blame with Options

Let's say you want to blame a file, but ignore whitespace-only changes, and track lines moved within the same file or across files.

git blame -w -M -C my_module.py
# -w: Ignore whitespace changes when assigning blame.
# -M: Detect moved or copied lines within a file.
# -C: Detect moved or copied lines from other files. (Use -CCC for more aggressive detection)

This provides a much cleaner and more accurate view of true code authorship, helping you differentiate between formatting changes and actual logic modifications.

Streamlining Collaboration and Review Workflows

Effective collaboration is the backbone of successful software development. Git offers commands that facilitate smoother code reviews, targeted changes, and cleaner shared history.

git cherry-pick (Advanced Usage): Applying Specific Commits

git cherry-pick allows you to apply the changes introduced by one or more existing commits to your current branch. While straightforward for single commits, its advanced use involves understanding when and how it differs from merging or rebasing.

Real-World Use Cases:

  • Backporting Hotfixes: Apply a critical bug fix from a development branch to a release branch without merging the entire development branch.
  • Applying a Commit from a Wrong Branch: You accidentally commit to main instead of your feature branch. Cherry-pick the commit to your feature branch, then revert it from main.
  • Selecting Specific Features: Pick only relevant commits from a large experimental branch.

Pros:

  • Granular Control: Apply only the exact commits you need.
  • Avoids Merging Entire Branches: Keeps target branch history clean.

Cons:

  • Duplicate Commits: Cherry-picking creates new commits with new SHAs, leading to duplicate content if the original commit is later merged. This can complicate future merges.
  • Potential for Conflicts: Like merging, cherry-picking can introduce conflicts.
  • History Can Be Messy: Overuse can lead to a fragmented history.

Example: Cherry-Picking a Hotfix

You have a hotfix/critical-bug branch with commit abcde12 that fixes a critical issue. You need this fix on your release/v1.0 branch immediately, but hotfix/critical-bug isn't ready for a full merge.

# 1. Switch to the target branch
git checkout release/v1.0

# 2. Cherry-pick the hotfix commit
git cherry-pick abcde12
# If conflicts occur, resolve them, then git add . and git cherry-pick --continue

# 3. Push the updated release branch
git push origin release/v1.0

Expert Tip: When cherry-picking multiple commits, consider using git cherry-pick <commit1>..<commitN> to pick a range, or git cherry-pick -n to apply changes without committing, allowing you to combine them into a single commit later.

git rebase -i (Interactive Rebase, Advanced Scenarios)

Interactive rebase (git rebase -i) is a powerful tool for cleaning up your commit history before sharing it. It allows you to reorder, squash, edit, split, and even drop commits. While basic interactive rebase is common, mastering its advanced capabilities is key to a pristine commit history.

Real-World Use Cases:

  • Cleaning Feature Branches: Before merging into main, squash multiple "WIP" commits into logical, atomic changes.
  • Splitting Large Commits: Break down a single, sprawling commit into several smaller, focused ones.
  • Fixing Commit Messages: Correct typos or improve clarity in past commit messages.
  • Reordering Commits: Arrange commits in a more logical sequence.

Pros:

  • Clean, Linear History: Makes your project history much easier to read and understand.
  • Improved Code Review: Reviewers see well-structured, atomic changes.
  • Easier Debugging: With atomic commits, git bisect becomes more effective.

Cons:

  • Destructive: Changes commit SHAs, requiring force pushes if the branch is already shared.
  • Complexity: Can be intimidating and error-prone for beginners.
  • Team Coordination: Avoid rewriting history on shared branches.

Example: Interactive Rebase to Squash Commits

You've been working on a feature and have several commits like "WIP: initial layout", "Fix typo", "Add styling", "WIP: functionality", and you want to combine them into a single, clean commit before merging.

# 1. Determine how many commits back you want to rebase
# (e.g., if you have 5 commits on your feature branch)
git rebase -i HEAD~5
# Or rebase onto a specific base branch/commit
# git rebase -i main

Git will open your default editor with a list of commits and instructions:

pick 1a2b3c4 WIP: initial layout
pick d4e5f67 Fix typo
pick g7h8i9j Add styling
pick k1l2m3n WIP: functionality
pick o4p5q6r Add final touches

# Rebase 1a2b3c4..o4p5q6r onto 1a2b3c4 (5 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (e.g. `git reset --hard HEAD` to abort)
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here, that commit will be removed from the history.
# However, if you remove everything, the rebase will be aborted.
#

To squash, change pick to squash (or s) for the commits you want to combine into the previous one. Keep the first commit as pick.

pick 1a2b3c4 feat: implement new dashboard layout
s d4e5f67 refactor: improve styling for dashboard
s g7h8i9j feat: add dashboard data fetching
s k1l2m3n fix: address minor layout issues
s o4p5q6r docs: update dashboard usage guide

Save and close the editor. Git will then open another editor to combine the commit messages. Clean it up to create a single, meaningful message for your new, squashed commit. This results in a much cleaner history for your feature branch, making it easier to review and merge into main.

git shortlog: Summarizing Contributor Activity

When you need a quick overview of who contributed what, git shortlog is an excellent tool. It summarizes git log output, grouping commits by author and providing a concise list of their commit messages.

Real-World Use Cases:

  • Release Notes: Generate a list of changes and authors for a specific release.
  • Team Activity Overview: See who has been active and what they've been working on.
  • Contributor Recognition: Acknowledge contributions in project documentation.

Pros:

  • Fast Summary: Provides a quick, human-readable overview.
  • Configurable: Can be customized with various options.

Cons:

  • Limited Detail: Not suitable for deep analysis of individual commits.

Example: Generating a Shortlog for a Release

To see all commits since the last tag, grouped by author:

git shortlog v1.0..HEAD
# -s: Show commit counts only (summary)
# -n: Sort by commit count (numeric)
# -e: Show email address next to name
git shortlog -s -n -e

This will output a clean list like:

  123  John Doe <john.doe@example.com>
   87  Jane Smith <jane.smith@example.com>
   45  Alice Brown <alice.brown@example.com>

Optimizing Your Local Repository

Even your local Git repository benefits from occasional maintenance. These commands help keep your local clone lean and efficient.

git gc: Garbage Collection for a Leaner Repo

git gc (garbage collect) cleans up unnecessary files and packs your repository data, reducing its size and improving performance. Git automatically runs gc periodically, but manual execution can be useful for very large, old, or frequently updated repositories.

Real-World Use Cases:

  • Shrinking Large Repositories: After significant history rewriting (e.g., with git filter-repo), gc is essential.
  • Improving Performance: Packed objects are faster to access.
  • Cleaning Up Dangling Objects: Removes objects that are no longer referenced by any commit.

Pros:

  • Reduced Disk Space: Saves storage.
  • Improved Performance: Faster Git operations.

Cons:

  • Usually Automatic: Manual intervention is often not necessary.
  • Can Take Time: For very large repositories, gc can be a lengthy process.

Example: Manually Running Garbage Collection

git gc --prune=now
# --prune=now tells Git to immediately prune all unreferenced objects.
# By default, Git keeps unreferenced objects for 2 weeks before pruning.

git bundle: Packaging a Repository for Offline Transfer

git bundle allows you to package your Git repository (or a subset of its history) into a single file. This "bundle" file can then be transferred to another location (e.g., via USB drive, email, or a slow network) and treated like a remote repository.

Real-World Use Cases:

  • Offline Transfers: Move a repository between machines without network access.
  • Backup & Archiving: Create a self-contained, portable backup of a repository's history.
  • Sharing Specific Commits: Share a specific set of commits with a colleague without giving them full repo access.

Pros:

  • Portability: Single file for easy transfer.
  • Efficiency: Often smaller than a full clone, especially for partial history.

Cons:

  • Can Be Large: A full repository bundle can still be sizable.
  • One-Way (Typically): Designed for pushing/pulling from the bundle, not for direct modification of the bundle itself.

Example: Creating and Using a Git Bundle

To create a bundle containing all history of your main branch:

git bundle create my-repo-main.bundle main
# To include all branches and tags:
# git bundle create my-repo-full.bundle --all

To clone from the bundle:

git clone my-repo-main.bundle my-new-repo

You can also pull from a bundle into an existing repository:

git pull my-repo-main.bundle main

Customizing Git for Your Workflow

Git is incredibly configurable. Leveraging git config for advanced settings and aliases can significantly personalize your workflow and boost your productivity.

git config (Advanced Settings and Aliases): Personalizing Git

Beyond setting your name and email, git config allows for deep customization, from default merge strategies to powerful command aliases.

Real-World Use Cases:

  • Custom Aliases: Create shortcuts for frequently used or complex commands.
  • Diff/Merge Tools: Integrate your preferred graphical diff and merge tools (e.g., Beyond Compare, Meld).
  • Autocorrect: Enable Git to suggest corrections for typos in commands.
  • Default Push Behavior: Configure git push to avoid ambiguity.

Pros:

  • Tailored Experience: Make Git work exactly how you want it to.
  • Productivity Boost: Save keystrokes and reduce mental overhead.
  • Consistency: Enforce certain behaviors across your repositories.

Cons:

  • Over-Complication: Too many complex aliases can make Git harder to understand for others or even yourself later.
  • Configuration Drift: Different team members might have different configurations, leading to inconsistencies.

Example: Creating a Useful Alias and Setting Autocorrect

Let's create an alias for a common interactive rebase scenario and enable autocorrect:

# Alias for interactive rebase onto main
git config --global alias.rebasemain "rebase -i main"

# Alias for showing a pretty log graph
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

# Enable autocorrect for Git commands (e.g., `git comit` becomes `git commit`)
git config --global help.autocorrect 10 # 10 means wait 1 second before executing

Now, instead of git rebase -i main, you can just type git rebasemain. And git lg will give you a beautiful, colored log graph. This significantly enhances your advanced Git productivity.

Best Practices & Expert Tips

Mastering these advanced commands is only half the battle. Integrating them effectively into your workflow requires adherence to best practices.

  • Understand Before You Execute: Especially for destructive commands like filter-repo or rebase -i, always know what the command will do. Use git status, git log, and even git diff beforehand.
  • Backup, Backup, Backup: Before any major history rewrite, clone your repository as a backup (git clone --mirror). The reflog is a safety net, but a full backup is the ultimate safeguard.
  • Communicate with Your Team: If you're rewriting history on a shared branch (which should generally be avoided), always communicate with your team members beforehand. Explain the changes and provide clear instructions on how they should update their local repositories (usually by re-cloning).
  • Leverage Aliases Judiciously: Create aliases for commands you use often, but keep them intuitive. Avoid overly complex aliases that might confuse others or yourself in the long run.
  • Use a Graphical Git Client: For visualizing complex history, merges, or interactive rebases, tools like GitKraken, SourceTree, or the GitLens extension for VS Code can be incredibly helpful.
  • Regularly Prune Stale Branches: Keep your local repository clean by removing merged or deleted remote branches: git remote prune origin.
  • Explore Git Hooks: Automate tasks like linting, testing, or commit message validation using Git hooks (.git/hooks). This can significantly enhance team consistency and code quality.

Common Pitfalls & Trade-offs

With great power comes great responsibility. Advanced Git commands can be double-edged swords if not used carefully.

  • Force Pushing on Shared Branches: The cardinal sin of Git. Rewriting history and then force pushing a branch that others are actively working on will cause significant headaches and potential data loss for your team. Only force push to branches you own or after explicit team coordination.
  • Misunderstanding git reset vs. git revert: reset rewrites history by moving the branch pointer, revert creates a new commit that undoes previous changes. revert is generally safer for shared history.
  • Over-Reliance on git stash: While useful, a constantly growing stash list indicates a potential need for better branch management or git worktree usage.
  • Complexity vs. Clarity: While a perfectly linear history from rebase is aesthetically pleasing, sometimes a well-documented merge commit tells a clearer story of integration points, especially for complex features. Choose the strategy that best suits your team's workflow and project needs.
  • Team Coordination Challenges: Introducing advanced Git workflows requires buy-in and training for the entire team. Without it, you risk creating inconsistencies and confusion.

Current Trends & Future of Git Productivity

Git continues to evolve, with a constant focus on performance, scalability, and developer experience. Staying current with its developments is crucial for maximizing advanced Git productivity.

  • Performance Enhancements: Recent Git versions (e.g., Git 2.22+ and beyond) have seen significant performance improvements, particularly for large repositories and monorepos. Features like git sparse-checkout and git shallow clone are becoming more robust, allowing developers to work with only the necessary parts of massive codebases.
  • Monorepo Tooling: For organizations adopting monorepos, Git LFS (Large File Storage) for binary assets and tools like Microsoft's Scalar (a Git feature for Windows) are becoming essential for managing scale and performance.
  • IDE and CI/CD Integration: The seamless integration of Git commands within IDEs (like VS Code's built-in Git support or GitLens) and CI/CD pipelines continues to grow, automating more complex Git operations and feedback loops.
  • Focus on User Experience: Efforts are continuously being made to make Git more intuitive, especially for new users, while still providing the power for advanced users.

Key Takeaways

Mastering Git beyond the basics is a significant step towards becoming a more efficient and capable developer. The commands we've explored today—from git worktree for seamless context switching and git rerere for conflict automation, to git filter-repo for surgical history rewrites and git reflog as your ultimate safety net—are not just obscure tricks. They are powerful tools that, when understood and applied correctly, can dramatically enhance your advanced Git productivity and streamline your development workflow.

  • git worktree: For parallel development without context switching.
  • git rerere: Automate recurring merge conflict resolutions.
  • git filter-repo: Safely rewrite history (e.g., remove large files), with caution.
  • git reflog: Your local history lifeline for recovering lost commits.
  • git blame -w -M -C: Gain deeper insights into code authorship.
  • git cherry-pick: Apply specific commits selectively.
  • git rebase -i: Craft clean, linear commit histories before sharing.
  • git config aliases: Personalize Git for maximum efficiency.

Remember to always practice these commands in a safe environment, communicate with your team, and leverage the robust capabilities Git offers. The journey to Git mastery is ongoing, and CoddyKit is here to guide you every step of the way.

Ready to dive deeper into Git and other essential developer tools? Explore CoddyKit's extensive library of courses and tutorials!