---
page_title: Managing Workspaces - Terraform CLI
description: >-
  Commands to list, select, create, and output workspaces. Workspaces help
  manage different groups of resources with one configuration.
---

# Managing Workspaces

In Terraform CLI, _workspaces_ are separate instances of
[state data](/language/state) that can be used from the same working
directory. You can use workspaces to manage multiple non-overlapping groups of
resources with the same configuration.

- Every [initialized working directory](/cli/init) has at least
  one workspace. (If you haven't created other workspaces, it is a workspace
  named `default`.)
- For a given working directory, only one workspace can be _selected_ at a time.
- Most Terraform commands (including [provisioning](/cli/run)
  and [state manipulation](/cli/state) commands) only interact
  with the currently selected workspace.
- Use [the `terraform workspace select` command](/cli/commands/workspace/select)
  to change the currently selected workspace.
- Use the [`terraform workspace list`](/cli/commands/workspace/list),
  [`terraform workspace new`](/cli/commands/workspace/new), and
  [`terraform workspace delete`](/cli/commands/workspace/delete) commands
  to manage the available workspaces in the current working directory.

-> **Note:** Terraform Cloud and Terraform CLI both have features called
"workspaces," but they're slightly different. Terraform Cloud's workspaces
behave more like completely separate working directories.

## The Purpose of Workspaces

Since most of the resources you can manage with Terraform don't include a unique
name as part of their configuration, it's common to use the same Terraform
configuration to provision multiple groups of similar resources.

Terraform relies on [state](/language/state) to associate resources with
real-world objects, so if you run the same configuration multiple times with
completely separate state data, Terraform can manage many non-overlapping groups
of resources. In some cases you'll want to change
[variable values](/language/values/variables) for these different
resource collections (like when specifying differences between staging and
production deployments), and in other cases you might just want many instances
of a particular infrastructure pattern.

The simplest way to maintain multiple instances of a configuration with
completely separate state data is to use multiple
[working directories](/cli/init) (with different
[backend](/language/settings/backends/configuration) configurations per directory, if you
aren't using the default `local` backend).

However, this isn't always the most _convenient_ way to handle separate states.
Terraform installs a separate cache of plugins and modules for each working
directory, so maintaining multiple directories can waste bandwidth and disk
space. You must also update your configuration code from version control
separately for each directory, reinitialize each directory separately when
changing the configuration, etc.

Workspaces allow you to use the same working copy of your configuration and the
same plugin and module caches, while still keeping separate states for each
collection of resources you manage.

## Interactions with Terraform Cloud Workspaces

Terraform Cloud organizes infrastructure using workspaces, but its workspaces
act more like completely separate working directories; each Terraform Cloud
workspace has its own Terraform configuration, set of variable values, state
data, run history, and settings.

These two kinds of workspaces are different, but related. When [using Terraform
CLI as a frontend for Terraform Cloud](/cli/cloud), you can associate the current working
directory with one or more remote workspaces. If you associate the
directory with multiple workspaces (using workspace tags), you can use the
`terraform workspace` commands to select which remote workspace to use.

Refer to [CLI-driven Runs](/cloud-docs/run/cli) in the Terraform Cloud documentation for more details about using Terraform CLI with Terraform Cloud.
