[英]git checkout <branch> or <commit>
有沒有辦法獲取和檢查提供的參數,而不關心它是一個分支名稱或提交哈希?
git fetch
git checkout origin/<branch> or origin/<commit>
怎么樣? git checkout origin/<commit>
表示沒有這樣的分支。 一個簡單的git checkout <argument>
是不可能的,因為它不會像git checkout origin/<argument>
那樣簽出遠程分支。
您可以先將所有遠程分支(自動包括具有所需提交的分支)提取到本地:
git fetch -a
然后只需通過哈希檢查提交:
git checkout <commit-hash>
首先需要fetch
,否則您的本地可能會或可能不會知道遠程上的commit-hash。 如果沒有fetch
,如果你直接執行checkout
它會抱怨commit-hash無效。
你的問題的前提是錯誤的:
一個簡單的
git checkout <argument>
是不可能的,因為它不會像git checkout origin/<argument>
那樣簽出遠程分支。
關於Git,在這里實現幾個相互關聯的事情非常重要:
HEAD
一詞來查找。 refs/heads/ name
形式的refs/heads/ name
。 所有大寫字母中的相同單詞HEAD
都會找到分支名稱。 如果沒有當前分支名稱,Git將其稱為分離的HEAD 。 origin/master
)不是分支名稱 。 它的完整形式以refs/remotes/
而不是refs/heads/
開頭。 git checkout
簽出提交,但是通過分支名稱之外的其他東西識別它,Git會 - 如果簽出成功,那就是 - 產生第2點中描述的分離的HEAD狀態。(你也可以生成這個使用分支名稱的狀態,使用git checkout --detach
。) 上面第4點的結果是git checkout origin/ name
導致分離的HEAD,與git checkout hash-ID
方式相同。
這意味着你的腳本只能使用git checkout <argument>
,因為它會做同樣的事情 - 產生一個分離的HEAD - 如果參數是一個哈希ID,或者它是一個遠程跟蹤名稱,如origin/develop
。
但請注意,如果我們將此語句更改為:
一個簡單的
git checkout <argument>
是不合適的,因為它不會首先創建,然后簽出一個基於現有遠程跟蹤名稱的本地分支,git checkout <argument minus the leading origin/ part>
方式。
我們得到一個真實的陳述: git checkout develop
將使用名稱origin/develop
創建一個名為develop
的新(本地)分支(當然,提供的本地develop
尚不存在)。 但是,在這里只允許<argument>
並讓用戶提供develop
作為名稱沒有明顯的問題:
#! /bin/sh
git fetch && git checkout "$@"
例如。
這里的第1點和第2點有一個有趣的結果,那就是詢問HEAD
目前的價值,實際上是在問兩個不同的問題之一:
HEAD
是否附屬於分支? 如果是這樣,哪個分支? git symbolic-ref HEAD
命令只回答第一個問題; git rev-parse HEAD
主要回答第二個問題,但也可以告訴你回答第一個問題。
在上面的第1點中, 幾乎是出於特殊原因。 想象一下,您剛剛創建了一個新的,完全空的存儲庫。 此存儲庫中沒有提交 ,因此哪個提交是當前提交?
這種情況對Git來說是個問題。 你在一個不存在的分支上,即master
。 Git稱這是一個孤立的分支或一個尚未創建的分支 (取決於Git的哪個部分正在進行調用)。 Git處理這個問題的方法是將分支的名稱存儲到.git/HEAD
,而不是在參考數據庫中實際創建分支 。 當你進行新的提交時, 它會創建分支本身,現在問題就解決了:你在分支上,它識別剛剛進行的一個新提交,即當前提交,因此HEAD
命名當前提交和目前的分支。
(Git可以根據需要重新創建這種稍微有點痛苦的情況,使用git checkout --orphan
,它將新分支的名稱寫入HEAD
而不實際創建新分支。)
這個巧妙的技巧似乎正是我想要的:
git show-ref --head --sha | grep -q ^argument
如果參數是提交哈希,則其退出代碼為0,否則為1。 取自這里https://stackoverflow.com/a/29707340/3116571
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.