簡體   English   中英

Git 從現有的遠程分支添加工作樹

[英]Git add a worktree from existing remote branch

在我的遠程存儲庫中有 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)

在我的辦公室 PC 上,我為那些northrazavi分支添加了 2 worktree工作razavi

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

到目前為止一切都很好,我決定也在家中處理這個項目,但是在我的家用 PC 中,當我嘗試為這兩個分支添加工作樹時,它給了我一個錯誤:

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

我刪除了-b開關以不添加新分支,但它也不起作用。

如何從不是本地而是遠程的現有分支添加工作worktree

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

首先,提醒(或信息的其它部門這一問題推出): git worktree add想要創建一個新的worktree,在同一時間,確保這一新worktree使用不同分支的名字從所有其他工作樹。 這是因為,雖然每個添加的工作樹都有自己的索引和HEAD ,但HEAD文件最終共享共享存儲庫中的底層分支指針。 擁有兩個具有獨立索引對象但具有相同底層分支的不同工作樹會導致用戶處理一些棘手的問題。 git worktree並沒有試圖弄清楚如何處理這些問題——通過教育程序員或提供工具來解決問題—— git worktree完全禁止這種情況。

因此,在創建新的工作樹時想要創建一個新的分支名稱是非常典型的。 根據定義,新的分支名稱自動不同於每個現有的分支名稱:

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

這似乎很自然:沒有人對此感到驚訝。

您正在以類似於git checkout -b的方式運行git worktree add ,不同之處在於結帳發生在新添加的工作樹中。 但是您已經有一個名為north的分支。

如果這個現有的north分支沒有用,您可以將其刪除。 現在您沒有名為north的本地分支,您可以創建一個新分支。

如果現有的north分支很有用的,不要刪除它! 如果它已經在某個現有的工作樹中簽出,請移至該工作樹並在那里進行處理。 如果它不是在現有的一些工作樹簽出,你可以做一個新的工作樹,已簽出; 您只需要避免使用-b標志(和相應的分支名稱):

git worktree add ../north north

請注意,當您創建分支時,您不必重復自己:

git worktree add -b newbranch ../path

將在../path創建一個新的工作樹,並使用git checkout -b newbranch來填充它。 在以下情況下您只需要分支名稱:

  1. 你沒有使用-b ,並且
  2. 路徑參數不以分支的名稱結尾。

舉例來說,如果你想看看現有的分支zorg在路徑中的新工作樹../zorg ,你可以運行:

git worktree add ../zorg

在這里,由於既沒有-b zorg也沒有 final 參數,Git 通過使用../zorg的最后一部分來../zorg分支名稱,這當然只是zorg ,所以這會嘗試將現有的分支zorg到新的工作樹。

對於這個問題, worktree add確實需要一個--checkout開關來做到這一點:

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

除了“猜測遠程分支”之外,正如我在其他答案中所解釋的,Git 2.18(2018 年第二季度)將提供一個新功能:
git worktree add ”學會了檢查現有分支。

請參閱Thomas Gummerer ( tgummerer ) 的commit f60a7b7commit 6427f87commit 2c27002commit d861d34 (2018 年 4 月 24 日
幫助者: Eric Sunshine ( sunshineco )
(由Junio C gitster合並-- gitster -- in commit 10174da ,2018 年 5 月 23 日)

工作樹:教“ add ”檢查現有分支

當前' git worktree add <path> '默認創建一個以路徑的基本名稱命名的新分支。
如果具有該名稱的分支已經存在,則該命令將拒絕執行任何操作,除非給出了“ --force ”選項。

然而,我們可以做得比這更好一點,如果在其他任何地方都沒有檢出分支,就檢出它。
這將幫助那些只想將現有分支檢出到新工作樹中的用戶,並節省一些擊鍵。

由於當前的行為是在具有路徑基本名稱名稱的分支已經存在時簡單地執行“ die() ”,因此這里沒有向后兼容性問題。

如果分支在另一個工作樹中被檢出,我們仍然會 ' die() ',除非--force標志被傳遞。

文檔現在指出

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

如果省略<commit-ish>並且既不使用-b也不使用-B也不使用--detach ,那么為了方便起見,新的工作樹與以$(basename <path>)命名的分支(稱為<branch> ) 相關聯$(basename <path>)

  • 如果<branch>不存在,則會自動創建一個基於 HEAD 的新分支,就像給定了-b <branch>
  • 如果<branch>確實存在,它將在新的工作樹中檢出,如果沒有在其他任何地方檢出,否則該命令將拒絕創建工作樹(除非使用--force )。

Git 2.30(2021 年第一季度)修復了“ git worktree addman子命令中帶有兩個占位符的錯誤消息的表述。

請參閱Matheus Tavares ( matheustavares ) 提交的 b86339b (2020 年 11 月 20 日)
(由Junio C gitster -- gitster --提交 f73ee0c 中合並,2020 年 11 月 30 日)

worktree :修復錯誤消息中的參數順序

簽字人:馬修斯·塔瓦雷斯
審核人:Eric Sunshine

git worktree add ( man ) (不帶--force )當給定的路徑已經注冊為工作樹並且該路徑在磁盤上丟失時會出錯。
但是cmdpath字符串在錯誤信息上打開。
讓我們解決這個問題。

這是關於錯誤消息:

<path> is a missing but locked worktree
use '<cmd> -f -f' to override, or 'unlock' and 'prune' or 'remove' to clear

或者:

<path> is a missing but already registered worktree
use '<cmd> -f' to override, or 'unlock' and 'prune' or 'remove' to clear

除了git worktree add --checkout ,Git 2.16(2018 年第一季度)將提出另一種替代方案:

git worktree add ”的方式決定了從哪里創建哪個分支,並且新工作樹中的結帳已經更新了一點。

請參閱Thomas Gummerer ( tgummerer ) 的commit e92445acommit 71d6682 (2017 年 11 月 29 日)和commit 4e85333commit e284e89commit c4738aecommit 7c85a87 (2017 年 11 月 26 日
(由Junio C gitster合並-- gitster -- in commit 66d3f19 ,2017 年 12 月 19 日)

添加worktree.guessRemote配置選項

一些用戶可能希望默認情況下在上一次提交中引入--guess-remote選項,因此他們不必每次創建新工作樹時都輸入它。

添加一個配置選項worktree.guessRemote ,允許用戶為自己配置默認行為。

git config文檔現在顯示為:

 worktree.guessRemote::

使用add ,如果沒有分支參數,也沒有給出-b-B--detach ,命令默認從 HEAD 創建一個新分支。
如果worktree.guessRemote設置為 true, worktree add嘗試查找名稱與新分支名稱唯一匹配的遠程跟蹤分支。

  • 如果存在這樣的分支,則將其檢出並設置為新分支的“上游”。
  • 如果找不到這樣的匹配,它會退回到從當前 HEAD 創建一個新分支。

實際上,Git 2.21(2019 年第 1 季度)澄清了此選項的文檔,該文檔直接加入了“With add ”,但沒有說明add是“git worktree”的子命令。

請參閱Eric Sunshine ( sunshineco ) 提交的 b4583d5 (2018 年 12 月 23 日
(通過合並埃里克陽光- sunshineco -提交b4583d5 12月28日2018)

文檔現在是這樣的:

worktree.guessRemote

如果沒有指定分支並且-b-B--detach都沒有使用,那么git worktree add默認從 HEAD 創建一個新分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM