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


181

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

どうすればよいですか?



回答:


242

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

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

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

27
あなたはそれについて言及しませんでしたがmaster、これはブランチをリセットするだけで、デフォルトでクローンにチェックアウトされています。以外のmasterブランチがメインの開発ブランチであり、最初にチェックアウトする必要がある場合git reset
Steve Folly

16
必要なコミットを単純にチェックアウトしないのはなぜですか?
nemoo 2013年

10
特定のコミットへのチェックアウト後、「切り離されたヘッド」状態になるためです。
Rui Carneiro 2013年

6
@RuiCarneiro git checkout -b new_branch hash他のブランチに触れずに、ハッシュに基づいて新しいブランチを作成する方が良いでしょう。既存のブランチのヘッドを移動すると、リモートサーバーに何かをプッシュするときに問題が発生する可能性があります。
ロイック・フォーレ-ラクロワ

1
@YuriGhensevコミットがすでにリモートブランチにプッシュされているgit pull origin [branch]場合は、別の方法で行うことができます。
Rui Carneiro 2017

94

簡単に使える

git checkout  commithash

このシーケンスで

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

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


9
私はこの答えが一番好きです。私git reset --hardはを支持して、避けるべきだと思いますgit checkout commit-hashgit reset --hard時々望ましくないgitの歴史の一部を削除します。
ジョーダンスチュワート

8
git init必要ありません
Lautaro Paskevicius

37

を使用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.

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


2
しかし、あなたが分離した頭の上にいることも、読み取り専用操作には問題ありません。ただし、このリビジョンから変更を加える場合は、新しいブランチを作成する必要があります。詳細については、sitaramc.github.com / concepts / detached-head.htmlをご覧ください。
ルディ

@ルディ:ありがとう。使い方を示す一例にすぎません。それを言及するために更新されました。
jweyrich

「作業ステータス」に戻るにgit checkout developは、開発の場所がブランチの名前であることがわかります。
スティーブタウバー2014年

1
@SteveTauber 、別のブランチが動作していると仮定し、そのブランチに変更するだけで十分です。
jweyrich 14年

19

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

git clone -b branch_or_tag_name repo_address_or_path

2

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

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


1

あなたはこのようにそれを解決することができます:

git reset --hard sha

ここでsha例:85a108ec5d8443626c690a84bc7901195d19c446

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

git log

1

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"

0

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

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

ルイの答えによるコマンド


0

おそらくgit resetあなたの問題を解決します。

git reset --hard -#commit hash-
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.