關于 Git,我有很多不知道的地方。我希望了解這是如何發生的:
- 2 個月前我有一個活躍的分支:feature/branch-1
- 該分支已合并到我的默認分支:develop
- 它已在遠程存盤庫 (bit-bucket) 中洗掉
- 它已從本地檔案系統中洗掉:
git branch -d feature/branch-1 git branch我沒有看到分支- 今天我驚訝地發現我可以做到:
git checkout feature/branch-1 git branch我可以看到分支
git 是否找出合并點(分支合并時)并檢查該提交?
uj5u.com熱心網友回復:
雙方git checkout并git switch(在這種情況下做同樣的事情)已經內置了一個特殊的功能。他們處理切換到類似于分支名稱的字串的請求的方式是這樣的:
檢查給定的字串,例如,
fooorfeature/branch-1或5a73c,是否已經作為分支名稱存在。如果是這樣,那就是要簽出的分支的名稱。檢查給定的字串,例如 ,是否
5a73c可以轉換為提交的有效哈希 ID。如果是這樣,那就是要檢查的提交,作為一個分離的 HEAD。(這里git checkout只會這樣做,git switch除非您使用--detach,否則會因致命錯誤而死亡,在這種情況下它很好并且也會這樣做。)假設我們已經到了這一步,如果
--guess有效(見下文),請使用猜測代碼。在舊版本的 Git 中,這稱為“DWIM 模式”,其中 DWIM 代表按我的意思去做。(DWIM的悠久歷史可以追溯到 1960 年代的 Lisp,甚至在我使用計算機之前:我直到 1970 年代才開始搞亂硬體然后是軟體。)
該--guess選項首先在commit 中ccb111b342f472d12baddbfa5b5281正式(并正確記錄),首先在 Git 2.23.0 中發布,但由于它默認為on并且在此之前始終存在,除非您明確將其關閉,否則它需要一個 Git 版本的 at至少 2.23。所以它幾乎總是開啟。
它的作業方式是掃描您自己的存盤庫中的每個遠程跟蹤名稱。這些名稱是在git fetch時間創建和更新的,包括由git fetch操作運行的大多數git pull操作。默認情況下,除非您明確運行或,否則它們不會被洗掉,或者對于特殊情況,當您專門用于從當前具有相應遠程跟蹤名稱的遠程洗掉分支時。git fetch --prunegit remote prunegit push
您的遠程跟蹤名稱是類似于例如origin/foo或的名稱origin/feature/branch-1。你不太可能有一個,origin/5a73c因為沒有人會使用它作為分支名稱:你的遠程跟蹤名稱是你的 Git 對他人分支名稱的副本,而其他人將其用作分支名稱會很瘋狂1。但是它可能會偶然發生在一個完全由有效的十六進制數字組成的四個或更多字母的單詞2中:分支名稱,例如deedorefface或faded在這里可能會引發怪異。
無論如何,假設我們首先進入第 3 步(--guess代碼),Git 會掃描您的遠程跟蹤名稱。您輸入了,例如:
git checkout feature/branch-1
當你沒有feature/branch-1分支時,所以第 1 步失敗;feature/branch-1無法轉換為有效的哈希 ID,因為它包含非十六進制字符,例如t和 正斜杠;所以我們到了第 3 步。Git 現在掃描你所有的origin/*名字:是其中之一origin/feature/branch-1嗎?
在這種情況下:是的,一個是。Git 還將掃描所有其他遠程跟蹤名稱,例如upstream/*,此時,以查找所有候選名稱。所有這些候選人的名單然后進入最后一組測驗:
串列是空的嗎?如果是,則猜測失敗。
串列是否正好是一個元素長?如果是這樣,這就是您希望 Git 猜測的遠程跟蹤名稱。
否則(超過串列中的一個條目),猜謎失敗,因為比賽之間的較量,除非你使用)在Git的2.19中引入的功能,
checkout.defaultRemote。此功能可讓您選擇“贏得”此類比賽的特定遙控器。
在這種情況下,您正好有一個匹配項:origin/feature/branch-1。這使得--guess猜測而不是:
git checkout feature/branch-1
你的意思是:
git checkout -b feature/branch-1 --track origin/feature/branch-1
這就是git checkout所做的。(雖然git switch拼寫為-c,git switch在這里的行為方式相同,使用相同的控制旋鈕:--guess在命令列上和checkout.defaultRemote處理不明確的多個匹配。)
這里的一個潛在教訓是,在您的個人 Git 配置中運行git fetch -p或git remote prune經常運行,甚至設定fetch.prune為運行可能是明智的true。否則,你可以有很多陳舊的遠程跟蹤的名字,和與人是人,你發明名稱為您的新特性可能與一些老字號有人發明了碰撞的新功能。或者,代替那堂課,也許要上的課是禁用猜測(可能是在 Git-2.30 中的新config.guess設定)。請注意,如果您想使用遠程跟蹤名稱origin/foo來創建本地分支foo,您可以輸入:
git switch -t origin/foo
(該-c foo部分是隱含的)。git checkout當然,這也適用于舊的。
1他們的瘋狂可能有某種方法,或者他們的方法可能只是一種瘋狂。??
2 Git 允許原始哈希 ID 的最短縮寫是四個字符。因此abc,盡管分支名稱由十六進制數字組成,但永遠不是提交哈希 ID。但abcd 就是有時提交哈希ID。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363601.html
