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?
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:
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]
master
bir 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
git checkout -b new_branch hash
baş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.
git pull origin [branch]
, aksi takdirde, afaik, kayıp yapabilirsiniz.
Basitçe kullanabilirsiniz
git checkout commithash
bu sırayla
git clone `URLTORepository`
cd `into your cloned folder`
git checkout commithash
kesin karma şöyle "45ef55ac20ce2389c9180658fdba35f4a663d204"
git reset --hard
kaçınılmalıdır, a lehine git checkout commit-hash
. Bir git reset --hard
bazen arzu değildir git tarihinin bir bölümünü kaldırır.
git init
gerekli değil
Geri git log
almak istediğiniz düzeltmeyi bulmak için kullanın ve işleme karmasını not alın. Bundan sonra 2 seçeneğiniz var:
Bu revizyondan sonra herhangi bir şey yapmayı planlıyorsanız, yeni bir şubeye ödeme yapmanızı öneririz :git checkout -b <new_branch_name> <hash>
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.
git checkout develop
, geliştirme bölümünüzün adıdır.
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 log
gibi 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).gitk
gitk --all
git tag <hash>
git checkout -b new_branch_name tag_name
Bunu şu şekilde çözebilirsiniz:
git reset --hard sha
burada sha
örneğin:85a108ec5d8443626c690a84bc7901195d19c446
İstediğiniz sha komutunu alabilirsiniz:
git log
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"
İ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
Muhtemelen git reset
sorununuzu çözer.
git reset --hard -#commit hash-