git uzak havuzdan belirli bir revizyon çekin


56

Deponun en yeni sürümünü almak için normalde git pushdev sunucumuzda, ardından git pullcanlı sunucularımızda kullanmak üzere kullandığımız uzak bir git depomuz var .

Ancak birkaç revizyon gerçekleştirmiş ve ittirmişsek ( git pullcanlı sunucularda olmasa ) git pull, istediğimiz eski taahhüde atıfta bulunan bir şeyi nasıl yapabiliriz ?

yani bir şey gibi git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

Yanıtlar:


64

Depoyu bir kez çektikten sonra gidebilmeniz gerekir:

git checkout 3ef0d...

1
Güzel, bu mükemmel çalıştı. Ayrıca Geleceğin çeker için senkronize geri almak istiyorsanız (yani bir sonraki çekme yaparken ben uzak sunucu belirtmek gerekir fark git pull server:repodüzenli vs git pull)
dlrust

1
Belki OP yanlış soruyu sordu, ama benim için doğru soru ve bu bir cevap değil. Yerel olarak eksik olan sunucu üzerinde belirli bir taahhüt var. Taahhüt, bir dalın veya bir etiketin parçası değildir ve çekme / alma işlemleriyle değiştirilmez. Belirli bir taahhüt nasıl getirilir?
BlackEye

8

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 Sunucusu 5.5 + sürümünden beri etkin .

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"

2

Canlı sunucunuzdaki bazı işlemler hemen çekilen içeriğe hemen erişiyorsa (yani git checkout 3ef0d, çekme işleminden sonra çalışamazsınız ), üretimde dağıtmak istediğiniz sürümü etiketlemeyi ve özellikle üretimdeki bu etiketi kontrol etmeyi düşünmelisiniz; çalışma dizininizi değiştirin. Aksi takdirde, çekmeden hemen önce birini itme riskiyle karşı karşıya kalırsınız.


1

Bir unutmayın git pull git checkout my-old-commit artık MÜSTAKİL BAŞ durumda bırakır - etkili bir yeni taahhüt yolda bu depoda gelecekteki hareketin gönderiyoruz. Bir dağıtım repo için bu önemli bir sorun değildir, çünkü yalnızca taahhütler, çekilmeden önce doğru şekilde işlenmiş olanlar olmalıdır.

Ancak, taahhüt kalemlerinin (kafa, etiketler, uzaktan kumandalar) ana depo ile aynı göründüğünü kontrol etmek bazen yararlıdır. Bunu yaptıktan sonra bunu düzeltmek için: git reset - kafayı yeniden bağlar git fetch - imleri uzaktan kumanda için işaretleyicileri senkronize eder [bu sürümüne bağlı olabilir - tabi ki ortamımız hala 1,7 açık ... bu yüzden artık YMMV gerekli olmayabilir]

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.