Nasıl 1 taahhüt geri alabilirim?


127

İtmediğim 2 taahhüt var:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

İlkiyi (en eskisi) nasıl geri alabilirim, ikincisini nasıl tutabilirim?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Buradan:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

Sadece yapmam gerekir mi?

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Yani?


3
Bu soru konu dışı gibi görünüyor çünkü bir programlama aracıyla ilgili. Yığın Taşma'ya aittir.
Peter Mortensen

@PeterMortensen Anlaşıldı. Bu, SuperUser
Kolob Canyon için

Yanıtlar:


95

Gitmenin en güvenli ve muhtemelen en temiz yolu etkileşimli olarak yeniden inşa etmektir.

git rebase -i HEAD^^

Veya,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

Oradan, bir veya daha fazla komisyonu önceki taahhüdün içine koyan komisyonları squash edebilirsiniz. Tamamlama işlemini geçmişe göre tamamen silmek için satırı listeden silin.

Bir taahhüdünüzü geri alabilirsiniz, git revertancak tarihe, istenmeyen olabilecek daha fazla taahhüt mesajı ekleyecektir. -nGit'e hemen geri dönmemesini söylemek için parametreyi kullanın . Etkileşimli olarak rebase edebilir ve bir şeyi temiz tutmak için bunları önceki bir sisteme ezebilirsiniz.

Burada çalıştığınız iki kişi aynı dosyaları / dosyaları etkilerse, bir birleştirme çatışması görebilirsiniz.

Deponun sıfırlanması, git reset --hardgeri alınamayacağı için özenle yapılmalıdır.

Yeniden yazma tarihi özenle yapılmalıdır.


'Git rebase' sırasındaki bir işlemi nasıl silebilirim? Sadece 3 komut var: seç, düzenle, squash. Silme AFAIK yok.
n179911

8
listedeki satırı tamamen sil ve bu işlemi siler
jtimberman

Değişikliği geri almak istediğimde hiçbir iz bırakmamak istedim. Ayrıca geri dönüşünüzden hiçbir iz bırakmamak istiyorsanız, bunu yapmanın en iyi yolu budur.
Phillip Whelan,

"Gitmenin en güvenli ve muhtemelen en temiz yolu etkileşimli olarak yeniden inşa etmektir" Belki de vim kullanmıyorsanız. Şanslı oldum ve bu karışıklıktan kurtulduğumu anladım. Hala yükseliyor çünkü vim :-) öğrenmeliyim
isimmons 13:13

Kullanmayı rebasemümkün olduğunca az öneririm . Başkaları ile çalışırsanız, o zaman sadece yapın revert.
boldnik

52

Bu eğer http://nakkaya.com/2009/09/24/git-delete-last-commit/ adresinden ve benim için çalıştıysa

Git Son Yazmayı Sil

Geceleri geç saatlerde kahvem bittiğinde, sahip olmamam gereken şeyleri yapıyorum. Sonra, önümüzdeki 10 - 15 dakikayı, yaptığım son taahhüdü nasıl kaldıracağımı googling ile geçiriyorum. Böylece üçüncü zamandan sonra bir kayıt yapmak istedim, böylece daha sonra başvurabilirim.

Eğer önemsiz işlediniz, ancak itmediyseniz,

git reset --hard HEAD~1

HEAD ~ 1 kafadan önce taahhüt için bir steno. Alternatif olarak, sıfırlamak istediğiniz karma değerin SHA-1'ine bakabilirsiniz. --Hard kullanıldığında, çalışma ağacındaki izlenen dosyalarda yapılan değişikliklerin, baştaki onay kaybından bu yana yapıldığını unutmayın.

Yaptığınız işi silmek istemezseniz --soft, taahhüdü silecek seçeneği kullanabilirsiniz , ancak git durumu koyduğu gibi, değiştirilen tüm dosyalarınızı "Taahhüt edilecek değişiklikler" olarak bırakacaktır.

Şimdi zaten bastırdıysanız ve birisi benim durumumda olan birini çekti ise, git reset kullanamazsınız. Ancak bir git geri dönüş yapabilirsiniz.

git revert HEAD

Bu, yanlışlıkla yapılan taahhüdün getirdiği her şeyi tersine çeviren yeni bir taahhüt oluşturacaktır.


2
--Soft seçeneğiyle, öncelikle "git add" kullanmak yerine, bir dosyayı yeniden adlandırdığınız ve yanlışlıkla "git commit -a" için mükemmeldir.
Aaron Harun

8

Hayır! git-reset - hard seni tarihe geri döndürecek. Aradığın şey git devri, ki bu herhangi bir taahhüdü geri alacak.


4
Bu işe yarıyor ama aynı zamanda kütük işlemeyi de kirletiyor. Bu taahhütler itti / çekilmediyse, onları etkileşimli bir yeniden düzenleme ile temizlemek daha iyidir. Geçmişi değiştirebilme kabiliyeti, git'in diğer sürüm kontrol sistemlerine göre temel avantajlarından biridir.
knweiss

6

Bunu daha yeni yaptım:

git rebase -i HEAD^^

Berbat ettim de yaptım

git rebase --abort

Sonra tekrar yaptı. Sonra böyle itmek zorunda kaldı:

git push origin master -f

Ve geri aldığımdan daha yeni olan taahhütleri mahvetti. Harika çalıştı.


4

Hayır, taahhüdü git reset --hard baf8d5esiler 3368e1cve baf8d5esonradan HEAD olur .

3368e1cTaahhüdü sürdürmek ve taahhüdü silmek istiyorsanız bad8d5e, en kolay çözüm " git rebase -i HEAD~2" (yani son iki komisyonun etkileşimli yeniden yüklemesi) yapmaktır . Bu komut, taahhüt mesajı düzenleyicinizi başlatır ve son iki görevin her biri için bir satır görürsünüz. Orada sadece bad8d5etaahhüt satırını sil ve kaydet. git daha sonra tarihinizi yeniden yazacak ve ikinci taahhüt ortadan kalkacak.

Eğer gibi işlemek mesaj editörü kullanabilirsiniz diğer yararlı komutlar vardır squash, editvb İnteraktif Rebase ÇOK güçlü!

Birisi bu taahhütleri görmüşse bunu yapmayın (depodan ittirin veya çekin)!



1
git reset --hard {ref}

Eğer depoda sadece bir başka taahhüt varsa bir taahhüdü geri almanın tek yolu budur (örn. ilk taahhüt ve 1 tane daha). Yolların geri kalanı (geri döndürme, yeniden düzenleme), en azından gitmeden önce çalışmayı reddediyor 1.7.5.1.

Bir git resetile takip ederseniz, git gcgit aslında eski taahhüt verilerini repodan tamamen siler.


1
git checkout <treeish> -- /path/to/dir

Bu, / path / to / dir için verilen “ağaç gibi” dizini geri getirecektir.


0

Bunu, depo klasöründeki HEAD dosyalarından gelen son işlemlerin karma kodlarını elle düzenleyerek çalışmasını sağladım:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

Ondan önce, yerel olarak yaptığım UNMERGE operasyonlarını menşe edemedim. Merkez Depo'ya "bazı hakemlere itirazda bulunamadığını" söyledi.

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.