Browse Source
Previously the switching branch business of 'git checkout' becomes a new command 'switch'. This adds the restore command for the checking out paths path. Similar to git-switch, a new man page is added to describe what the command will become. The implementation will be updated shortly to match the man page. A couple main differences from 'git checkout <paths>': - 'restore' by default will only update worktree. This matters more when --source is specified ('checkout <tree> <paths>' updates both worktree and index). - 'restore --staged' can be used to restore the index. This command overlaps with 'git reset <paths>'. - both worktree and index could also be restored at the same time (from a tree) when both --staged and --worktree are specified. This overlaps with 'git checkout <tree> <paths>' - default source for restoring worktree and index is the index and HEAD respectively. A different (tree) source could be specified as with --source (*). - when both index and worktree are restored, --source must be specified since the default source for these two individual targets are different (**) - --no-overlay is enabled by default, if an entry is missing in the source, restoring means deleting the entry (*) I originally went with --from instead of --source. I still think --from is a better name. The short option -f however is already taken by force. And I do think short option is good to have, e.g. to write -s@ or -s@^ instead of --source=HEAD. (**) If you sit down and think about it, moving worktree's source from the index to HEAD makes sense, but nobody is really thinking it through when they type the commands. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint


13 changed files with 257 additions and 5 deletions
@ -0,0 +1,183 @@
@@ -0,0 +1,183 @@
|
||||
git-restore(1) |
||||
============== |
||||
|
||||
NAME |
||||
---- |
||||
git-restore - Restore working tree files |
||||
|
||||
SYNOPSIS |
||||
-------- |
||||
[verse] |
||||
'git restore' [<options>] [--source=<tree>] [--staged] [--worktree] <pathspec>... |
||||
'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, the restore sources for working tree and the index are the |
||||
index and `HEAD` respectively. `--source` could be used to specify a |
||||
commit as the restore source. |
||||
|
||||
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 default restore source for the working tree is |
||||
the index, and the default restore source for the index index is |
||||
`HEAD`. When both `--staged` and `--worktree` are specified, |
||||
`--source` must also be specified. |
||||
|
||||
-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. |
||||
+ |
||||
Note that `--patch` can accept no pathspec and will prompt to restore |
||||
all modified paths. |
||||
|
||||
-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. |
||||
+ |
||||
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. |
||||
|
||||
--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) and "diff3" (in addition to what is |
||||
shown by "merge" style, shows the original contents). |
||||
|
||||
--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, by 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>`. |
||||
|
||||
--overlay:: |
||||
--no-overlay:: |
||||
In overlay mode, the command never removes files when |
||||
restoring. In no-overlay mode, tracked files that do not |
||||
appear in the `--source` tree are removed, to make them match |
||||
`<tree>` exactly. The default is no-overlay mode. |
||||
|
||||
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 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 |
Loading…
Reference in new issue