Git克隆远程存储库的特定版本

Git克隆远程存储库的特定版本,git,git-clone,Git,Git Clone,大约一个月前,我克隆了一个远程git存储库。远程存储库经历了许多更改,现在变得不稳定。现在我需要存储库的另一个副本,版本与我一个月前克隆的版本相同 如何执行此操作?您可以将存储库“重置”为您想要的任何提交(例如,1个月前) 用于: git clone [remote_address_here] my_repo cd my_repo git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT] 使用git log查找要回滚到的修订,并注意提交散列。

大约一个月前,我克隆了一个远程git存储库。远程存储库经历了许多更改,现在变得不稳定。现在我需要存储库的另一个副本,版本与我一个月前克隆的版本相同

如何执行此操作?

您可以将存储库“重置”为您想要的任何提交(例如,1个月前)

用于:

git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]

使用
git log
查找要回滚到的修订,并注意提交散列。之后,您有两个选项:

  • 如果您计划在修订后提交任何内容,我建议您签出到新的分支机构:
    git checkout-b

  • 如果您不打算在该修订版后提交任何内容,您只需在没有分支的情况下签出即可:
    git checkout
    -注意:这将使您的存储库处于“分离头”状态,这意味着它当前未连接到任何分支-然后

  • 例如:

    $ git log
    commit 89915b4cc0810a9c9e67b3706a2850c58120cf75
    Author: Jardel Weyrich <suppressed>
    Date:   Wed Aug 18 20:15:01 2010 -0300
    
        Added a custom extension.
    
    commit 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
    Author: Jardel Weyrich <suppressed>
    Date:   Wed Aug 18 20:13:48 2010 -0300
    
        Missing constness.
    
    $ git checkout 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
    Note: moving to '4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7'
    which isn't a local branch
    If you want to create a new branch from this checkout, you may do so
    (now or later) by using -b with the checkout command again. Example:
      git checkout -b <new_branch_name>
    HEAD is now at 4553c14... Missing constness.
    
    $git日志
    提交89915b4cc0810a9c9e67b3706a2850c58120cf75
    作者:Jardel Weyrich
    日期:2010年8月18日星期三20:15:01-0300
    添加了自定义扩展名。
    提交4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
    作者:Jardel Weyrich
    日期:星期三2010年8月18日20:13:48-0300
    康斯特内斯失踪。
    $git结帐4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
    注:移至“4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7”
    哪一家不是本地分支机构
    如果要从此签出创建新分支,可以这样做
    (现在或以后)再次使用-b和checkout命令。例子:
    git签出-b
    头现在在4553c14。。。康斯特内斯失踪。
    

    这样,您就不会丢失任何信息,因此当它变得稳定时,您可以移动到更新的版本。

    您需要的源代码树在git存储库中仍然可用,但是,您需要您感兴趣的提交的SHA1。我假设您可以从当前克隆中获得SHA1

    如果您可以得到SHA1,那么您可以在那里创建一个分支/重置,以拥有相同的存储库


    与集中式版本控制系统不同,Git克隆了整个存储库,因此您不仅可以获取当前远程文件,还可以获取整个历史记录。您的本地存储库将包含所有这些内容

    当时可能有标记来标记特定版本。如果没有,您可以自己在本地创建它们。这样做的一个好方法是使用
    git log
    ,或者更直观地使用
    gitk
    等工具(可能
    gitk--all
    查看所有分支和标记)。如果您可以发现当时使用的提交散列,您可以使用
    git-tag
    标记它们,然后在新的工作副本中检查它们(例如
    git-checkout-b new\u-branch\u-name-tag\u-name
    或直接使用散列而不是标记名)。

    您可以简单地使用

    git checkout  commithash
    
    按此顺序

    git clone `URLTORepository`
    cd `into your cloned folder`
    git checkout commithash
    

    提交哈希看起来像“45ef55ac20ce2389c9180658fdba35f4a663d204”

    可能
    git reset
    解决了您的问题

    git reset --hard -#commit hash-
    

    您可以这样解决它:

    git reset --hard sha
    
    其中
    sha
    例如:
    85a108ec5d8443626c690a84bc7901195d19c446

    您可以使用以下命令获得所需的sha:

    git log
    

    uploadpack.allowareachablesha1inwant

    由于此配置变量可以在服务器上启用,因此此处和

    用法:

    # Make remote with 4 commits, and local with just one.
    mkdir server
    cd server
    git init
    touch 1
    git add 1
    git commit -m 1
    git clone ./ ../local
    for i in {2..4}; do
        touch "$i"
        git add "$i"
        git commit -m "$i"
    done
    
    # Before last commit.
    SHA3="$(git log --format='%H' --skip=1 -n1)"
    # Last commit.
    SHA4="$(git log --format='%H' -n1)"
    
    # Failing control without feature.
    cd ../local
    # Does not give an error, but does not fetch either.
    git fetch origin "$SHA3"
    # Error.
    git checkout "$SHA3"
    
    # Enable the feature.
    cd ../server
    git config uploadpack.allowReachableSHA1InWant true
    
    # Now it works.
    cd ../local
    git fetch origin "$SHA3"
    git checkout "$SHA3"
    # Error.
    git checkout "$SHA4"
    

    如果您需要获取的版本是分支或标记,则:

    git clone -b branch_or_tag_name repo_address_or_path
    

    您没有提到它,但这只会重置
    主机
    分支,默认情况下在克隆上签出该分支。如果除了
    master
    之外的一个分支是您的主要开发分支,那么在
    git reset
    之前必须首先签出该分支,为什么不对想要的提交进行简单的签出呢?因为您将处于“分离的头部”签出到特定提交后的状态。@RuiCarneiro最好使用
    git checkout-b new_branch hash
    在不接触任何其他分支的情况下基于该哈希创建新分支。移动现有分支的头可能会导致将某些内容推送到远程服务器时出现问题。@YuriGhensev如果提交已推送到远程分支,则可以执行
    git pull origin[branch]
    否则,很可能会丢失该分支。但也不能说明您是在分离的头上,这对于只读操作是可以的。但是,当您打算从此修订版开始进行更改时,需要创建一个新分支。更多信息请参见。@Rudi:谢谢。这只是一个例子来说明它的用法。更新提到它。要回到“工作状态”,你只需
    git checkout develope
    其中develope是你分支的名称。@SteveTauber好吧,假设你有另一个正在工作的分支,更改到该分支就足够了。可能重复的可能重复我最喜欢这个答案。我认为应该避免使用
    git重置--hard
    ,而使用
    git checkout commit hash
    。git重置--hard会删除git历史记录中有时不需要的部分。