Uzaktan kumandayı belirli bir işleme sıfırlama


709

İşlemden sonra yapılan tüm değişiklikleri silmek istiyorum <commit-hash>. Ben de yaptım:

git reset --hard <commit-hash>

Şimdi aynısını uzaktan kumandamla yapmak istiyorum. Bunu nasıl yapabilirim? Sonra bazı taahhütler yaptım (ve itiyorum) <commit-hash>ve hepsini atmak istiyorum. Sadece bir şey yolunda çok yanlış gitti ve ben zaten olduğundan daha kötü yapmak istemiyorum. (

Temelde benim geri sarmak istiyorum origin/masterTo<commit-hash>


3
origin/masterDiğer kullanıcılar tarafından çekilmediğinden ve aktarılmadığından emin misiniz ? Genel (yerel olmayan) bir deponun geçmişini değiştirmek her zaman kaçınmak istediğiniz bir şeydir.
vindia

Yanıtlar:


1252

Şubenizin masterhem burada hem de uzaktan çağrıldığını ve uzaktan kumandanızın çağrıldığını varsayarak originşunları yapabilirsiniz:

 git reset --hard <commit-hash>
 git push -f origin master

Ancak, başka biri uzak deponuzla çalışıyorsa ve değişikliklerinizi yaptıysa bunu yapmaktan kaçınmalısınız. Bu durumda, istemediğiniz taahhütleri geri almak daha sonra normal şekilde itmek daha iyi olacaktır .

Güncelleme: aşağıda, diğer kişilerin ittiğiniz değişiklikleri çektiğini açıkladınız, bu nedenle tüm bu değişiklikleri geri alan yeni bir taahhüt oluşturmak daha iyidir . Jakub Narębski'nin bu cevabında bunu yapmak için seçeneklerinizin güzel bir açıklaması var . Hangisinin en uygun olduğu, geri almak istediğiniz taahhütlere ve hangi yöntemin sizin için en anlamlı olduğuna bağlıdır.

git reset --hardSorunuzdan, masterşubenizi sıfırlamak için zaten kullandığınız açık olduğu git reset --hard ORIG_HEADiçin, şubenizi daha önce bulunduğu yere geri taşımak için kullanmaya başlamanız gerekebilir . (Her zaman olduğu gibi birlikte git reset --hard, emin olun git statusdoğru dal üzerinde olduğuna göre, güvenilir olduğundan size ediyoruz farkında git reflogbir araç görünüşte kaybetti kaydedilmesini kurtarmak için.) Ayrıca kontrol etmelisiniz ORIG_HEADile sağ işlemeye puan git show ORIG_HEAD.

Sorun giderme:

" ! [Uzaktan reddedildi] a60f7d85 -> master (ön alma kancası reddedildi) " gibi bir mesaj alırsanız

belirli bir dal için dal geçmişinin yeniden yazılmasına izin vermeniz gerekir. Örneğin BitBucket'te "Şube geçmişinin yeniden yazılmasına izin verilmiyor" yazıyordu. Allow rewriting branch historyKontrol etmeniz gereken bir onay kutusu var.


21
Tehlike tehlike: Bu sıfırlama gelen (varsayar izleme ) şube henüz kontrol edilir ve saklamak istediğini Herhangi bir istenmeyen değişiklikler vardır. Yerine git update-refkullanınreset --hard ; aynı şeyi çalışan bir ağaç / dal teslim olmadan yapmanıza izin verecektir
sehe

3
Anlıyorum. Başkaları tarafından itildi ve değiştirildi. Kullanmalıyım Yani revert ancak sağlar ben yapmalıyım böylece son 4 kaydedilmesini geri döndürmek istiyor demek git revert comit1; git push; git revert comit2; git push; ...veya sadece git revert commit4; git push?
nacho4d

1
@ nacho4d: her geri dönüşten sonra zorlamanız gerekmez - Jakub Narębski'nin bu cevabında ne yapacağınıza dair güzel bir açıklama var . Geriye dönük her bir taahhüdü geri almanız gerekir - sadece yapmak git revert commit4yalnızca getirilen değişiklikleri geri alan yeni bir taahhüt oluşturur commit4. Bağlantı verdiğim cevabın belirttiği gibi, bunları tek bir taahhütte toplayabilirsiniz.
Mark Longair

1
@ Mark zaten çalıştım git reset --hardama yerel benim sildim ve kökeni tekrar çekti böylece yapabilirim git revert ...Şimdi şüphe şudur: Ben her taahhüt geri ve itmek (tek tek) veya sadece sonra ilk taahhüt geri dönmek zorunda sadece doğru taahhüt?
nacho4d

1
@sehe: kullanması zor çünkü tam ref adını kullanmanız gerekiyor ve bu nedenle insanların .gitdizinlerini oluşturmak istemedikleri ref'lerle doldurmaları kolaydır . Yine de güvenlik kontrolü olmadığını söylemek yanlıştı. Sınıflandırmayı git man sayfasında "sıhhi tesisat" ve "porselen" komutları olarak bulabilirsiniz .
Mark Longair

123

Yerel değişiklikleri kaybetmeyi düşünmezseniz diğer yanıtları kullanın. Geri dönmek için yanlış taahhüt karmasını seçerseniz, bu yöntem yine de uzaktan kumandayı enkaz haline getirebilir.

Uzaktan eşleşmeyi yerel deponuzda herhangi bir yerde bir taahhüt haline getirmek istiyorsanız:

  1. Do not herhangi sıfırlanmasına yapmak.
  2. git logUzaktan kumandanın bulunmasını istediğiniz taahhüdü bulmak için kullanın . git log -pdeğişiklikleri görmek veya git log --graph --all --oneline --decoratekompakt bir ağaç görmek.
  3. İşlemin karmasını veya etiketini veya ipucuysa dalının adını kopyalayın.
  4. Şunun gibi bir komut çalıştırın:

    git push --force <remote> <commit-ish>:<the remote branch>
    

    Örneğin

    git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
    

    veya

    git push --force staging v2.4.0b2:releases
    

Ben git goböyle eklenebilir adım 2, tarih görüntüleme için uygun takma ad ( ) kullanın :

    git config --global alias.go 'log --graph --all --decorate --oneline'`

3
Grafik çok güzel bir ipucuydu, sadece son 5 taahhüdü almak için -5 ekledim, başka büyük bir ağaçtı. Ayrıca sıfırlama kaçınmak sadece aradığım şey. Büyük
AlexanderD

@AlexanderD Kabuğunuz yerine Git'e takma ad da ekleyebilirsiniz, böylece her yerde çalışır. Git, bağımsız değişkenler ekleyebilmeniz için bu takma adları anlar ve tam komuttan sekme tamamlar. git config --global alias.graph 'log --graph --all --decorate --oneline'daha az dağınık ve yine de sınırlayabilirsiniz, örneğin:git graph -5
Walf

Bu harika. Ben her zaman yerel karışıklık var. Yanlışlıkla yaşamak için sahnelemeyi ittikten sonra tam da ihtiyacım olan şey buydu :( Teşekkürler!
Jake

1
Windows'da, qgit günlüğünden çıkmak için girin . 2 dakika asla geri dönmeyeceğim.
dst3p

1
@ dst3p Her platformda bu dostum. Çağrı programı genellikle lessve programdan qçıkmanın normal yoludur. Git Bash * nix terminali gibidir.
Walf

63

Sizin gibi sorunu bu komutlarla çözdüm:

git reset --hard <commit-hash> 
git push -f <remote> <local branch>:<remote branch> 

13

GitLab'da, bunu yapmadan önce dalınızı korumasız olarak ayarlamanız gerekebilir . Bunu [repo]> Ayarlar> Depo> Korumalı Dallar bölümünde yapabilirsiniz. Sonra Mark'ın cevabındaki yöntem işe yarar.

git reset --hard <commit-hash>
git push -f origin master

10

Dosyanın önceki bir sürümünü istiyorsanız, git checkout kullanmanızı tavsiye ederim.

git checkout <commit-hash>

Bunu yapmak sizi zamanında geri gönderir, projenizin mevcut durumunu etkilemez, mainline git checkout mainline'a gelebilirsiniz.

ancak bağımsız değişkende bir dosya eklediğinizde, o dosya önceki proje zamanınıza geri getirilir, yani geçerli projeniz değiştirilir ve işlenmesi gerekir.

git checkout <commit-hash> -- file_name
git add .
git commit -m 'file brought from previous time'
git push

Bunun avantajı, geçmişi silmemesi ve belirli bir kod değişikliğini geri almamasıdır (git revert)

Buradan daha fazla bilgi edinin https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout


Bu mükemmel bir cevaptır: çalışır, dönemlidir ve çok güvenlidir; Eğer onu karıştırırsan, geri dönmek kolaydır.
bob

8

Önceki cevaplara iki sentim: eğer

git push --force <remote> <the-hash>:<the remote branch>

yine de çalışmıyorsa, <your-remote-repo>.git/configdosyanın alma bölümünü düzenlemek isteyebilirsiniz :

[receive]
  #denyNonFastforwards = true
  denyNonFastforwards = false

Uzaktan kumandanın hızlı cevapsız itmelere izin verecek şekilde nasıl yapılandırılacağını bilmek yararlıdır, çünkü çoğu cevap github veya bitbucket gibi uzak bir hizmeti varsayar.
strongbutgood

2

Şubeniz geliştirme veya üretim değilse, bunu yapmanın en kolay yolu yerel olarak belirli bir taahhüde sıfırlamak ve oradan yeni bir şube oluşturmaktır. Kullanabilirsiniz:

git ödeme 000000

(000000 gitmek istediğiniz taahhüt kimliği) sorunlu dalınızda ve daha sonra yeni bir dal oluşturun:

git remote add [ad_of_your_remote]

Sonra yeni bir PR oluşturabilirsiniz ve her şey yoluna girecek!


1

Bir şey yap, taahhüdün SHA numarasını al. 87c9808 gibi,

  1. Kendinizi hareket ettirin, bu belirtilen komuta kafanız (git reset --hard 89cef43 // numaranızı burada belirtin)
  2. Daha sonra rastgele bir dosyada bazı değişiklikler yapın, böylece git bunu yerel olarak ve sonra uzaktan işlemenizi isteyecektir. Böylece, şimdi yapmanız gereken şey. Değişikliği uyguladıktan sonra git kesin -a -m "deneme taahhüdü"
  3. Şimdi git push origin master tarafından aşağıdaki taahhüdü (bu yerel olarak yapılmışsa) itin
  4. Git'in sizden ne isteyeceği şimdi

hata: ' https://github.com/YOURREPOSITORY/AndroidExperiments.git ' ipucuna bazı referanslar gönderilemedi : Geçerli şubenizin ipucu ipucu arkasında olduğu için güncellemeler reddedildi: uzaktaki karşılığı. Tekrar basmadan önce uzaktan değişiklikleri (örn. İpucu: 'git pull ...') entegre edin. **

  1. Böylece şimdi yapabileceğiniz şey

git push --force origin master

  1. Ve böylece, umarım çalışır :)

1

Sourcetree: Uzaktan kumandayı belirli bir işleme sıfırlama

  1. Uzaktan kumandanıza (orijin / özellik / 1337_MyAwesomeFeature) kötü bir taahhütte bulunduysanız, aşağıdaki resimdeki gibi

Uzaktan Kumandalara Git

  1. Uzaktan kumandalar> başlangıç ​​noktası> özellik> 1337_MyAwesomeFeature'a gidin
  2. Sağ tıklayın ve "Kökeni / özelliği sil / 1337_MyAwesomeFeature" ı seçin (Veya bir yedekleme istiyorsanız adını değiştirin ve 4. adımı atlayın.)
  3. "Silmeye zorla" ve "Tamam" ı tıklayın.

resim açıklamasını buraya girin resim açıklamasını buraya girin

  1. Eski taahhüdünüzü seçin ve "Mevcut dalı bu taahhüdüne sıfırla" yı seçin
  2. Hangi modu kullanmak istediğinizi seçin (Son değişikliklerinizi istemiyorsanız zor) ve "Tamam" ı seçin.

resim açıklamasını buraya girin resim açıklamasını buraya girin

  1. Bu taahhüdü yeni bir kökene / özelliğe itin / 1337_MyAwesomeFeature resim açıklamasını buraya girin

  2. Yerel özellik dalınız ve uzak özellik dalınız artık önceki (seçtiğiniz) işlemde resim açıklamasını buraya girin

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.