簡體   English   中英

git checkout <branch> 要么 <commit>

[英]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,在這里實現幾個相互關聯的事情非常重要:

  1. 總是很好, 幾乎總是 - 當前提交,您可以使用HEAD一詞來查找。
  2. 並不總是有一個當前分支,但如果有,它是一個分支名稱 ,即一個全名具有refs/heads/ name形式的refs/heads/ name 所有大寫字母中的相同單詞HEAD都會找到分支名稱。 如果沒有當前分支名稱,Git將其稱為分離的HEAD
  3. 遠程跟蹤名稱 (例如origin/master )不是分支名稱 它的完整形式以refs/remotes/而不是refs/heads/開頭。
  4. 如果告訴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是否附屬於分支? 如果是這樣,哪個分支?
  • 當前提交的哈希ID是什么?

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.

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