Yanıtlar:
git reset --soft HEAD~1ne istersen yapmalısın. Bundan sonra, dizinde ilk değişiklikler (ile görünür git diff --cached) olur ve en yeni değişiklikleriniz sahnelenmez. git statussonra şöyle görünecek:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: foo.java
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: foo.java
#
Daha sonra git add foo.javaher iki değişikliği aynı anda yapabilir ve uygulayabilirsiniz.
git commit --amend; ancak çok daha karmaşık bir iş akışıyla. Bu, OP'nin iyi bir yön vermesine rağmen sorulan soruyu cevaplamaz ( git reset).
git reset --soft HEAD~
kullanın:
git reset HEAD^
Bu, varsayılan olarak "karışık" bir sıfırlama yapar; foo.java'yı en son taahhüdü kaldırarak unstaged'e koyun.
git reset --softişe yaramadı, ama işe git reset HEAD^yaramadı
Bana göre, aşağıdakileri yapmak için daha okunabilir (böylece tercih edilir) bir yol:
git reset HEAD~1
Bunun yerine, 1istifade etmek istediğiniz herhangi bir sayıda taahhüt olabilir.
git reset --softsadece bunun için: bu gibidir git reset --hard, ancak dosyalara dokunmaz.
git resetmsgstr " git reset --harddosya gibi ama dosyalara dokunmuyor." Hayır git reset --soft. git reset --softdeğişiklikleri aşamalandıracaktır, bu nedenle taahhütte bulunmak istediğinizde bunları sahnelemeye eklemek zorunda kalmayacaksınız, ancak istemezseniz git resetonlara (evet, ikinci kez ve olmadan --soft) sahip olacaksınız. Yani bu cevap kısa ama yanlış.
"Sıfırla", değişiklikleri yerel olarak geri almanın yoludur. İşlem yaparken önce " git add " ile eklenecek değişiklikleri seçersiniz - buna "evreleme" denir. Ve değişiklikler bir kez hazırlandıktan sonra, onları " git kesin ".
Evrelemeden veya işlemden çıkmak için KAFA "sıfırlar". Bir dalda, HEAD en son işleme işaret eden bir git değişkenidir. Eğer sahnelemediyseniz, ancak taahhütte bulunmadıysanız, " git reset HEAD ." Bu, sahnedeki değişiklikleri alarak mevcut HEAD'e destek olur. " Git reset --mixed HEAD ~ 0 " için kısayol .
Daha önce taahhütte bulunduysanız, HEAD zaten ilerlemiştir, bu nedenle önceki taahhüdünüzü yedeklemeniz gerekir. Burada " HEAD ~ 1'i sıfırlayın " veya " HEAD ^ 1'i sıfırlayın " veya " HEAD ~ ' yı sıfırlayın " veya " HEAD ^ ' yi sıfırlayın - hepsi referans HEAD eksi bir.
Hangisi daha iyi, ~ veya ^? ~ Tilde'yı tek bir akış olarak düşünün - her bir taahhüdün tek bir ebeveyni varsa ve sıralı olarak bir dizi değişiklik olduğunda, tilde'yi kullanarak HEAD ~ 1, HEAD ~ 2, HEAD olarak akışı yedekleyebilirsiniz. ~ 3, ebeveyn, büyükbaba veya büyükanne, büyükanne-büyükbaba vb. İçin (teknik olarak önceki nesillerdeki ilk ebeveyni buluyor ).
Bir birleşme olduğunda, taahhütlerin birden fazla ebeveyni vardır. İşte ^ caret devreye girdiğinde - hatırlayabilirsiniz çünkü bir araya gelen dalları gösterir. Caret kullanıldığında, HEAD ^ 1 ilk ebeveyn olur ve HEAD ^ 2, örneğin tek bir taahhüdün ikinci ebeveynidir - anne ve baba.
Dolayısıyla, tek ebeveynlik bir taahhütte sadece bir sıçrama geri gidiyorsanız, HEAD ~ ve HEAD ^ eşdeğerdir - bunlardan birini kullanabilirsiniz.
Ayrıca, sıfırlama --soft , - karışık veya --hard olabilir . Yazılımdan sıfırlama komutu geri alır - HEAD'i sıfırlar, ancak dosyaları önceki işlemden teslim almaz, bu nedenle çalışma dizinindeki tüm değişiklikler korunur. Ve --soft reset sahneyi bile temizlemez ( dizin olarak da bilinir ), bu nedenle sahnelenen tüm dosyalar sahnede olmaya devam eder.
Bir - karışık sıfırlama (varsayılan) da önceki işlemdeki dosyaları teslim almaz, bu nedenle tüm değişiklikler korunur, ancak sahne alanı temizlenir. Bu yüzden basit bir " git reset HEAD " sahne alanını temizleyecektir.
Bir --hard reset, HEAD'i sıfırlar ve sahneyi temizler, ancak önceki işlemdeki tüm dosyaları da kontrol eder ve böylece değişikliklerin üzerine yazar.
Taahhüdü uzak bir depoya ittiyseniz, sıfırlama çok iyi çalışmaz. Yerel olarak sıfırlayabilirsiniz, ancak uzaktan kumandayı itmeye çalıştığınızda git, yerel HEAD'inizin uzak daldaki HEAD'in arkasında olduğunu görecek ve itmeyi reddedecektir. Zorlamayı zorlayabilirsiniz, ama git gerçekten bunu yapmaktan hoşlanmaz.
Alternatif olarak, değişikliklerinizi saklamak , önceki taahhüdü kontrol etmek, değişiklikleri kaldırmak, düzenlemek, yeni bir taahhüt oluşturmak ve sonra da itmek istiyorsanız değişikliklerinizi saklayabilirsiniz.
Diyelim ki, taahhüt edilene kadar değişmeden değişiklik yapmak istiyorsunuz,
Taahhüt karmaları aşağıdaki gibidir:
Ardından aşağıdaki komutu çalıştırın:
git reset hn
Şimdi HEAD hn + 1 olacak. H1 'den hn' ye değişimler değişmeden kalır.