【问题标题】:Git clone particular version of remote repositoryGit克隆特定版本的远程存储库
【发布时间】:2011-04-03 01:50:54
【问题描述】:

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

我该怎么做?

【问题讨论】:

标签: git git-clone


【解决方案1】:

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

为此使用git-reset

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

【讨论】:

  • 你没有提到它,但这只会重置master 分支,默认情况下在克隆上签出。如果master 以外的分支是您必须在git reset 之前首先签出的主要开发分支
  • 你为什么不对想要的提交做一个简单的检查?
  • 因为在签出特定提交后,您将处于“分离 HEAD”状态。
  • @RuiCarneiro 最好使用git checkout -b new_branch hash 您基于哈希创建一个新分支,而无需触及任何其他分支。当需要将某些内容推送到远程服务器时,移动现有分支的头部可能会导致问题。
  • @YuriGhensev 如果提交已经被推送到远程分支,您可以执行 git pull origin [branch] 否则,afaik,它丢失了。
【解决方案2】:

你可以简单地使用

git checkout  commithash

按此顺序

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

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

【讨论】:

  • 我最喜欢这个答案。我认为应该避免使用git reset --hard,而应使用git checkout commit-hashgit reset --hard 删除了部分 git 历史记录,这有时是不可取的。
【解决方案3】:

使用git log 查找要回滚到的修订版,并记下提交哈希。之后,您有两个选择:

  1. 如果您打算在该修订版之后提交任何内容,我建议您签出到新分支:git checkout -b <new_branch_name> <hash>

  2. 1234563 ' 状态,这意味着它当前没有附加到任何分支 - 然后是you'll have some extra work to merge new commits to an actual branch

例子:

$ 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.

这样您就不会丢失任何信息,因此您可以在它稳定后移至更新的版本。

【讨论】:

  • 但也不是你处于一个分离的头上,这对于只读操作来说是可以的。但是当您打算从这个版本开始进行更改时,您需要创建一个新分支。请参阅sitaramc.github.com/concepts/detached-head.html 了解更多信息。
  • @Rudi:谢谢。这只是一个展示用法的例子。更新以提及它。
  • 要回到“工作状态”,你可以git checkout develop,其中develop是你的分支名称。
  • @SteveTauber 好吧,假设你一个不同的分支正在工作,那么切换到那个分支确实足够了。
【解决方案4】:

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

git clone -b branch_or_tag_name repo_address_or_path

【讨论】:

    【解决方案5】:

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

    当时可能有 标签 来标记特定版本。如果没有,您可以在本地自己创建它们。一个很好的方法是使用git log 或者更直观地使用gitk 之类的工具(也许gitk --all 可以查看所有分支和标签)。如果您可以发现当时使用的提交哈希,您可以使用git tag &lt;hash&gt; 标记它们,然后在新的工作副本中检查它们(例如git checkout -b new_branch_name tag_name 或直接使用哈希而不是标记名称)。

    【讨论】:

      【解决方案6】:

      你可以这样解决:

      git reset --hard sha
      

      在哪里sha 例如:85a108ec5d8443626c690a84bc7901195d19c446

      您可以通过以下命令获得所需的sha:

      git log
      

      【讨论】:

        【解决方案7】:

        uploadpack.allowReachableSHA1InWant

        由于Git 2.5.0这个配置变量可以在服务器上启用,这里是GitHub feature requestGitHub commit enabling this feature

        Bitbucket Server enabled it since version 5.5+.

        用法:

        # 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"
        

        【讨论】:

          【解决方案8】:

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

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

          根据 Rui 的回答命令

          【讨论】:

            【解决方案9】:

            git reset 可能会解决你的问题。

            git reset --hard -#commit hash-
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-12-17
              • 1970-01-01
              • 2011-10-18
              • 1970-01-01
              • 2021-12-10
              相关资源
              最近更新 更多