2013-12-16 28 views
7

Bu işlem basit olmakla birlikte git-scm numaralı telefondan bulamıyorum.Bir işlemi geri alma işlemi tamamlanır ve bir çok işlemi nasıl geri alırsınız

Genel bir projeye çok fazla küçük işlem yapıyorum ve tüm işlerim kötü. Yaptığım herşeyi kaldırmak istiyorum. Bazıları sadece yerel olarak işledim, bazıları 'köktük ustası' için zorladım.

ilk

Sadece tüm bu gitmesini yapmak istiyorum ... (bir hafta önce) En son e82401b olmak ... bdbad86 olduğunu taahhüt. Birini geri almaya çalıştım.

git status 
# On branch master 
# You are currently reverting commit e82401b. 
# (all conflicts fixed: run "git revert --continue") 
# (use "git revert --abort" to cancel the revert operation) 
  1. Bu dönülüyor bitirmek anlamaya olamaz.
  2. Her bir işlemi ayrı ayrı yapmak zorunda kalmak istemiyorum, hepsini yok etmek istiyorum.

cevap

4

Senin işin, ve sen kötünün repo tarihinin sürekli bir aralık oluşturduğunu. Aksi takdirde daha karmaşık olmak zorunda kalacaksın. senin geçmiş şöyle düşünelim:

e82401b - (master, HEAD) My most recent private commit 
... 
bc2da37 - My first private commit 
cf3a183 - (origin/master) My most recent bad public commit 
... 
292acf1 - My first bad public commit 
82edb2a - The last good public commit 

yapmak istediğimiz ilk şey, henüz kamuoyuna değil kaydedilmesini uçurmak olduğunu.

git reset --hard cf3a183 

Eşdeğer (ve daha okunabilir):

git reset--hard origin/master 
Şimdi

sizin bakış Aşağıdaki komutla (yaptığınız değişiklikler gitmiş olacak ve kurtarılamayan düşünülmelidir notu) bunu yapabilirsiniz depo origin/master görünümünde kabul eder. Artık kötü genel değişikliklerinizi geri almak ve bunları geri alma işlemi olarak yayınlamak istiyorsunuz. Bu talimatlar tek bir geri dönüş taahhüdü oluşturmak içindir.

Sen başlayan tüm kaydedilmesini dönmek için git revert --no-commit a..b kullanabilirsiniz taahhüt sonraa (! Unutmayın) ve bitişi ve dahil b taahhüt. İhtiyacın gerçekleşmesi için sahnelenecek. eşdeğer olarak

git revert --no-commit 82edb2a..HEAD 

Veya: Yani, burada, biz yapacağını

git revert --no-commit 292acf1^..HEAD 

HEAD şimdi origin/master aynı yere işaret hatırlamak.

revert komutunu çalıştırdıktan sonra, değişikliklerinizi aşamalı ve çalışmaya hazır hale getirdiniz, böylece basit bir git commit -m "Reverting those bad changes I accidentally pushed and made public" çalıştırın.

+0

Teşekkürler, ihtiyacım olan bilgiler bu. Bir soru daha: (master, HEAD) veya (origin/master) bilgisini nasıl alabilirim, böylece iki komut setini ne zaman yapacağımı söyleyebilirim? –

+1

@Pat En kolay yol, bu bilgiyi bir bakışta almak için alternatif bir 'git log 'formu oluşturmaktır. Kullanılacak format hakkında [burada] (https://www.kernel.org/pub/software/scm/git/docs/git-log.html) adresini okuyabilirsiniz. İyi bir başlangıç ​​tabanı şunun gibidir: 'git log --pretty ="% h% Cgreen% d% Creset% s% a% Cblue (% cr) " –

0

Repolarınızı herhangi bir önceki taahhütte ve bundan sonra kaldırılacak tüm değişikliklerde ayarlayabilirsiniz. O kökenli force github kullanım git push bunu itmek sonra

git

--hard reset

ziyareti ben araya girdi kimsenin arasına taahhüt burada tahmin ediyorum How do you roll back (reset) a Git repository to a particular commit?

+2

Gelecekte bu yanıt veren Google çalışanları için: ORIGINIZA YOLCULUĞUNUZDAN SONRA ASLA YAPMAYIN. (http://git-scm.com/docs/git-rebase/#_recovering_from_upstream_rebase) Herkesin hayatını çok zorlaştırabilir. – zmccord

İlgili konular