Git从现有的远程分支添加工作树

时间:2017-08-03 17:50:43

标签: git git-branch git-remote git-worktree

我是Git的新手。我搜索了很多,但没有发现与我的情况完全匹配。

我有一个个人的WinForms应用程序,在我的远程仓库中有3个分支(主分支和2个长分支):

master  #the common features are here like Core, DAL,...
north   #customized for A company (long-running)
razavi  #customized for B company (long-running)

在我的办公室电脑上,我为worktreenorth分支添加了2 razavi

$ git worktree list
C:/Source/nis     a6fb6e1 [master]
C:/Source/north   ebc7670 [north]
C:/Source/razavi  eed08a2 [razavi]

到目前为止,一切都还可以,我决定从家里开始这个项目,但是在我的家用电脑上,当我尝试为这两个分支添加工作树时,它给了我一个错误:

$git worktree add -b north ../north north
fatal: A branch named 'north' already exists.

我删除-b开关以不添加新分支,但它也不起作用。

如何从现有分支中添加worktree非本地但远程?

更新(解决方案)

在解决了一段时间之后,我找到了问题的解决方案,实际上,错过了--checkout开关:

$ git worktree add --checkout ../north north

我也会把它放在答案中。

4 个答案:

答案 0 :(得分:12)

TL; DR:你可能想要git worktree add ../north north

首先,提醒(或其他人遇到此问题的信息):git worktree add想要创建新的工作树,同时确保这个新的work-tree使用来自其他每个工作树的不同的分支名称。这是因为,虽然每个添加的工作树都有自己的索引HEAD,但HEAD文件最终会共享共享共享存储库中的底层分支指针。具有独立索引对象但具有相同底层分支的两个不同工作树导致用户处理一些棘手的问题。而不是试图通过教育程序员或提供工具来处理问题来弄清如何来处理这些问题 - git worktree完全禁止这种情况。

因此,在创建新的工作树时,想要创建 new 分支名称是非常典型的。根据定义,新分支名称将自动与每个现有分支名称不同:

$ git checkout -b newbranch
Switched to a new branch 'newbranch'
$ git checkout -b newbranch
fatal: A branch named 'newbranch' already exists.

这似乎很自然:没有人对此感到惊讶。

您以与git worktree add类似的方式运行git checkout -b,除了结帐发生在新添加的工作树中。但是你已经有了一个名为north的分支。

如果此现有north分支无效,则可以将其删除。现在您没有名为north的本地分支,您可以创建一个新分支。

如果现有的north分支 有用,请不要将其删除!如果它已在某些现有工作树中检出,请移至该工作树并在那里进行处理。如果在某些现有工作树中检出 ,则可以创建 检出的新工作树;您只需要避免使用-b标志(和相应的分支名称):

git worktree add ../north north

请注意,当您创建分支时,您不必重复自己:

git worktree add -b newbranch ../path

将在../path中创建一个新的工作树,并使用git checkout -b newbranch填充它。在以下情况下,您只需要分支名称:

  1. 您未使用-b
  2. 路径参数不以分支名称结尾。
  3. 例如,如果要查看路径zorg中新工作树中的现有分支../zorg,则可以运行:

    git worktree add ../zorg
    

    这里,由于既没有-b zorg也没有最后一个参数,Git使用../zorg的最后一部分来计算分支名称,当然只是zorg,所以这会尝试将现有分支zorg签出到新工作树中。

答案 1 :(得分:2)

对于此问题,worktree add确实需要--checkout开关来执行此操作:

$ git worktree add --checkout ../north north
$ git worktree add --checkout ../razavi razavi

答案 2 :(得分:2)

除了“猜测远程分支”,我explain in my other answer,Git 2.18(2018年第二季度)将提供一个新功能:
git worktree add”学会了检查现有分支。

commit f60a7b7commit 6427f87commit 2c27002commit d861d34Thomas Gummerer (tgummerer)(2018年4月24日)。{
帮助:Eric Sunshine (sunshineco)
(由Junio C Hamano -- gitster --合并于commit 10174da,2018年5月23日)

  

worktree:教“add”检查现有分支

     

目前,“git worktree add <path>”会创建一个以该命名的新分支   默认情况下路径的基本名称   如果已存在具有该名称的分支,则该命令拒绝执行任何操作,除非给出“--force”选项。

     

但是我们可以做得更好一些,并且检查分支是否   它没有在其他地方检查出来。
  这将帮助那些只想将现有分支机构检查到新工作区
的用户,并保存一些按键。

     

当一个名称分支时,当前行为只是“die()”   路径的基本名称已经存在,没有倒退   兼容性在这里担心。

     

如果在另一个工作树中签出分支,我们仍然会“die()”   除非传递--force标志。

documentation now states

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

如果省略<commit-ish>且未使用-b-B--detach,   然后,为方便起见,新的工作树与分支相关联   (称之为<branch>)以$(basename <path>) 命名。

     
      
  • 如果<branch>不存在,则会自动创建基于HEAD的新分支,就像给出了-b <branch>一样。
  •   
  • 如果<branch>确实存在,则会在新的工作树中检出,如果未在其他地方检出,则该命令将拒绝创建工作树(除非{{使用1}}。
  •   

答案 3 :(得分:1)

除了git worktree add --checkout之外,Git 2.16(2018年第一季度)将提出另一种选择:

git worktree add”确定从哪里创建分支以及在新工作树中检出的方式已经更新了一点。

请参阅commit e92445acommit 71d6682(2017年11月29日),commit 4e85333commit e284e89commit c4738aecommit 7c85a87(2017年11月26日) Thomas Gummerer (tgummerer) Junio C Hamano -- gitster --合并于commit 66d3f19,2017年12月19日)

  

添加worktree.guessRemote配置选项

     

有些用户可能希望引入--guess-remote选项   默认情况下,上一次提交,因此他们不必键入它   每次他们创建一个新的工作树。

     

添加允许用户配置的配置选项worktree.guessRemote   他们自己的默认行为。

documentation for git config现在显示为:

worktree.guessRemote::
     

使用add,如果没有分支参数,同时没有给出-b-B--detach,则命令默认为从HEAD创建新分支。<登记/>   如果worktree.guessRemote设置为true,worktree add会尝试查找名称与新分支名称唯一匹配的远程跟踪分支。

     
      
  • 如果存在这样的分支,则将其签出并设置为新分支的“上游”。
  •   
  • 如果找不到这样的匹配,它将回退到从当前HEAD创建一个新分支。
  •   

实际上,Git 2.21(2019年第一季度)澄清了此选项的文档,该文档直接跳到“With add”,而没有解释add是“git worktree”的子命令

commit b4583d5Eric Sunshine (sunshineco)(2018年12月23日) Eric Sunshine -- sunshineco --合并于commit b4583d5,2018年12月28日)

The documentation现在写着:

  

worktree.guessRemote

     

如果未指定分支且未使用-b-B--detach,则git worktree add默认从HEAD创建新分支。