v3 contains document and completion updates based on v2's feedback. It
also contains some extra git-checkout.txt updates (blame Eric for this,
he points out problems in git-switch.txt and makes me want to go fix
git-checkout.txt too).
The series is now based on 'master' (yay!)
Nguyễn Thái Ngọc Duy (21):
git-checkout.txt: spell out --no-option
git-checkout.txt: fix one syntax line
doc: document --overwrite-ignore
git-checkout.txt: fix monospace typeset
t: rename t2014-switch.sh to t2014-checkout-switch.sh
checkout: factor out some code in parse_branchname_arg()
checkout: make "opts" in cmd_checkout() a pointer
checkout: move 'confict_style' and 'dwim_..' to checkout_opts
checkout: split options[] array in three pieces
checkout: split part of it to new command 'switch'
switch: better names for -b and -B
switch: remove -l
switch: stop accepting pathspec
switch: reject "do nothing" case
switch: only allow explicit detached HEAD
switch: add short option for --detach
switch: no implicit dwim, use --guess to dwim
switch: no worktree status unless real branch switch happens
t: add tests for switch
completion: support switch
doc: promote "git switch"
.gitignore | 1 +
Documentation/config/advice.txt | 13 +-
Documentation/config/branch.txt | 4 +-
Documentation/config/checkout.txt | 17 +-
Documentation/config/diff.txt | 3 +-
Documentation/git-branch.txt | 12 +-
Documentation/git-check-ref-format.txt | 3 +-
Documentation/git-checkout.txt | 119 +++--
Documentation/git-format-patch.txt | 2 +-
Documentation/git-merge-base.txt | 2 +-
Documentation/git-merge.txt | 5 +
Documentation/git-rebase.txt | 2 +-
Documentation/git-remote.txt | 2 +-
Documentation/git-rerere.txt | 10 +-
Documentation/git-reset.txt | 20 +-
Documentation/git-stash.txt | 9 +-
Documentation/git-switch.txt | 259 ++++++++++
Documentation/gitattributes.txt | 3 +-
Documentation/gitcore-tutorial.txt | 19 +-
Documentation/giteveryday.txt | 24 +-
Documentation/githooks.txt | 8 +-
Documentation/gittutorial.txt | 4 +-
Documentation/gitworkflows.txt | 3 +-
Documentation/revisions.txt | 2 +-
Documentation/user-manual.txt | 56 +--
Makefile | 1 +
advice.c | 11 +-
builtin.h | 1 +
builtin/checkout.c | 471 +++++++++---------
command-list.txt | 1 +
contrib/completion/git-completion.bash | 27 +
git.c | 1 +
parse-options-cb.c | 17 +
parse-options.h | 1 +
sha1-name.c | 2 +-
t/t1090-sparse-checkout-scope.sh | 14 -
...014-switch.sh => t2014-checkout-switch.sh} | 0
t/t2020-checkout-detach.sh | 16 +-
t/t2060-switch.sh | 87 ++++
39 files changed, 837 insertions(+), 415 deletions(-)
create mode 100644 Documentation/git-switch.txt
rename t/{t2014-switch.sh => t2014-checkout-switch.sh} (100%)
create mode 100755 t/t2060-switch.sh
Range-diff dựa trên v2:
-: ---------- > 1: 949f3dd4fd git-checkout.txt: spell out --no-option
1: 8358b9ca36 = 2: 1ddbbae3e2 git-checkout.txt: fix one syntax line
2: 1686ccbf8d ! 3: b0cb2372db doc: document --overwrite-ignore
@@ -14,14 +14,15 @@
out anyway. In other words, the ref can be held by more than one
worktree.
-+--[no-]overwrite-ignore::
++--overwrite-ignore::
++--no-overwrite-ignore::
+ Silently overwrite ignored files when switching branches. This
-+ is the default behavior. Use --no-overwrite-ignore to abort
++ is the default behavior. Use `--no-overwrite-ignore` to abort
+ the operation when the new branch contains ignored files.
+
- --[no-]recurse-submodules::
+ --recurse-submodules::
+ --no-recurse-submodules::
Using --recurse-submodules will update the content of all initialized
- submodules according to the commit recorded in the superproject. If
diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt
--- a/Documentation/git-merge.txt
@@ -30,9 +31,10 @@
Allow the rerere mechanism to update the index with the
result of auto-conflict resolution if possible.
-+--[no-]overwrite-ignore::
++--overwrite-ignore::
++--no-overwrite-ignore::
+ Silently overwrite ignored files from the merge result. This
-+ is the default behavior. Use --no-overwrite-ignore to abort.
++ is the default behavior. Use `--no-overwrite-ignore` to abort.
+
--abort::
Abort the current conflict resolution process, and
-: ---------- > 4: 5b165524d1 git-checkout.txt: fix monospace typeset
3: 1e34862ad8 = 5: a4240a888e t: rename t2014-switch.sh to
t2014-checkout-switch.sh
4: aba8f41f73 = 6: dc4a8e8933 checkout: factor out some code in
parse_branchname_arg()
5: f165322652 = 7: f0d933c2ac checkout: make "opts" in cmd_checkout() a
pointer
6: 75f9a38e85 = 8: 0aa541689c checkout: move 'confict_style' and 'dwim_..'
to checkout_opts
7: 9188718493 = 9: 84ca42bb26 checkout: split options[] array in three
pieces
8: b5af7d22fd ! 10: e983c8bb2c checkout: split part of it to new command
switch
@@ -1,6 +1,6 @@
Author: Nguyễn Thái Ngọc Duy <[email protected]>
- checkout: split part of it to new command switch
+ checkout: split part of it to new command 'switch'
"git checkout" doing too many things is a source of confusion for many
users (and it even bites old timers sometimes). To remedy that, the
@@ -180,7 +180,7 @@
++
+You can use the `"@{-N}"` syntax to refer to the N-th last
+branch/commit switched to "git switch" or "git checkout"
-+operation. You may also specify `-` which is synonymous to `"@{-1}`.
++operation. You may also specify `-` which is synonymous to `"@{-1}"`.
++
+As a special case, you may use `"A...B"` as a shortcut for the merge
+base of `A` and `B` if there is exactly one merge base. You can leave
@@ -188,8 +188,8 @@
+
+-c <new-branch>::
+--create <new-branch>::
-+ Create a new branch named <new-branch> starting at
-+ <start-point> before switching to the branch. This is a
++ Create a new branch named `<new-branch>` starting at
++ `<start-point>` before switching to the branch. This is a
+ convenient shortcut for:
++
+------------
@@ -199,8 +199,8 @@
+
+-C <new-branch>::
+--force-create <new-branch>::
-+ Similar to `--create` except that if <new-branch> already
-+ exists, it will be reset to <start-point>. This is a
++ Similar to `--create` except that if `<new-branch>` already
++ exists, it will be reset to `<start-point>`. This is a
+ convenient shortcut for:
++
+------------
@@ -216,8 +216,8 @@
+
+-g::
+--guess::
-+ If <branch> is not found but there does exist a tracking
-+ branch in exactly one remote (call it <remote>) with a
++ If `<branch>` is not found but there does exist a tracking
++ branch in exactly one remote (call it `<remote>`) with a
+ matching name, treat as equivalent to
++
+------------
@@ -243,7 +243,8 @@
+ the switching target. This is used to throw away local
+ changes.
+
-+--[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
@@ -292,8 +293,8 @@
+ "merge" style, shows the original contents).
+
+--orphan <new-branch>::
-+ Create a new 'orphan' branch, named <new-branch>, started from
-+ <start-point> and switch to it. See explanation of the same
++ Create a new 'orphan' branch, named `<new-branch>`, started from
++ `<start-point>` and switch to it. See explanation of the same
+ option in linkgit:git-checkout[1] for details.
+
+--ignore-other-worktrees::
@@ -302,7 +303,8 @@
+ the ref out anyway. In other words, the ref can be held by
+ more than one worktree.
+
-+--[no-]recurse-submodules::
++--recurse-submodules::
++--no-recurse-submodules::
+ Using --recurse-submodules will update the content of all initialized
+ submodules according to the commit recorded in the superproject. If
+ local modifications in a submodule would be overwritten the checkout
9: 5be400099c ! 11: 5491932cc8 switch: better names for -b and -B
@@ -3,9 +3,9 @@
switch: better names for -b and -B
The shortcut of these options do not make much sense when used with
- switch. And their descriptions are also tied to checkout
- out. Move -b/-B to cmd_checkout() and new -c/-C with the same
- functionality in cmd_switch_branch()
+ switch. And their descriptions are also tied to checkout. Move -b/-B
+ to cmd_checkout() and new -c/-C with the same functionality in
+ cmd_switch_branch()
diff --git a/builtin/checkout.c b/builtin/checkout.c
--- a/builtin/checkout.c
10: 38cfc1fada = 12: e0f1247b09 switch: remove -l
11: 7f0abab72c = 13: f7ff1a7df6 switch: stop accepting pathspec
12: 386ba95007 = 14: 0750d63d38 switch: reject "do nothing" case
13: e488c7d8ca = 15: bcd843146d switch: only allow explicit detached HEAD
14: 9cd5f63c01 = 16: d5cc55525d switch: add short option for --detach
15: fc31b3d4f3 ! 17: 4a27400a58 switch: no implicit dwim, use --guess to dwim
@@ -15,13 +15,13 @@
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@
- <branch>.
+ `<branch>`.
+
- If <branch> is not found but there does exist a tracking branch in
--exactly one remote (call it <remote>) with a matching name, treat as
+ If `<branch>` is not found but there does exist a tracking branch in
+-exactly one remote (call it `<remote>`) with a matching name, treat as
-equivalent to
-+exactly one remote (call it <remote>) with a matching name and
-+--no-guess is not specified, treat as equivalent to
++exactly one remote (call it `<remote>`) with a matching name and
++`--no-guess` is not specified, treat as equivalent to
+
------------
$ git checkout -b <branch> --track <remote>/<branch>
@@ -36,16 +36,17 @@
-'origin' remote. See also `checkout.defaultRemote` in
-linkgit:git-config[1].
-+
- You could omit <branch>, in which case the command degenerates to
+ You could omit `<branch>`, in which case the command degenerates to
"check out the current branch", which is a glorified no-op with
rather expensive side-effects to show only the tracking information,
@@
Do not set up "upstream" configuration, even if the
branch.autoSetupMerge configuration variable is true.
-+--[no-]guess::
-+ If <branch> is not found but there does exist a tracking
-+ branch in exactly one remote (call it <remote>) with a
++--guess::
++--no-guess::
++ If `<branch>` is not found but there does exist a tracking
++ branch in exactly one remote (call it `<remote>`) with a
+ matching name, treat as equivalent to
++
+------------
@@ -74,9 +75,9 @@
- Do not attempt to create a branch if a remote tracking branch
- of the same name exists.
-
- --[no-]overlay::
+ --overlay::
+ --no-overlay::
In the default overlay mode, `git checkout` never
- removes files from the index or the working tree. When
diff --git a/builtin/checkout.c b/builtin/checkout.c
--- a/builtin/checkout.c
16: 761f953b40 = 18: f7dd33abe6 switch: no worktree status unless real branch
switch happens
17: 206f1bda79 = 19: 5b182abea8 t: add tests for switch
18: 3cfb2913eb ! 20: 1575064fe6 completion: support switch
@@ -28,10 +28,11 @@
+ local track_opt= only_local_ref=n
+ if [ -n "$(__git_find_on_cmdline "-g --guess")" ]; then
+ track_opt='--track'
-+ elif [ -z "$(__git_find_on_cmdline "-d --detach")" ]; then
++ fi
++ if [ -z "$(__git_find_on_cmdline "-d --detach")" ]; then
+ only_local_ref=y
+ fi
-+ if [ $only_local_ref = y ]; then
++ if [ $only_local_ref = y -a -n "$track_opt"]; then
+ __gitcomp_direct "$(__git_heads "" "$cur" " ")"
+ else
+ __git_complete_refs $track_opt
19: 2d018878bd ! 21: 8ed01ad0c5 doc: promote "git switch"
@@ -317,9 +317,9 @@
------------
-$ git checkout mybranch
-+$ git switch mybranch
- $ git reset --hard master^2
+-$ git reset --hard master^2
-$ git checkout master
++$ git switch -C mybranch master^2
+$ git switch master
$ git reset --hard master^
------------
@@ -400,7 +400,7 @@
-$ git checkout pu && git reset --hard next <7>
+$ git switch -c hold/linus && git am -3 -i -s ./+hold-linus <5>
+$ git switch topic/one && git rebase master <6>
-+$ git switch pu && git reset --hard next <7>
++$ git switch -C pu next <7>
$ git merge topic/one topic/two && git merge hold/linus <8>
-$ git checkout maint
+$ git switch maint
@@ -430,6 +430,20 @@
Check that the change you made is no longer visible, since it was
+ diff --git a/Documentation/gitworkflows.txt
b/Documentation/gitworkflows.txt
+ --- a/Documentation/gitworkflows.txt
+ +++ b/Documentation/gitworkflows.txt
+@@
+ .Rewind and rebuild next
+ [caption="Recipe: "]
+ =====================================
+-* `git checkout next`
+-* `git reset --hard master`
++* `git switch -C next master`
+ * `git merge ai/topic_in_next1`
+ * `git merge ai/topic_in_next2`
+ * ...
+
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt
--
2.21.0.rc1.337.gdf7f8d0522