web-dev-qa-db-ja.com

Gitクローンのリモートリポジトリの特定のバージョン

約1か月前にリモートgitリポジトリのクローンを作成しました。リモートリポジトリには多くの変更が加えられ、不安定になりました。ここで、1か月前にクローンを作成したリポジトリと同じバージョンのリポジトリの別のコピーが必要です。

どうすればいいですか?

157
nandu

リポジトリを任意のコミットに「リセット」できます(1か月前など)。

そのために git-reset を使用します。

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

簡単に使えます

git checkout  commithash

この順序で

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

コミットハッシュは「45ef55ac20ce2389c9180658fdba35f4a663d204」のようになります

72
M.Othman

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.

そうすれば、情報を失うことがないので、安定したときに新しいリビジョンに移動できます。

31
jweyrich

取得する必要のあるバージョンがブランチまたはタグの場合:

git clone -b branch_or_tag_name repo_address_or_path
5
unclechu

集中型バージョン管理システムとは異なり、Gitはリポジトリ全体を複製するため、現在のリモートファイルだけでなく、履歴全体も取得できます。ローカルリポジトリには、これらすべてが含まれます。

特定のバージョンをその時点でマークするためにtagsがあった可能性があります。そうでない場合は、ローカルで作成できます。これを行う良い方法は、git logを使用するか、おそらくgitkのようなツールで視覚的に使用することです(すべてのブランチとタグを表示するには、おそらくgitk --all)。そのときに使用されたコミットハッシュを見つけることができる場合は、git tag <hash>を使用してタグ付けし、新しい作業コピーでそれらをチェックアウトできます(たとえば、git checkout -b new_branch_name tag_nameまたはタグ名の代わりにハッシュで直接)。

2
Bruno

次のように解決できます。

git reset --hard sha

ここでsha例:85a108ec5d8443626c690a84bc7901195d19c446

次のコマンドで目的のshaを取得できます。

git log
1

おそらくgit resetが問題を解決します。

git reset --hard -#commit hash-
0
user4783046

必要なソースツリーはまだgitリポジトリ内で利用可能ですが、興味のあるコミットのSHA1が必要になります。現在のクローンからSHA1を取得できると思いますか?

そのSHA1を取得できれば、ブランチを作成/リセットして、同一のリポジトリを作成できます。

Ruiの回答によるコマンド

0
gpampara

uploadpack.allowReachableSHA1InWant

Git 2.5. この構成変数はサーバーで有効にできるため、ここでは 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"