78 Soru: Git'teki en son yerel taahhütleri nasıl geri alabilirim?
Yanlışlıkla yanlışlıkla dosyaları Git 'e verdim, ancak taahhüdüm için itmedim sunucu henüz.
Bu taahhütleri yerel depodan nasıl geri alabilirim?
Bir taahhüdü geri al ve yinele
$ git commit -m "Something terribly misguided" # (1) $ git reset HEAD~ # (2) << edit files as necessary >> # (3) $ git add ... # (4) $ git commit -c ORIG_HEAD # (5)
- Bu geri almak istediğiniz şeydir.
- Bu, çalışma ağacınızı (dosyalarınızın diskteki durumunu) değiştirmez, ancak işleme almayı geri alır ve işlediğiniz değişiklikleri işaretlenmemiş bırakır (böylece,
git status'da "İşleme yönelik olmayan değişiklikler" olarak görünürler. taahhüt etmeden önce bunları tekrar eklemeniz gerekir). yalnızca önceki işleminize daha fazla değişiklik eklemek veya eklemek istiyorsanız ya da 1 işlem iletisini değiştirin, bunun yerine
git reset --soft HEAD~’u kullanabilirsiniz.
git reset HEAD~(
HEAD~,
HEAD~1ile aynıdır) ancak mevcut değişikliklerinizi aşamalı olarak bırakır.
- Çalışan ağaç dosyalarında düzeltmeler yapın.
-
git addyeni taahhüdünüze eklemek istediğiniz herhangi bir şey.
- Eski taahhüt mesajını tekrar kullanarak değişiklikleri kabul edin.
reset, eski kafayı
.git/ORIG_HEAD'a kopyaladı;
commitile
-c ORIG_HEAD, başlangıçta eski işlemden gelen günlük iletisini içeren ve düzenlemenizi sağlayan bir düzenleyici açar. Mesajı düzenlemeniz gerekmiyorsa,
-Cseçeneğini kullanabilirsiniz.
Ancak dizinde herhangi bir değişiklik yaptıysanız,
commit --amend'u kullanmanızın önceki işleminize ekleyeceğini unutmayın.
Kod zaten sunucunuza gönderildiyse ve geçmişin (yeniden oluşturmanın) üzerine yazma izniniz varsa, o zaman:
git push origin master --force
Bu cevaba da bakabilirsiniz:
Yukarıdaki cevap size, geri dönmek istediğiniz SHA-1'in ne olduğunu bulmak için kullanılan
git reflog'u gösterecektir. Yukarıda açıklandığı gibi komut dizisini kullanmak istemediğiniz noktayı bulduğunuzda.
1 Ancak, taahhüt mesajınızda bir hata yaptıysanız daha önceki bir işlem için sıfırlamanıza gerek olmadığını unutmayın. En kolay seçenek
git reset (o zamandan beri yaptığınız değişiklikleri denetlememek) ve ardından varsayılan ayarınızı açacak olan
git commit --amend mesaj editörü önlemeSon taahhüt mesajı ile doldurulur.
Nasıl çalıştığını bilmiyorsanız, taahhüdün geri alınması biraz korkutucu olabilir. Ama eğer anlarsan, aslında inanılmaz derecede kolay.
Buna sahip olduğunuzu söyleyin, burada C HEAD'iniz ve (F) dosyalarınızın durumudur.
(F) A-B-C ↑ master
Nuke'ye C taahhüt edip bir daha asla görmemeyi istiyorsun. Bunu siz yapın:
git reset --hard HEAD~1
Sonuç:
(F) A-B ↑ master
Şimdi B, HEAD'dir.
--hard kullandığınız için, dosyalarınız B taahhüdündeki durumuna geri döndürülür.
Ah, ancak C'nin felaket olmadığını, ancak biraz kapalı olduğunu varsayalım. Daha iyi bir taahhütte bulunmadan önce düzenlemeyi geri almak, ancak değişikliklerinizi korumak için biraz düzenleme yapın. Buradan başlayarak, başınız olarak C ile:
(F) A-B-C ↑ master
Bunu
--hard’u bırakarak yapabilirsiniz:
git reset HEAD~1
Bu durumda sonuç şöyledir:
(F) A-B-C ↑ master
Her iki durumda da, HEAD en son taahhüdün yalnızca bir göstergesidir.
git reset HEAD~1 yaptığınızda, Git'e HEAD imlecini bir işlem geri getirmesini söyleyin. Ancak (
--hard kullanmazsanız) dosyalarınızı oldukları gibi bırakırsınız. Şimdi
git status, C'ye dahil ettiğiniz değişiklikleri gösterir. Hiçbir şey kaybetmediniz!
En hafif dokunuş için taahhütlerinizi geri alabilirsiniz, ancak dosyalarınızı ve dizin :
git reset --soft HEAD~1
Bu sadece dosyalarınızı yalnız bırakmaz, hatta indeksinizi de bırakır.
git status yaptığınızda, aynı dosyaların daha önce olduğu gibi dizinde olduğunu göreceksiniz. Aslında, bu komuttan hemen sonra
git commit yapabilirdiniz ve az önce yaptığınız taahhütleri tekrar edersiniz.
Bir şey daha: İlk örnekte olduğu gibi bir taahhüdü yok ettiğinizi varsayalım , sonra da gerekli gördükten sonra keşfedin ? Zor şans, değil mi?
Hayır, onu geri almanın bir yolu var hala .
git reflog yazdığınızda, (kısmi) işlediğiniz bir liste göreceksiniz shas ( 'da, etrafta dolaştığınız kareler). Yok ettiğiniz taahhüdü bulun ve şunu yapın:
git checkout -b someNewBranchName shaYouDestroyed
Artık bu taahhüdü yeniden başlattınız. Taahhütler Git'te yaklaşık 90 gün boyunca tahrip edilmiyor, bu yüzden genellikle geri dönüp kurtulmak istemediğiniz birini kurtarabilirsiniz.
Bu beni bulmam biraz zaman aldı, bu yüzden belki bu birine yardımcı olabilir ...
Son taahhüdünüzü "geri almanın" iki yolu vardır; bu işlemden önce herkese açık olup olmadığına (uzak havuzunuza itti) bağlı olarak:
Yerel bir taahhüt nasıl geri alınır
Diyelim ki yerel olarak taahhütte bulundum, ancak şimdi bu taahhüdü kaldırmak istiyorum.
git log commit 101: bad commit # latest commit, this would be called 'HEAD' commit 100: good commit # second to last commit, this is the one we want
Her şeyi en son işlemden önceki haline geri döndürmek için,
reset’dan önceki işlem için
HEAD’a ihtiyacımız var:
git reset --soft HEAD^ # use --soft if you want to keep your changes git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made
Şimdi
git log, son taahhüdümüzün kaldırıldığını gösterecek.
Genel bir taahhüt nasıl geri alınır
Taahhütlerinizi daha önce kamuya açıkladıysanız, önceki taahhüdünüzde (mevcut HEAD) yaptığınız değişiklikleri "geri alan" yeni bir taahhüt oluşturmak isteyeceksiniz.
git revert HEAD
Değişiklikleriniz şimdi geri alınacak ve taahhütte bulunmaya hazır olacak:
git commit -m 'restoring the file I removed by accident' git log commit 102: restoring the file I removed by accident commit 101: removing a file we don't need commit 100: adding a file that we need
Daha fazla bilgi için Git Basics - Şeyleri Geri Alma
İşleri istediğiniz şekilde almak için dosya ekleyin /kaldırın:
git rm classdir git add sourcedir
O zaman taahhüdünde değişiklik yapın:
git commit --amend
Önceki, hatalı olan taahhüt, yeni endeks durumunu yansıtacak şekilde düzenlenecek - başka bir deyişle, ilk başta hatayı hiç yapmamış gibi olacaksınız.
Bunu yalnızca henüz itmediyseniz yapmanız gerektiğini unutmayın. Eğer zorladıysanız, normal olarak bir düzeltme yapmanız gerekir.
git rm yourfiles/*.class git commit -a -m "deleted all class files in folder 'yourfiles'"
veya
git reset --hard HEAD~1
Uyarı: Yukarıdaki komut, işlemek istediğiniz
.java dosyadaki (ve diğer dosyalardaki) değişiklikleri kalıcı olarak kaldıracaktır.
hard reset -
HEAD-1, çalışma kopyanızı yanlış taahhüdünüzden önce taahhüdün durumuna getirecektir.
Son işlemi değiştirmek için
Dizindeki dosyaları değiştirin:
git rm --cached *.class git add *.java
Öyleyse, özel bir şube ise, taahhüdü değiştirin :
git commit --amend
Veya paylaşılan bir şubeyse, yeni bir taahhütte bulunun:
git commit -m 'Replace .class files with .java files'
( önceki bir taahhüdü değiştirmek için ) harika etkileşimli rebase'i kullanın )
ProTip ™: Bunu tekrar durdurmak için bir gitignore 'a
*.class ekleyin.
Bir taahhütü geri almak için
Son taahhüdü değiştirmeniz gerekirse, bir taahhüdü değiştirmek ideal bir çözümdür, ancak daha genel bir çözüm
reset'dur.
Git'i, ile yapılan herhangi bir işleme sıfırlayabilirsiniz:
git reset @~N
N’un
HEAD’dan önceki taahhüt sayısı ve
@~ önceki işlemine sıfırlanır.
Dolayısıyla, taahhüdü değiştirmek yerine, kullanabilirsiniz:
git reset @~ git add *.java git commit -m "Add .java files"
Bunun ne olduğunu daha iyi anlamak için
git help reset, özellikle
--soft
--mixed ve
--hard'daki bölümleri inceleyin.
Reflog
Eğer karışırsanız, bırakılan taahhütleri bulmak için her zaman reflog kullanabilirsiniz:
$ git reset @~ $ git reflog c4f708b HEAD@{0}: reset: moving to @~ 2c52489 HEAD@{1}: commit: added some .class files $ git reset 2c52489 ... and you're back where you started
git revert <commit-id> Kullanın
Taahhüt kimliğini almak için yalnızca
git log kullanın
Eğer yerel bir taahhüdün tamamını geri almayı planlıyorsanız, taahhüdünüzde yaptığınız her şeyi değiştirdiyseniz ve bu konuda endişelenmiyorsanız, sadece aşağıdaki komutu uygulayın.
git reset --hard HEAD^1
(Bu komut tüm taahhüdünüzü görmezden gelecek ve değişiklikleriniz yerel çalışma ağacınızdan tamamen kaybolacak). Taahhüdünüzü geri almak istiyorsanız, ancak aşama alanındaki değişikliklerinizi (
git add'dan sonra da yapmadan önce) istiyorsanız, aşağıdaki komutu uygulayın.
git reset --soft HEAD^1
Artık taahhütlü dosyalarınız hazırlama alanına geliyor. Bazı yanlış içerikleri düzenlemeniz gerektiğinden, dosyaları büyütmek istiyorsanız, aşağıdaki komutu uygulayın
git reset HEAD
Şimdi, aşamalı alandan sıralanmamış alana gelmek için dosyalar işlendi. Artık dosyalar düzenlemeye hazır, bu nedenle neyi değiştirirseniz düzeltmek ve eklemek ve yeni /yeni bir işlem yapmak istersiniz.
Yüklü Git Ekstraları varsa, en son işlemi geri almak için
git undo çalıştırabilirsiniz.
git undo 3, son 3 taahhüdü geri alır.
Paylaşılan havuzumuzdaki en son 5 taahhüdü geri almak istedim. Geri almak istediğim revizyon kimliğine baktım. Sonra aşağıdakini yazdım.
prompt> git reset --hard 5a7404742c85 HEAD is now at 5a74047 Added one more page to catalogue prompt> git push origin master --force Total 0 (delta 0), reused 0 (delta 0) remote: bb/acl: neoneye is allowed. accepted payload. To email@example.com:thecompany/prometheus.git + 09a6480...5a74047 master -> master (forced update) prompt>
Bu iş için
git rebase -i'u kullanmayı tercih ediyorum, çünkü kurtulmak için gerekenleri seçebileceğim güzel bir liste çıkıyor. Buradaki diğer bazı cevaplar kadar doğrudan olmayabilir, ancak yalnızca doğru hissediyor .
Kaç tane listelemek istediğinizi seçin, sonra bu şekilde çağırın (son üçü listelemek için)
git rebase -i HEAD~3
Örnek liste
pick aa28ba7 Sanity check for RtmpSrv port pick c26c541 RtmpSrv version option pick 58d6909 Better URL decoding support
Ardından Git, kaldırdığınız tüm satırların taahhütlerini kaldırır.
Önceki yerel görevin nasıl düzeltileceği
git commit --amend gerçekleştirmek için git-gui (veya benzeri) kullanın. GUI'den, tek tek dosyaları işleme ekleyebilir veya kaldırabilirsiniz. İleti mesajını da değiştirebilirsiniz.
Önceki yerel taahhüdü nasıl geri alırsınız
Şubenizi önceki konumuna sıfırlayın (örneğin,
gitk veya
git rebase kullanarak). Ardından, değişikliklerinizi kaydedilmiş bir kopyadan tekrar uygulayın. Yerel deponuzdaki çöp toplama işleminden sonra, hiç olmamış istenmeyen bir taahhüt gibi olacak. Bunların hepsini tek bir komutta yapmak için
git reset HEAD~1'u kullanın.
Uyarı kelimesi :
git reset'un dikkatsiz kullanımı, çalışma kopyanızı karıştırıcı bir duruma getirmenin iyi bir yoludur. Git acemilerinin eğer yapabilirlerse bundan kaçınmasını öneririm.
Genel bir taahhüt nasıl geri alınır
Şubenize henüz başka değişiklikler yapmadıysanız, basitçe yapabilirsiniz ...
git revert --no-edit HEAD
Ardından güncellenmiş şubenizi paylaşılan havuza doğru itin.
Taahhüt tarihi, her iki taahhüdü de ayrı olarak gösterir .
Gelişmiş: Genel depodaki özel şubesinin düzeltilmesi
Bu tehlikeli olabilir - şubenin yerel bir kopyasının elinizde olduğundan emin olun.
Ayrıca not: Başka biri şube üzerinde çalışıyorsa bunu yapmak istemezsiniz.
git push --delete (branch_name) ## remove public version of branch
Şubenizi yerel olarak temizleyin, sonra yeniden düzenleyin ...
git push origin (branch_name)
Normal durumda, özel şubenizin işleme geçmişinin bozulmamış olması konusunda endişelenmenize gerek yoktur. Bir takip taahhüdünü zorlamanız yeterli (yukarıdaki 'Kamu taahhüdünü geri alma' başlığına bakın) ve daha sonra bir squash-birleştirme yapın geçmişi gizlemek için.
Önemsiz davrandıysanız ancak itmediyseniz
git reset --soft HEAD~1
HEAD ~ 1 , başkanlık öncesi taahhüt için bir kestirme yoludur. Alternatif olarak, sıfırlamak istiyorsanız, karma değerin SHA-1 bölümüne bakabilirsiniz. --soft seçeneği, taahhüdü silecek ancak git durumunun koyacağı şekilde, değiştirilen tüm dosyalarınızı "Taahhüt edilecek değişiklikler" olarak bırakacak.
Çalışma ağacındaki izlenen dosyalarda yapılan değişikliklerden kurtulmak istiyorsanız, işlem yapmadan önce " --hard " komutunu kullanın.
VEYA
Zaten itti ve birileri çektiğinizde, genellikle benim durumum, git reset kullanamazsınız. Ancak bir git 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.