[英]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 上,我為那些north
和razavi
分支添加了 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
來填充它。 在以下情況下您只需要分支名稱:
-b
,並且 舉例來說,如果你想看看現有的分支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 f60a7b7 、 commit 6427f87 、 commit 2c27002 、 commit 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 add
” ( man )子命令中帶有兩個占位符的錯誤消息的表述。
請參閱Matheus Tavares ( matheustavares
) 提交的 b86339b (2020 年 11 月 20 日) 。
(由Junio C gitster
-- gitster
--在提交 f73ee0c 中合並,2020 年 11 月 30 日)
worktree
:修復錯誤消息中的參數順序簽字人:馬修斯·塔瓦雷斯
審核人:Eric Sunshine
git worktree add
( man ) (不帶--force
)當給定的路徑已經注冊為工作樹並且該路徑在磁盤上丟失時會出錯。
但是cmd
和path
字符串在錯誤信息上打開。
讓我們解決這個問題。
這是關於錯誤消息:
<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 e92445a 、 commit 71d6682 (2017 年 11 月 29 日)和commit 4e85333 、 commit e284e89 、 commit c4738ae 、 commit 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.