Yerel git kesinleştirme nasıl iptal edilir


744

Benim sorunum, örneğin bir dosyayı değiştirdim: README, ' test hattım için bu ' yeni bir satır ekledi ve dosyayı kaydetti, sonra aşağıdaki komutları verdim

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

Kodu github'a aktarmadım, Şimdi bu taahhüdü iptal etmek istiyorum.

Bunun için kullandım

   git reset --hard HEAD~1

Ancak yeni eklenen satırı ' test satırım için bu ' README dosyasından kaybettim . Bu olmamalı. İçeriğin orada olması lazım. İçeriği korumanın ve yerel taahhüdümü iptal etmenin bir yolu var mı?


3
Kesinlikle istemediğiniz anlaşılıyor git revert, bu da tersine çevrilmiş taahhüdün tersi farkla yeni bir taahhüt yaratıyor. Sıfırlama işlemi mevcut dalınızı farklı bir işleme yönlendirir, bu durumda, "unutmak" istediğiniz işlemden önceki şubeyi işaret eder.
Cascabel

1
Not: git-commitİletiyi boş bırakırsanız iptal edebileceğinizden bahsetmeye değer olabilir, bu yüzden gerçekten yararlı olabilecek taahhüdü bitirmediyseniz .
GKFX

Yanıtlar:


1421

Bayrak git resetolmadan kullanın --hard:

git reset HEAD~1

Not: Kullanabileceğiniz Unix tabanlı sistemlerde HEAD^eşittir HEAD~1. Windows üzerinde HEAD^çalışmaz çünkü ^bir satır devam sinyalleri. Komut isteminiz size soracaktır More?.


13
Bu arada, bu --mixed kılavuzda denir .
Josh Lee

10
Git'in daha yeni sürümleri de @^kısayol olarak kullanılabilir HEAD^.
Koraktor

Bunun ne yaptığını bilmiyorum, ancak değişiklik listemde bir sürü dosya belirdi, dokunmadığım dosyalar
FRR

@feresr Son dosyada veya çalışma ağacında bu dosyalara gerçekten dokunmadıysanız, bunun nedeni çalışma ağacınızdaki diğer tutarsızlıklar olabilir, örneğin Windows'tasınız ve dosya sonları eşleşmiyor.
Koraktor

1
bir yandan tüm işlemleri sıfırlamak mümkün mü?
Webwoman

185

Bayrak --softyerine kullan --hard:

git reset --soft HEAD^

18
2 bayrak arasındaki farkı açıklayabilir misiniz?
John Giotta

1
Paket Yöneticisi Konsolu'nu açar ve bu "git reset --soft HEAD ^" komutunu çalıştırırsanız, istediğinizi (ve ihtiyacım olanı) yapar.
David Cornelson

54
@JohnGiotta - git reset --soft HEAD^Son yerel (unpushed) kaldırmak işlemek ama olacaktır değişiklikleri tutmak yaptın
FIDER

@fider Kurtarıcı! Kabul edilen cevabın hala işe yarayıp yaramadığından emin değilim, ancak bu OP'nin tam olarak cevaplaması gerektiği gibi olmalıdır.
Babu

git reset --soft HEAD~pencerelerde
Jack0fshad0ws

34

Bir taahhüdün ortasındaysanız (yani zaten düzenleyicinizde), birincinin üzerindeki tüm satırları silerek iptal edebilirsiniz #. Bu, taahhüdü iptal edecektir.

Böylece, tamamlama mesajının boş olması için tüm satırları silebilir ve ardından dosyayı kaydedebilirsiniz:

Böyle görünmeli.

Sonra bir mesaj alacaksınız Aborting commit due to empty commit message..

DÜZENLE :

Ayrıca tüm satırları silebilirsiniz ve sonuç tamamen aynı olacaktır.

Vim'deki tüm satırları silmek için (varsayılan düzenleyicinizse), düzenleyiciye girdikten ggsonra ilk satıra gitmek için yazın, ardından dGtüm satırları silmek için yazın. Son olarak, dosyayı yazıp çıkın wqve işleminiz iptal edilecektir.


3
Bu tam olarak ben aradığımı! Bu cevabın daha fazla oyuna ihtiyacı var :)
jdunk

FYI, arebase -i mybranchname
inostia'yı

18

Yapmanız gereken ilk şey, tamamlama mesajını silmeden önce yerel değişiklikleri korumak isteyip istemediğinizi belirlemektir.

git logGeçerli kesinleştirme mesajlarını göstermek için kullanın , ardından silmek istediğiniz kesinti değil, silmek istediğiniz kesinti commit_id öncesinde bulun .

Yerel olarak değiştirilen dosyaları saklamak ve yalnızca taahhüt mesajını silmek istiyorsanız:

git reset --soft commit_id

Yerel olarak değiştirilmiş tüm dosyaları ve tamamlama mesajını silmek istiyorsanız:

git reset --hard commit_id

Yumuşak ve sert arasındaki fark budur.


1
Bence tam tersi.
Ruff9

9

Git parametresini kullanarak git reset işlemi yaparken Git'e dizininizle (bir sonraki işlem haline gelecek dosya kümesi) ve çalışma dizininizle ne yapacağınızı söyleyebilirsiniz:

--soft: Index ve çalışma dizini değiştirilmezken yalnızca taahhütler sıfırlanır.

--mixed: Çalışma dizinine dokunulmazken, dizin KAFA ile eşleşecek şekilde sıfırlanır. Tüm değişiklikler çalışma dizininde kalacak ve değiştirilmiş olarak görünecektir.

--hard: HEAD ile eşleştirmek için her şeyi (taahhütler, dizin, çalışma dizini) sıfırlar.

Sizin durumunuzda, git reset --softdeğiştirilmiş değişikliklerinizi Dizin ve çalışma dizininde tutmak için kullanırım . Mutlaka kontrol edin bunu daha detaylı açıklama için.


1

Aşağıdaki komutu kullanın:

$ git reset HEAD~1

Bundan sonra, aşağıdaki yanıt gibi geri dönen dosyaları da görüntüleyebilirsiniz.

Unstaged changes after reset:
M   application/config/config.php
M   application/config/database.php
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.