summaryrefslogtreecommitdiff
path: root/Documentation/git-restore.adoc
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation/git-restore.adoc')
-rw-r--r--Documentation/git-restore.adoc219
1 files changed, 219 insertions, 0 deletions
diff --git a/Documentation/git-restore.adoc b/Documentation/git-restore.adoc
new file mode 100644
index 0000000000..961eef0137
--- /dev/null
+++ b/Documentation/git-restore.adoc
@@ -0,0 +1,219 @@
+git-restore(1)
+==============
+
+NAME
+----
+git-restore - Restore working tree files
+
+SYNOPSIS
+--------
+[synopsis]
+git restore [<options>] [--source=<tree>] [--staged] [--worktree] [--] <pathspec>...
+git restore [<options>] [--source=<tree>] [--staged] [--worktree] --pathspec-from-file=<file> [--pathspec-file-nul]
+git restore (-p|--patch) [<options>] [--source=<tree>] [--staged] [--worktree] [--] [<pathspec>...]
+
+DESCRIPTION
+-----------
+Restore specified paths in the working tree with some contents from a
+restore source. If a path is tracked but does not exist in the restore
+source, it will be removed to match the source.
+
+The command can also be used to restore the content in the index with
+`--staged`, or restore both the working tree and the index with
+`--staged --worktree`.
+
+By default, if `--staged` is given, the contents are restored from `HEAD`,
+otherwise from the index. Use `--source` to restore from a different commit.
+
+See "Reset, restore and revert" in linkgit:git[1] for the differences
+between the three commands.
+
+OPTIONS
+-------
+`-s <tree>`::
+`--source=<tree>`::
+ Restore the working tree files with the content from the given
+ tree. It is common to specify the source tree by naming a
+ commit, branch or tag associated with it.
++
+If not specified, the contents are restored from `HEAD` if `--staged` is
+given, otherwise from the index.
++
+As a special case, you may use `"<rev-A>...<rev-B>"` as a shortcut for the
+merge base of _<rev-A>_ and _<rev-B>_ if there is exactly one merge base. You can
+leave out at most one of _<rev-A>__ and _<rev-B>_, in which case it defaults to `HEAD`.
+
+`-p`::
+`--patch`::
+ Interactively select hunks in the difference between the
+ restore source and the restore location. See the "Interactive
+ Mode" section of linkgit:git-add[1] to learn how to operate
+ the `--patch` mode.
+
+include::diff-context-options.adoc[]
+
+`-W`::
+`--worktree`::
+`-S`::
+`--staged`::
+ Specify the restore location. If neither option is specified,
+ by default the working tree is restored. Specifying `--staged`
+ will only restore the index. Specifying both restores both.
+
+`-q`::
+`--quiet`::
+ Quiet, suppress feedback messages. Implies `--no-progress`.
+
+`--progress`::
+`--no-progress`::
+ Progress status is reported on the standard error stream
+ by default when it is attached to a terminal, unless `--quiet`
+ is specified. This flag enables progress reporting even if not
+ attached to a terminal, regardless of `--quiet`.
+
+`--ours`::
+`--theirs`::
+ When restoring files in the working tree from the index, use
+ stage #2 (`ours`) or #3 (`theirs`) for unmerged paths.
+ This option cannot be used when checking out paths from a
+ tree-ish (i.e. with the `--source` option).
++
+Note that during `git rebase` and `git pull --rebase`, `ours` and
+`theirs` may appear swapped. See the explanation of the same options
+in linkgit:git-checkout[1] for details.
+
+`-m`::
+`--merge`::
+ When restoring files on the working tree from the index,
+ recreate the conflicted merge in the unmerged paths.
+ This option cannot be used when checking out paths from a
+ tree-ish (i.e. with the `--source` option).
+
+`--conflict=<style>`::
+ The same as `--merge` option above, but changes the way the
+ conflicting hunks are presented, overriding the
+ `merge.conflictStyle` configuration variable. Possible values
+ are `merge` (default), `diff3`, and `zdiff3`.
+
+`--ignore-unmerged`::
+ When restoring files on the working tree from the index, do
+ not abort the operation if there are unmerged entries and
+ neither `--ours`, `--theirs`, `--merge` or `--conflict` is
+ specified. Unmerged paths on the working tree are left alone.
+
+`--ignore-skip-worktree-bits`::
+ In sparse checkout mode, the default is to only update entries
+ matched by _<pathspec>_ and sparse patterns in
+ `$GIT_DIR/info/sparse-checkout`. This option ignores the sparse
+ patterns and unconditionally restores any files in
+ _<pathspec>_.
+
+`--recurse-submodules`::
+`--no-recurse-submodules`::
+ If _<pathspec>_ names an active submodule and the restore location
+ includes the working tree, the submodule will only be updated if
+ this option is given, in which case its working tree will be
+ restored to the commit recorded in the superproject, and any local
+ modifications overwritten. If nothing (or
+ `--no-recurse-submodules`) is used, submodules working trees will
+ not be updated. Just like linkgit:git-checkout[1], this will detach
+ `HEAD` of the submodule.
+
+`--overlay`::
+`--no-overlay`::
+ In overlay mode, never remove files when restoring. In no-overlay mode,
+ remove tracked files that do not appear in the _<tree>_ of
+ `--source=<tree>`, to make them match _<tree>_ exactly. The default
+ is no-overlay mode.
+
+`--pathspec-from-file=<file>`::
+ Pathspec is passed in _<file>_ instead of commandline args. If
+ _<file>_ is exactly `-` then standard input is used. Pathspec
+ elements are separated by _LF_ or _CR_/_LF_. Pathspec elements can be
+ quoted as explained for the configuration variable `core.quotePath`
+ (see linkgit:git-config[1]). See also `--pathspec-file-nul` and
+ global `--literal-pathspecs`.
+
+`--pathspec-file-nul`::
+ Only meaningful with `--pathspec-from-file`. Pathspec elements are
+ separated with _NUL_ character and all other characters are taken
+ literally (including newlines and quotes).
+
+`--`::
+ Do not interpret any more arguments as options.
+
+`<pathspec>...`::
+ Limits the paths affected by the operation.
++
+For more details, see the 'pathspec' entry in linkgit:gitglossary[7].
+
+EXAMPLES
+--------
+
+The following sequence switches to the `master` branch, reverts the
+`Makefile` to two revisions back, deletes `hello.c` by mistake, and gets
+it back from the index.
+
+------------
+$ git switch master
+$ git restore --source master~2 Makefile <1>
+$ rm -f hello.c
+$ git restore hello.c <2>
+------------
+
+<1> take a file out of another commit
+<2> restore `hello.c` from the index
+
+If you want to restore _all_ C source files to match the version in
+the index, you can say
+
+------------
+$ git restore '*.c'
+------------
+
+Note the quotes around `*.c`. The file `hello.c` will also be
+restored, even though it is no longer in the working tree, because the
+file globbing is used to match entries in the index (not in the
+working tree by the shell).
+
+To restore all files in the current directory
+
+------------
+$ git restore .
+------------
+
+or to restore all working tree files with 'top' pathspec magic (see
+linkgit:gitglossary[7])
+
+------------
+$ git restore :/
+------------
+
+To restore a file in the index to match the version in `HEAD` (this is
+the same as using linkgit:git-reset[1])
+
+------------
+$ git restore --staged hello.c
+------------
+
+or you can restore both the index and the working tree (this is the same
+as using linkgit:git-checkout[1])
+
+------------
+$ git restore --source=HEAD --staged --worktree hello.c
+------------
+
+or the short form which is more practical but less readable:
+
+------------
+$ git restore -s@ -SW hello.c
+------------
+
+SEE ALSO
+--------
+linkgit:git-checkout[1],
+linkgit:git-reset[1]
+
+GIT
+---
+Part of the linkgit:git[1] suite