Yerel bir taahhütte bulunduktan sonra dosyalarımı nasıl değiştirebilirim?


268

Aşağıdaki komutu yürüttüm

git add <foo.java>
git commit -m "add the foo.java file"

Yerel taahhüdümü şimdi nasıl silebilirim ve foo.java'yı değiştiremezim?

Ben git reset --hardyazarsam, değiştirilmiş foo.javaorijinalimi eski haline döndürdüğünü fark ettim .

Yanıtlar:


452

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.


"Taahhüt edilecek değişikliklerin" ilk değişiklikleri, "taahhüt için hazırlanmayan değişikliklerin" ikinci değişikliklerini yanıtladım.
Antti

4
Bu cevapta tanımlanan şey aslında ne 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).
7heo.tk

2
Çalıştırmak için '^' yerine '~' ile değiştirmek zorunda kaldım, bu yüzden şöyle görünüyor:git reset --soft HEAD~
Shahar

3
Git reset --soft HEAD ~ 1 sonra git reset HEAD
Joko Wandiro

istediğime mükemmel cevap!
DeepInJava

78

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.


2
Bana "karışık" sıfırlama, "yumuşak" sıfırlama ve "sert" sıfırlama ne olduğunu açıklar mısınız?
Kit Ho

1
@Kit Ho - git reset el kitabı bunların mükemmel açıklamalarına sahiptir.
manojlds

4
@Kit, @manojlds: stackoverflow.com/questions/2530060/… (utanmaz fiş)
Cascabel

5
Aslında tek doğru cevap bu. Diğer iki cevaplar olacaktır sahne bir taahhüt yaptıktan sonra tekrar dosyaları.
7heo.tk

git reset --softişe yaramadı, ama işe git reset HEAD^yaramadı
wordsforthewise

43

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.


39

git reset --softsadece bunun için: bu gibidir git reset --hard, ancak dosyalara dokunmaz.


4
Bu duyduğum en kolay anlaşılabilir açıklama (sadece 11 kelimede)! Teşekkürler!
phreakhead

3
Bu cevap yanlış. 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ış.
7heo.tk

12

Son işleminizdeki tüm dosyaları kaldırmak için -

git reset HEAD~


8

"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.


Operasyonun ayrıntılı açıklaması için +1. IMO bu kabul edilen cevap olmalı!
ISAE

2

Diyelim ki, taahhüt edilene kadar değişmeden değişiklik yapmak istiyorsunuz,

Taahhüt karmaları aşağıdaki gibidir:

  • h1
  • h2 ...
  • hn
  • HN + 1

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.

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.