216

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

我该怎么做呢?

4

9 回答 9

269

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

为此使用git-reset

git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]
于 2010-08-24T09:41:20.153 回答
121

你可以简单地使用

git checkout  commithash

在这个序列中

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

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

于 2013-08-03T21:38:14.483 回答
38

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

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

  2. 如果您不打算在该修订版之后提交任何内容,您可以简单地在没有分支的情况下签出:git checkout <hash>- 注意:这将使您的存储库处于“分离 HEAD”状态,这意味着它当前未附加到任何分支 - 那么你将有一些额外的工作将新提交合并到实际分支

例子:

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

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

于 2010-08-24T09:42:16.680 回答
25

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

git clone -b branch_or_tag_name repo_address_or_path
于 2019-01-06T23:27:41.300 回答
2

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

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

于 2010-08-24T09:47:38.673 回答
2

你可以像这样解决它:

git reset --hard sha

sha例如:85a108ec5d8443626c690a84bc7901195d19c446

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

git log
于 2018-09-03T09:16:47.417 回答
2

uploadpack.allowReachableSHA1InWant

由于Git 2.5.0可以在服务器上启用此配置变量,这里是GitHub 功能请求启用此功能的 GitHub 提交

Bitbucket Server 从 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"
于 2018-09-13T08:02:12.487 回答
0

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

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

根据 Rui 的回答的命令

于 2010-08-24T09:42:39.473 回答
0

大概git reset可以解决你的问题。

git reset --hard -#commit hash-
于 2016-05-31T10:05:09.503 回答