İ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?
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. Taahhüdün tamamını tamamen silmek için, çizgiyi listeden silin.
git revert
ile bir taahhüdü geri alabilirsiniz, ancak tarihe daha istenmeyen mesajlar ekleyecektir. Git'e hemen geri dönmemesini söylemek için -n
parametresini kullanın. Etkileşimli olarak rebase edebilir ve bir şeyi temiz tutmak için bunları önceki bir sisteme ezebilirsiniz.
Burada birlikte çalıştığınız iki sözleşme aynı dosyaları etkiliyorsa, bir birleştirme çatışması görebilirsiniz.
Depoyu git reset --hard
ile sıfırlamak, geri alınamayacağı için özenle yapılmalıdır.
Yeniden yazma tarihi özenle yapılmalıdır.
Bu eğer http://nakkaya.com/2009/09/24/git-delete-last-commit/ den ve eğer benim için işe yaradı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, taahhütü silecek olan
--soft
seçeneğini kullanabilirsiniz, ancak git durumu ile birlikte değiştirilen tüm dosyalarınızı "Taahhüt edilecek Değişiklikler" 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.
Hayır! git-reset - hard seni tarihe geri döndürecek. Aradığın şey git devri, ki bu herhangi bir taahhüdü geri alacak.
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ı.
Jtimberman'ın git reset --hard
'un geri alınamayacağı hakkındaki yorumuna bakıldığında, bu tam olarak doğru değildir. Buraya bakın: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1
Hayır, git reset --hard baf8d5e
3368e1c
taahhüdünü siler ve HEAD daha sonra baf8d5e
konumunda olur.
3368e1c
taahhüdünü korumak ve bad8d5e
taahhüdünü silmek istiyorsanız, en kolay çözüm "git rebase -i HEAD~2
" yapmaktır (yani, son iki işlemin etkileşimli olarak yeniden yapılandırılması). 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 bad8d5e
taahhüt satırını silin ve kaydedin. git daha sonra tarihinizi yeniden yazacak ve ikinci taahhüt ortadan kalkacak.
İleti mesajı düzenleyicide squash
, edit
, vb. Gibi kullanabileceğiniz başka faydalı komutlar da vardır. Etkileşimli rebase çok güçlü!
Birisi bu taahhütleri görmüşse bunu yapmayın (Deponuzu itin veya çekin)!
git reset --hard {ref}
eğer depoda sadece bir başka taahhüt varsa (örneğin, ilk taahhüt ve 1 tane daha) bir taahhüdü geri almanın tek yoludur. Yolların geri kalanı (geri döndürme, yeniden düzenleme), en azından gitmeden önce çalışmayı reddediyor 1.7.5.1.
git reset
git gc
ile takip ederseniz, git aslında eski işleme verilerini repodan tamamen siler.
git checkout <treeish> -- /path/to/dir
Bu,/path/to/dir için verilen “ağaç gibi” dizini geri getirecektir.
Bunu, son klasörün karma kodlarını elle depo klasöründeki HEAD dosyalarından düzenleyerek çalışmasını sağladım:
"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"
Ondan önce, yerel olarak yaptığım UNMERGE işlemlerini kökene itmeyi asla başaramadım. Merkez Depo'ya "bazı hakemlere itirazda bulunamadığını" söyledi.