Uzaktan kumandayı belirli bir commit'e sıfırlama

Commit <commit-hash> işleminden sonra yapılan tüm değişiklikleri atmak istiyorum. Ben de öyle yaptım:

git reset --hard <commit-hash>

Şimdi aynısını kumandam için yapmak istiyorum. Bunu nasıl yapabilirim? `den sonra bazı commitler (ve pushlar) yaptım ve sadece hepsini atmak istiyorum. Yolda korkunç bir şekilde yanlış giden bir şey var ve bunu olduğundan daha kötü hale getirmek istemiyorum ;(

Temel olarak origin/master öğemi <commit-hash> öğesine geri sarmak istiyorum

Çözüm

Şubenizin hem burada hem de uzaktan master olarak adlandırıldığını ve uzaktan origin olarak adlandırıldığını varsayarak yapabilirsiniz:

 git reset --hard 
 git push -f origin master

Ancak, başka biri uzak deponuzla çalışıyorsa ve değişikliklerinizi çekmişse bunu yapmaktan kaçınmalısınız. Bu durumda, istemediğiniz değişiklikleri revert yapmanız ve ardından normal şekilde push etmeniz daha iyi olacaktır.

Güncelleme: aşağıda başkalarının sizin yaptığınız değişiklikleri çektiğini açıkladınız, bu nedenle tüm bu değişiklikleri geri alan yeni bir commit oluşturmak daha iyidir. Bunu yapmak için seçeneklerinizin güzel bir açıklaması var Jakub Narębski'nin bu cevabı. Hangisinin en uygun olduğu, kaç değişikliği geri almak istediğinize ve hangi yöntemin sizin için en mantıklı olduğuna bağlıdır.

Sorunuzdan master dalınızı sıfırlamak için zaten git reset --hard kullandığınız anlaşıldığından, dalınızı daha önce olduğu yere geri taşımak için git reset --hard ORIG_HEAD kullanarak başlamanız gerekebilir. (Her zaman git reset --hard ile olduğu gibi, git statusun temiz olduğundan, doğru dalda olduğunuzdan ve görünüşte kaybolan taahhütleri kurtarmak için bir araç olarak git reflogdan haberdar olduğunuzdan emin olun). Ayrıca git show ORIG_HEAD ile ORIG_HEADin doğru commit`e işaret ettiğini kontrol etmelisiniz.

Sorun Giderme:

Eğer " gibi bir mesaj alırsanız! [remote rejected] a60f7d85 -> master (pre-receive hook declined)"

o zaman belirli bir dal için dal geçmişinin yeniden yazılmasına izin vermeniz gerekir. Örneğin BitBucket'ta "Dal geçmişinin yeniden yazılmasına izin verilmez" yazıyordu. İşaretlemeniz gereken Şube geçmişinin yeniden yazılmasına izin ver adlı bir onay kutusu vardır.

Yorumlar (12)

Yerel değişiklikleri kaybetmek istemiyorsanız diğer cevapları kullanın. Bu yöntem, geri dönmek için yanlış commit hash'ini seçerseniz remote'ınızı mahvedebilir.

Eğer sadece uzaktaki işlemin yerel şubenizde bulunan bir işlemle eşleşmesini istiyorsanız:

  1. Herhangi bir sıfırlama yapmayın.

  2. Remote'ta olmasını istediğiniz commit'in hash'ini bulmak için git log kullanın. Değişiklikleri görmek için git log -p veya kompakt bir ağaç görmek için git log --graph --all --oneline --decorate kullanın. (Bu sonuncusunu kabuğunuzda bir takma ad olarak kullanmak çok kullanışlıdır).

  3. Karmayı kopyalayın.

  4. Aşağıdaki gibi bir komut çalıştırın:

     git push --force  :

    Örneğin.

     git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
Yorumlar (11)

Sizinki gibi bir sorunu bu komutlarla çözdüm:

git reset --hard  
git push -f  : 
Yorumlar (0)