Uzak deponun belirli sürümünü Git klonlama


181

Yaklaşık bir ay önce uzak bir git deposunu klonladım. Uzak depo birçok değişikliğe uğradı ve şimdi kararsız hale geldi. Şimdi bir ay önce klonladığımla aynı olan deponun başka bir kopyasına ihtiyacım var.

Bunu nasıl yaparım?



Yanıtlar:


242

Deponuzu istediğiniz herhangi bir işleme (örneğin, 1 ay önce) "sıfırlayabilirsiniz".

Bunun için git-reset kullanın :

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

27
Bundan bahsetmediniz, ancak bu sadece masterbir klonda varsayılan olarak teslim alınan dalı sıfırlayacaktır . masterÖnceden kontrol edilmesi gereken ana geliştirme dalınız dışında bir dal isegit reset
Steve Folly

16
neden istenen taahhüt için basit bir ödeme yapmıyorsunuz?
nemoo

10
Çünkü belirli bir taahhüdü kontrol ettikten sonra "müstakil HEAD" durumunda olacaksınız.
Rui Carneiro

6
@RuiCarneiro, git checkout -b new_branch hashbaşka bir şubeye dokunmadan, karma temelli yeni bir dal oluştururken kullanmak daha iyi olur . Varolan bir dalın kafasını hareket ettirmek, uzak sunucuya bir şey aktarma zamanı geldiğinde sorunlara neden olabilir.
Loïc Faure-Lacroix

1
@YuriGhensev Taahhüt zaten uzak bir şubeye itilmişse git pull origin [branch], aksi takdirde, afaik, kayıp yapabilirsiniz.
Rui Carneiro

94

Basitçe kullanabilirsiniz

git checkout  commithash

bu sırayla

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

kesin karma şöyle "45ef55ac20ce2389c9180658fdba35f4a663d204"


9
Bu cevabı en çok beğendim. Bence a git reset --hardkaçınılmalıdır, a lehine git checkout commit-hash. Bir git reset --hardbazen arzu değildir git tarihinin bir bölümünü kaldırır.
Jordan Stewart

8
git initgerekli değil
Lautaro Paskevicius

37

Geri git logalmak istediğiniz düzeltmeyi bulmak için kullanın ve işleme karmasını not alın. Bundan sonra 2 seçeneğiniz var:

  1. Bu revizyondan sonra herhangi bir şey yapmayı planlıyorsanız, yeni bir şubeye ödeme yapmanızı öneririz :git checkout -b <new_branch_name> <hash>

  2. Bu revizyondan sonra herhangi bir şey yapmayı planlamıyorsanız, şube olmadan ödeme yapabilirsiniz: git checkout <hash>- NOT: Bu, deponuzu 'ayrılmış HEAD' durumuna getirecektir, yani şu anda herhangi bir şubeye bağlı değildir - o zaman ' yeni taahhütleri fiili bir dalda birleştirmek için ekstra bir işimiz olacak .

Misal:

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

Bu şekilde hiçbir bilgiyi kaybetmezsiniz, böylece kararlı hale geldiğinde daha yeni bir revizyona geçebilirsiniz.


2
Ama aynı zamanda, salt okunur işlemler için uygun olan bağımsız bir kafada olduğunuzu unutmayın. Ancak bu revizyondan başlayarak değişiklik yapmak istediğinizde yeni bir şube oluşturmanız gerekir. Daha fazla bilgi için sitaramc.github.com/concepts/detached-head.html adresine bakın .
Rudi

@Rudi: Teşekkür ederim. Sadece kullanımı göstermek için bir örnekti. Bahsetmek için güncellendi.
jweyrich

"Çalışma durumu" na geri dönmek için git checkout develop, geliştirme bölümünüzün adıdır.
Steve Tauber

1
@SteveTauber iyi supposing sen sahip farklı bir dalı çalışıyor o dal gerçekten yeterli kadar değişen.
jweyrich

19

Elde etmeniz gereken bu sürüm bir dal veya etiketse:

git clone -b branch_or_tag_name repo_address_or_path

2

Merkezi sürüm kontrol sistemlerinden farklı olarak Git, tüm depoyu klonlar, böylece yalnızca geçerli uzak dosyaları değil tüm geçmişi alırsınız. Yerel deponuz tüm bunları içerecektir.

O sırada belirli bir sürümü işaretlemek için etiketler olabilir . Değilse, yerel olarak kendiniz oluşturabilirsiniz. Bunu yapmanın iyi bir yolu, (belki de tüm dalları ve etiketleri görmek) git loggibi araçları kullanmak veya belki de daha görsel olarak kullanmaktır . O sırada kullanılan sağlama karmalarını tespit edebiliyorsanız, bunları kullanarak etiketleyebilir ve daha sonra bunları yeni çalışma kopyalarında kontrol edebilirsiniz (örneğin veya doğrudan etiket adı yerine karma ile).gitkgitk --allgit tag <hash>git checkout -b new_branch_name tag_name


1

Bunu şu şekilde çözebilirsiniz:

git reset --hard sha

burada shaörneğin:85a108ec5d8443626c690a84bc7901195d19c446

İstediğiniz sha komutunu alabilirsiniz:

git log

1

uploadpack.allowReachableSHA1InWant

Git 2.5.0'dan beri bu yapılandırma değişkeni sunucuda etkinleştirilebilir, burada GitHub özellik isteği ve GitHub bu özelliği etkinleştirmeyi taahhüt eder .

Bitbucket Server 5.5+ sürümünden bu yana etkinleştirdi .

Kullanımı:

# 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

İstediğiniz kaynak ağacı git deposunda hala kullanılabilir, ancak, ilgilendiğiniz taahhüdün SHA1'ine ihtiyacınız olacaktır. SHA1'i mevcut klondan alabileceğinizi varsayabilirim?

Bu SHA1'i alabilirseniz, aynı depoya sahip olmak için bir şube oluşturabilir / sıfırlayabilirsiniz.

Rui'nin cevabına göre komutlar


0

Muhtemelen git resetsorununuzu çözer.

git reset --hard -#commit hash-
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.