git学习3-分支与合并

分支与合并

branch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git branch [--color[=<when>] | --no-color] [--show-current]
[-v [--abbrev=<n> | --no-abbrev]]
[--column[=<options>] | --no-column] [--sort=<key>]
[--merged [<commit>]] [--no-merged [<commit>]]
[--contains [<commit>]] [--no-contains [<commit>]]
[--points-at <object>] [--format=<format>]
[(-r | --remotes) | (-a | --all)]
[--list] [<pattern>…]
git branch [--track[=(direct|inherit)] | --no-track] [-f] <branchname> [<start-point>]
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
git branch --unset-upstream [<branchname>]
git branch (-m | -M) [<oldbranch>] <newbranch>
git branch (-c | -C) [<oldbranch>] <newbranch>
git branch (-d | -D) [-r] <branchname>…
git branch --edit-description [<branchname>]

branch用于列出、创建或者删除分支。

如果只给出了--list,则列出所有的分支。当前的分支将以绿色高亮显示,并用星号标记。在链接的工作树中签出的任何分支都将以青色突出显示,并用加号标记。

选项-r将列出远程跟踪分支,选项-a将同时显示本地和远程分支。

可以用通过添加<pattern>来筛选符合该模式的分支。(要使用<patterin>,则必须使用--list)。

使用--contains则表示仅显示那些包含<commit>的分支(<commit>的后代)。--no-contains 与其相反,即不包含。

使用--mergerd则表示仅显示那些合并到<commit>的分支。--no-merged相反,即没有合并到<commit>的分支。

第二种形式将创建一个新的名叫<branchname>的分支,其指向当前的HEAD,如果给出<start-point>,则指向给定的位置。一种特殊情况是,可以使用A...B来表示AB合并的基点的快捷写法(A和B存在一个合并基点)。

注意这种形式会创建一个新的分支,但不会切换到它,可以使用git switch <newBranch>来切换到对应的分支。

一旦一个本地分支是从一个远程追踪分支启动的,那么Git就会自动配置该分支(主要是branch.<name>.remotebranch.<name>.merge配置对),以便后面git pull可以从remote-tracking分支适当地合并。

这个设置可以通过使用--track--no-track选项来覆盖,或者使用git branch --set-upstream-to来更改。

使用-m-Mmove)选项,<oldbranch>将被重命名为<newbranch>。如果<oldbranch>有一个相应的reflog,它将被重命名以匹配<newbranch>,并且创建一个reflog条目来记住分支的重命名。如果存在<newbranch>,则必须使用-M来强制执行重命名。

-c-Ccopy)选项具有与-m-M完全相同的语义,只是分支不会被重命名,而是会被复制到一个新名称,连同它的configreflog

使用-d-D选项,<branchname>将被删除。您可以指定多个用于删除的分支。如果分支当前有一个reflog,那么这个reflog也将被删除。

使用-r-d来删除远程跟踪分支(注意不是删除远程仓库本身,而是删除跟踪)。注意,只有当远程跟踪分支不再存在于远程存储库中时,或者当git fetch被配置为不再获取它们时,才有意义删除它们。

选项

  • -d; --delete:删除一个分支。该分支必须在其上游分支中完全合并,或者在HEAD中(如果没有使用--track--set-upstream-to设置upstream)。
  • -D--delete --force的简写。
  • --create-reflog:创建分支的reflog。这激活了对分支ref所做的所有更改的记录,允许使用基于日期的sha1表达式,如<branchname>@{yesterday}
  • -f; --force:将<branchname>重置为<startpoint>,即使<branchname>已经存在。如果没有-f, git branch拒绝改变一个已经存在的分支。与-d(或--delete)组合,允许删除分支,而不管它的合并状态,或者它是否指向一个有效的提交。与-m(或--move)组合,允许重命名分支,即使新的分支名称已经存在,同样适用于-c(或--copy)。
  • -m; --move:移动/重命名一个分支,以及它的配置和reflog
  • -M--move --force的简写。
  • -c; --copy:复制一个分支,连同它的配置和reflog
  • -C--copy --force的简写。
  • --color[=<when>]:为分支设置颜色,以突出显示当前、本地和远程跟踪分支。该值必须为always(默认值)、never或auto。
  • --no-color:关闭分支颜色,即使配置文件给出了默认的颜色输出。--color=never
  • -i; --ignore-case:排序和过滤分支不区分大小写。
  • --column[=<options>]; --no-column:以列(不以列)显示分支列表。
  • r; --remotes:列出或删除(如果与-d一起使用)远程跟踪分支。结合--list来匹配可选的模式。
  • -a; --all:同时列出远程跟踪分支和本地分支。结合--list来匹配可选的模式。
  • -l; --list:列出分支。带有可选<pattern>,例如,git branch --list 'maint-*,只列出匹配模式的分支。
  • --show-current:打印当前分支的名称。在分离的HEAD状态下,不打印任何东西。
  • -t; --track:当创建一个新的分支时,设置branch.<name>.remotebranch.<name>.merge以设置新分支的”upstream”跟踪配置。配置会告诉git以git statusgit branch -v显示两个分支之间的关系。此外,当新分支被指出时,它可以不带参数地执行git pull操作。
  • --no-track:不设置”upstream”配置,即使分支。设置auto.SetupMerge配置变量。
  • -u <upstream>; --set-upstream-to=<upstream>:设置<branchname>的跟踪信息,使<upstream>被认为是<branchname>的上游分支。如果没有指定<branchname>,则默认为当前分支。
  • --edit-description:打开一个编辑器并编辑文本,以解释分支的用途,以及各种其他命令所使用的功能。可以使用多行解释。
  • contains [commit]:仅列出包含指定提交的分支(如未指定则为HEAD)。
  • --no-contains [<commit>]:只列出不包含指定提交的分支(如果没有指定,则为HEAD)。
  • --merged [<commit>]:仅列出从指定的提交(如果没有指定为HEAD)中可获得提示的分支。
  • --no-merged [<commit>]:仅列出从指定的提交(如果没有指定为HEAD)中无法获得提示的分支。
  • <branchname>:要创建或删除的分支的名称。
  • <start-point>:新的分支头将指向这个提交。它可以是一个分支名、一个commit-id或者一个标签。如果这个选项被省略,则将使用当前的HEAD。
  • <oldbranch>:要重命名的现有分支的名称。
  • <newbranch>:现有分支的新名称。应用与<branchname>相同的限制。
  • --sort=<key>:根据给定的键进行排序。前缀-按值的降序排序。您可以多次使用--sort=<key>选项,在这种情况下,最后一个键成为主键。
  • --points-at <object>:只列出给定对象的分支。

值得注意的是:如果关联的远程分支与本地分支名字不一样,那么git push时git会提醒fatal: The upstream branch of yourcurrent branch does not matchthe name of your current branch. 然后回给出其他更复杂的提交方式,最好还是把名字统一为一样。

checkout

git checkout 这个命令承担了太多职责,既被用来切换分支,又被用来恢复工作区文件,对用户造成了很大的认知负担。

Git社区发布了Git的新版本2.23。在该版本中,有一个特性非常引人瞩目,就是新版本的Git引入了两个新命令 git switch 和 git restore,用以替代现在的 git checkout。换言之,git checkout 将逐渐退出历史舞台。

Git社区决定这样做,是因为目前 git checkout 命令承载了太多的功能,这让新手们感到困惑。git checkout 的核心功能包括两个方面,一个是分支的管理,一个是文件的恢复。这两个核心功能,未来将由 git switch 和 git restore 分别负责。

1
2
3
4
5
6
7
git checkout [-q] [-f] [-m] [<branch>]
git checkout [-q] [-f] [-m] --detach [<branch>]
git checkout [-q] [-f] [-m] [--detach] <commit>
git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new-branch>] [<start-point>]
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <pathspec>…
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] --pathspec-from-file=<file> [--pathspec-file-nul]
git checkout (-p|--patch) [<tree-ish>] [--] [<pathspec>…]

更新工作树中的文件以匹配索引或指定树中的版本。如果没有给出pathspec, git checkout也会更新HEAD,将指定的分支设置为当前分支。

git checkout [<branch>]

切换分支到到<branch>

git checkout -b|-B <new-branch> [<start-point>]

指定-b会导致创建一个新分支,就好像调用了git-branch,然后切换到它。并且可以指出新分支的起始点<start-point>

如果指定-B,那么如果<new-branch>不存在则创建,否则就重置该分支。这相当于:

1
2
$ git branch -f <branch> [<start-point>]
$ git checkout <branch>

git checkout --detach [<branch>];git checkout [--detach] <commit>

将HEAD指向<commit>,如果提供的是<branch>,则将HEAD切换到<branch>的最新commit。同时更新工作树中的索引和文件。工作树中文件的本地修改将被保留,因此最终的工作树将是提交中记录的状态加上本地修改。

省略<branch>将会将HEAD切换到当前分支的顶端。

选项

  • -f; --force:当切换分支时,即使索引或工作树与HEAD不同,即使在切换过程中存在未跟踪的文件,也要继续进行。这用于丢弃本地更改和任何未跟踪的文件或目录。

  • --ours; --theirs:当发生冲突的时候,决定是从#2 (ours) or #3 (theirs)中的哪一个。注意在使用git rebasegit pull --rebase时,ours和theirs可能会交换。--ours是选择保留本地代码。--theirs是选择保留合并分支代码。

  • -b <new-branch>:创建一个名为<new-branch>的新分支,并在<start-point>处启动它。

  • -B <new-branch>:创建分支<new-branch>,并在<start-point>处启动它;如果它已经存在,则将其重置为<start-point>。这相当于运行git branch with -f

  • -t; --track:当创建一个新的分支时,设置upstream配置。

  • --bo-track:不要设置“upstream”配置,即使分支。autoSetupMerge配置变量为true。

  • --guess; --no-guess:如果没有找到<branch>,但是在一个远程(调用它<remote>)中确实存在一个跟踪分支,并具有匹配的名称。其与下面语句一样:

    1
    git checkout -b <branch> --track <remote>/<branch>

    如果分支存在于多个远程中,并且其中一个分支由checkout.defaultRemote配置变量命名,我们将使用该分支来消除歧异,即使<branch>在所有远程中不是唯一的。

    --guess是默认行为。用--no-guess来禁用它。

  • -l:创建新分支的reflog;

  • -d; --detach:切换到一个commit用来检查或者可放弃的实验(而不是切换到一个分支),当<commit>不是分支名时,git checkout <commit>的默认行为。

  • --orphan <new-branch> [<start-point>]:创建一个新的孤立分支,命名为<new-branch>,从<start-point>开始,并切换到它。在这个新分支上进行的第一次提交将没有父节点,它将是一个新历史的根节点,与所有其他分支完全断开连接并进行提交。

    索引和工作树将被调整,就像以前运行过git checkout <start-point>一样。这允许开始一个新的历史记录,记录一组类似于<start-point>的路径,通过简单地运行git commit -a来进行根提交。

  • -m; --merge:在切换分支时,如果您对当前分支和要切换的分支之间的一个或多个文件进行了本地修改,则该命令将拒绝切换分支,以便在上下文中保留您的修改。但是,使用这个选项,当前分支、工作树内容和新分支之间的三方合并就完成了,您将位于新分支上。当合并冲突发生时,冲突路径的索引条目将保持未合并状态,您需要解决冲突并使用git add标记已解决的路径。

  • --overwrite-ignore; --no-overwrite-ignore:切换分支时,静默地覆盖被忽略的文件,这是默认行为。当新分支包含被忽略的文件时,使用--no-overwrite-ignore中止操作。

  • <branch>:要切换得到分支。

  • <new-branch>:新建分支的名字。

  • <start-point>:用于启动新分支的提交的名称,默认是HEAD

  • <tree-ish>:被切换的树。如果没有指定,默认指定索引。

switch

1
2
3
4
git switch [<options>] [--no-guess] <branch>
git switch [<options>] --detach [<start-point>]
git switch [<options>] (-c|-C) <new-branch> [<start-point>]
git switch [<options>] --orphan <new-branch>

切换到特定分支。工作树和索引也会更新。

注意,当使用git switch branchName时,如果branchName不存在,则自动创建一个新的分支然后切换到该分支(行为与checkout一致)。

可以通过添加-c-C,自动的从一个远程仓库的同名分支创建一个新的分支。或者使用--detach来从一个分支分离出工作树,然后切换到该分支。

交换分支不需要干净的索引和工作树,也就是说允许存在未索引和未提交的文件。但是如果操作将导致本地变更的丢失,则会打断操作。(使用--discard-changes或者--merge可以用来在这种情况下抛弃改变或者合并)

选项

  • <branch>:要切换到的分支。

  • <new-branch>:新分支的名字。

  • <start-point>:新分支的起始点。指定<start-point>允许根据历史上的其他点(而不是HEAD当前点)创建一个分支。

  • -c <new-branch>; --create <new-branch>:在切换到分支之前,从<start-point>开始创建一个名为<new-branch>的新分支。下面两种写法是相同的:

    1
    2
    $ git branch <new-branch>
    $ git switch <new-branch>
  • -C <new-branch>; --force-create <new-branch>:类似于--create,只是如果<new-branch>已经存在,它将被重置为<start-point>。下面两种写法是相同的:

    1
    2
    $ git branch -f <new-branch>
    $ git switch <new-branch>
  • -d; -detach:切换到一个commit点,以进行检查或者可放弃的实验。

  • --guess; --no-guess:如果没有找到<branch>,但在一个具有匹配名称的远程(称为<remote>)中确实存在一个跟踪分支,则将其视为等效的:

    1
    $ git switch -c <branch> --track <remote>/<branch>

    即如果本地不存在<branch>,但在远程分支中存在同名的分支,则直接将其clone到本地,并且将其upstream设置为远程分支。

    如果分支存在于多个远程仓库中,并且其中一个分支由checkout.defaultRemote配置变量命名,我们将使用该分支来消除歧异,即使<branch>在所有远程中不是唯一的。

  • -f; --force:–discard-changes`的别名。

  • --discard-changes:即使索引或工作树与HEAD不同,也要继续执行命令。索引和工作树都被恢复以匹配交换目标。如果指定了--recursed -submodules,子模块内容也会被恢复以匹配切换目标。这个操作用于丢弃本地的变更。

  • -m; --merge:如果有一个或多个文件在当前分支和要切换到的分支不同。switch命令将会终止,但是加上了--merge后,被当前分支将会合到将要被切换的分支,您将位于新分支上。

  • -t; --track [direct | inheret]:当创建一个新的分支时,设置“upstream”配置。

  • --orphan <new-branch>:创建一个新的孤立分支,名为<new-branch>。所有跟踪文件都将被被删除。

  • --ignore-other-worktrees:当需要的ref已经被另一个工作树检出时,git switch将会拒绝执行。这个选项可以强行使其签出到该ref上。换句话说,ref可以被多个工作树持有。

  • --recurse-submodules; --no-recurse-submodules:使用--recurse-submodules将根据superproject中记录的提交更新所有活动子模块的内容。如果什么都没有使用(或者--no- recursive -submodules),子模块工作树将不会被更新。就像git-submodule[1]一样,这将分离子模块的HEAD。

log

用于展示commit日志。

该命令从给出的提交通过parent链列出所有可达的commit,并且不包含那些以^开头的可达的commits。在默认情况下,输出以反向时间顺序给出。

比如,以下的命令:

1
git log foo bar ^baz

意味着-列出所有从foo或bar可到达,但从baz不能到达的提交。

选项

  • --follow:继续列出重命名以外的文件历史记录(仅适用于单个文件)。
  • --no-decorate; --decorate[=short|full|auto|no]:打印显示的任何提交的ref名称。如果指定了short,则不会打印refs/heads/refs/tags/refs/remotes/的前缀。如果指定了full,则打印完整的引用名称(包括前缀)。如果指定了auto,那么如果输出到终端,则ref名称将显示为short,否则不显示任何ref名称。选项--decorate--decorate=short的简写。如果配置了,默认为log. decorator的配置值,否则为auto。
  • --source:打印出在命令行中给出的每个提交的引用名称。

stash

1
2
3
4
5
6
7
8
9
10
11
12
git stash list [<log-options>]
git stash show [-u|--include-untracked|--only-untracked] [<diff-options>] [<stash>]
git stash drop [-q|--quiet] [<stash>]
git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [-m|--message <message>]
[--pathspec-from-file=<file> [--pathspec-file-nul]]
[--] [<pathspec>…]]
git stash clear
git stash create [<message>]
git stash store [-m|--message <message>] [-q|--quiet] <commit>

回想之前介绍的switchcheckout,当工作树或者索引有修改的时候,是无法切换分支的。而stash就是为了解决这个问题出现的。其可以将工作树或索引的文件保存在本地。之后便可以切换分支。

当你想要记录工作目录和索引的当前状态,但又想要回到一个干净的工作目录时,使用git stash。该命令保存本地修改,然后可以切换到其他分支,在其他分支操作完切换回来之后,再恢复文件。

通过这个命令隐藏的修改可以进行以下操作:

  • git stash list:列举修改。
  • git stash show:检查修改。
  • git stash apply:恢复修改。
  • git stash; git stash push:隐藏当前状态。一个隐藏在默认情况下被命名为WIP on branchname …,但是当创建一个隐藏时,也可以在命令行上给出一个更描述性的消息。

创建的最新隐藏内容存储在refs/stash中;旧的堆栈可以在此引用的reflog中找到,可以使用通常的reflog语法命名。

命令

push

1
push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>…]

存储当前本地修改为一个stash

<message>是可选的,其给出了描述和隐藏状态。

其中push关键可以省略,在此模式下,不允许使用非选项参数,以防止拼写错误的子命令生成不需要的隐藏条目。这其中的两个例外是stash -p,它作为stash push -p的别名和pathspec元素,它允许在双连字符之后--以消除歧义。

list

1
list [<log-options>]

列出你现在的储藏条目。每个储藏条目都列有它的名字、当条目被创建时当前的分支的名称以及条目所基于的提交的简短描述。

该命令采用适用于git log命令的选项来控制显示的内容以及如何显示。

show

1
show [-u|--include-untracked|--only-untracked] [<diff-options>] [<stash>]

展示在stash中的记录和当前文件内容的不同。

pop

1
pop [--index] [-q|--quiet] [<stash>]

stash列表中移除单个stash状态,并将其应用到当前工作树状态的顶部。工作目录必须与索引匹配。

当发生冲突的时候,该命令会失败,但该stash不会从stash列表中移除。此时可以手动解决冲突,然后使用git stash drop来移除。

apply

1
apply [--index] [-q|--quiet] [<stash>]

pop类似,但其不会将当前stashstash列表中移除。

branch

1
branch <branchname> [<stash>]

从最初创建<stash>的提交开始,创建并切换到一个名为<branchname>的新分支,将<stash>中记录的更改应用到新的工作树和索引。如果成功,并且<stash>是形式stash@{<revision>}的引用,那么它将删除<stash>

如果你运行git stash push的分支发生了足够大的变化,以至于git stash apply由于冲突而失败,那么这是非常有用的。因为这个隐藏条目应用于在git隐藏运行时是HEAD的提交上,所以它会恢复原来的隐藏状态而不产生冲突。

clear

删除所有的stash条目。请注意,这些条目随后将被删除,并且可能无法恢复(谨慎)。

drop

1
drop [-q|--quiet] [<stash>]

stash条目列表中删除单个stash条目。(不加参数则删除最近的一条)

create

创建一个stash条目(这是一个常规提交对象)并返回它的对象名称,而不将其存储在ref名称空间的任何地方。这对脚本很有用。

store

将通过git stash create(一个悬空的合并提交)创建的stash存储在stash ref中,更新stash reflog。这对脚本很有用。这可能不是你想要使用的命令。

选项

  • -a; --all:此选项仅对push和save命令有效。所有被忽略和未跟踪的文件也被隐藏,然后用git clean清理。
  • -u; --include-untracked; --no-include-untracked:当使用pushsave命令时,所有未跟踪的文件也会被隐藏,然后用git clean清理。当与show命令一起使用时,将隐藏条目中的未跟踪文件显示为diff的一部分。
  • --only-untracked:(该选项仅对show命令有效)只显示隐藏条目中未跟踪的文件作为差异的一部分。
  • --index:(此选项仅对pop和apply命令有效)尝试不仅恢复工作树的更改,而且恢复索引的更改。然而,当有冲突时,可能会失败。
  • -k; --keep-index; --no-keep-index:(此选项仅对push和save命令有效)已经添加到索引中的所有更改都保持不变。
  • -S; --staged:(此选项仅对push和save命令有效)只隐藏当前进行的更改。这类似于基本的git提交,除了状态被提交到stash而不是当前的分支。(patch选项比该命令优先级高)
  • --pathspec-from-file=<file>:(此选项仅对push命令有效)从文件中读取pathspec
  • <pathspec>…:(此选项仅对push命令有效)新的存放条目只记录匹配路径规范的文件的修改状态。在随后的恢复时,索引项和工作树文件也会被回滚到这些文件在HEAD中的状态,而不匹配路径规范的文件则会保持不变。

workwtree

1
2
3
4
5
6
7
8
git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]] [-b <new-branch>] <path> [<commit-ish>]
git worktree list [-v | --porcelain]
git worktree lock [--reason <string>] <worktree>
git worktree move <worktree> <new-path>
git worktree prune [-n] [-v] [--expire <expire>]
git worktree remove [-f] <worktree>
git worktree repair [<path>…]
git worktree unlock <worktree>

工作树可以允许将一个仓库的不同分支分别存储到不同的文件目录。而免去了反复切换分支的麻烦(特别是对于很大的项目)。

可以通过git worktree add创建一个新的与该仓库联系的工作树。这个新的工作树被称为为“链接工作树”,而原本的工作树被称为“主工作树”。一个仓库可以有一个主工作树和多个链接工作树。可以使用git worktree remove来移除已存在的工作树。

通过git worktree add <path>,Git会自动创建一个新的分支(其名字是该路径的最后一个文件夹名字),然后将该目录作为该分支的工作树。

也可以通过git worktree add <path> <branch>来将现有的分支和目录链接起来。另一方面,如果您只是计划进行一些实验性的更改或进行测试,而不影响现有的开发,那么创建一个与任何分支都不相关的一次性工作树通常是很方便的。例如,git worktree add -d <path>将在当前分支的同一个提交中创建一个新的工作树,该树带有一个分离的HEAD。

如果一个工作树在没有使用git worktree remove的情况下被删除(即手动删除),那么它所关联的管理文件(驻留在存储库中)最终将被自动删除,或者你可以在主目录或者任何链接的工作树中运行git worktree prune命令来清理任何过期的管理文件。

如果一个链接的工作树存储在一个不总是挂载的便携设备或网络共享中,你可以通过发出git worktree lock命令来防止它的管理文件被删除,还可以指定--reason来解释为什么工作树被锁定。

命令

add <path> [<commit-ish>]

创建<path>并切换<commit-ish>到其中。新的工作目录链接到当前的存储库,共享除工作目录特定文件(如HEAD、index等)外的所有内容。

如果<commit-ish>是一个分支名称(叫它<branch>),并且没有找到它,而且-B-b--detach都没有使用,但是在一个远程(叫它<remote>)中确实存在一个跟踪分支,具有匹配的名称,则将其视为等价的:

1
git worktree add --track -b <branch> <path> <remote>/<branch>

如果分支存在于多个远程中,并且其中一个分支由checkout.defaultRemote配置变量命名,我们将使用该分支来消除歧异,即使<branch>在所有远程中不是唯一的。

如果省略了<commit-ish>并且没有使用-B-b--detach,那么,为了方便起见,新的工作树与一个以$(basename <path>)命名的分支(称为<branch>)相关联。如果<branch>不存在,将自动创建一个基于HEAD的新分支,就像给出了-b <branch>一样。如果<branch>确实存在,它将在新的工作树中检出,如果没有在其他地方检出,否则命令将拒绝创建工作树。

list

列出每个工作树的详细信息。首先列出主工作树,然后是每个链接的工作树。输出细节包括工作树是否空白,当前签出的修订,当前签出的分支(如果没有,则为“detached HEAD”)。如果工作树被锁定,则显示“locked”,如果工作树可以通过prune命令进行修剪,则显示“prunable”。

lock

如果工作树位于不总是挂载的便携设备或网络共享上,锁定它,以防止其管理文件被自动删除。这也可以防止它被移动或删除。可以使用--reason指定锁的原因。

move

将一棵工作树移动到一个新的位置。请注意,不能使用此命令移动包含子模块的主工作树或链接工作树。

prune

删除$GIT_DIR/worktrees中的工作树信息。

remove

移除一个工作树。只有无污染的工作树(没有未被跟踪的文件和在被跟踪的文件中没有修改)可以被删除。不干净的工作树或有子模块的工作树可以用--force移除。主工作树不能被移除。

repair [<path>…]

如果可能,修复工作树管理文件,如果它们由于外部因素而损坏或过时。

例如,如果主工作树(或裸存储库)被移动,链接的工作树将无法找到它。在主工作树中运行修复将重新建立连接的工作树到主工作树的连接。

类似地,如果一个链接的工作树在没有使用git worktree move的情况下被移动,那么主工作树(或者裸存储库)将无法找到它。在最近移动的工作树中运行修复将重新建立连接。如果移动了多个链接的工作树,则使用每个工作树的新<path>作为参数从任何工作树运行修复,将重新建立到所有指定路径的连接。

如果手动移动了主工作树和链接工作树,则在主工作树中运行修复并指定每个链接工作树的新将重新建立两个方向上的所有连接。

unlock

解锁工作树,允许对其进行修剪、移动或删除。

选项

  • -f; --force:默认情况下,如果<commit-ish>是一个分支名并且已经被另一个工作树检出,或者<path>已经被分配到某个工作树但现在丢失了(例如,如果手动删除了<path>), add拒绝创建新的工作树。这个选项覆盖了这些保护措施。要添加一个缺失但锁定的工作树路径,请指定两次--force

    move拒绝移动锁定的工作树,除非指定两次-force。如果目的地已经被分配给其他工作树,但是现在丢失了(例如,如果手动删除了<new-path>),那么--force允许移动继续;如果目的地被锁定,使用——force两次。

    remove拒绝移除不干净的工作树,除非使用--force。要移除锁定的工作树,指定两次--force

  • -b <new-branch>; -B <new-branch>:使用add命令时,从<commit-ish>开始创建一个名为<new-branch>的新分支,并将<new-branch>检出到新的工作树中。如果省略<commit-ish>,则默认为HEAD。默认情况下,-b拒绝创建一个已经存在的新分支。-B覆盖这个安全措施,将<new-branch>重置为<commit-ish>

  • -d; --detach:使用add命令时,在新的工作树中分离HEAD。

  • --[no-]checkout:默认情况下,添加检出<commit-ish>,但是--no-checkout可以用来禁止检出。

  • --[no-]guess-remote:使用worktree add <path>,并没有<commit-ish>时,并不从头创建一个新的分支,如果存在一个远程仓库的分支匹配<path>的基地址名,则基于该远程分支来新建分支,并将其upstram为该远程分支。

  • --[no-]track:当创建一个新分支时,如果<commit-ish>是一个分支,则将其标记为来自新分支的“upstream”。如果<commit-ish>是一个远程跟踪分支,这是默认值。

  • --reason <string>:使用lockadd --lock,解释为什么工作树被锁定。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2019 - 2024 My Wonderland All Rights Reserved.

UV : | PV :