![](/img/trans.png)
[英]git rebase <tag> / git reset --soft <tag> is not working
[英]how to reset a git working tree to an updated commitish
我需要使用Bash腳本擴展一個給定的工具,該腳本應該可以在Linux和MacOS上使用。 該腳本獲取2個參數:
我對參數沒有影響
腳本運行的結果應該是
如果該存儲庫在本地還不存在,則過程很簡單
git clone $REPO_SOURCE $REPO_DIR
cd $REPO_DIR
git checkout $REPO_REF
我的問題:考慮一個存儲庫已經克隆到/repos/foo
。 在git fetch
obvios git fetch
后,如何將該存儲庫更新為提供的$REPO_REF
?
$REPO_REF
是分支,則git checkout $REPO_REF && git pull
應該起作用 git checkout $REPO_REF
嗎?) 是否有一種簡單的reset-repository-to-this-commitsh
方式,所以存儲庫的行為就像是剛克隆的一樣?
側節點:
唯一完全安全且方便的方法是讓另一個 Git(您可能正在克隆的一個Git,但可能沒有克隆)為您解析名稱。 然后,您具有哈希ID,並且哈希ID是通用的。
如果名稱是分支名稱或標記名稱,則可以使用git ls-remote
來完成該步驟。 如果這可能是其他公式(例如master~13
),那么您就不走運了。 因此,如果您需要在本地解析名稱:
如果遵守標簽規定,則標簽將永遠不會移動。 這意味着,如果您有一個具有標簽的現有克隆,它具有正確的標簽,並且您在這里還可以,並且如果您有一個沒有標簽的現有克隆,則可以添加該標簽並對其進行解析。
如果不遵守標簽規范,則必須刪除並重新創建標簽(糟糕),或者重新發明遠程標簽:將其refs/tags/*
名稱復制到refs/rtags/<remote>/*
命名空間。 當兩個遙控器的標簽名稱相同時,請參見Git-Checkout一個遙控器標簽 。
如果你有一個分支名稱或東西相對於分支名稱,打開分支名到自己的遠程跟蹤名稱(例如,更換master~13
與refs/remotes/origin/master~13
),並解決它。
無論如何,您現在都有一個哈希ID,並且可以使用分離的HEAD模式。
使用“標准” git克隆,您可以這樣做:
# cleanup old cruft
git reset --hard HEAD
git clean -fdx
# detach from current branch (if on any)
git checkout --detach
# delete all local branches
git for-each-ref --format="%(refname:strip=2)" refs/heads |xargs -r git branch -D
# fetch and update all remote refs and tags
git fetch --force --all --tags --prune --prune-tags
# checkout
git checkout "$COMMITISH"
這樣,您可以像往常一樣依靠git checkout
來完成其工作,而無需復制其啟發式,快捷方式等任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.