Temizlenmemiş git komutlarını nasıl silebilirim?


948

Yanlışlıkla yanlış şubeye bağlı kaldım. Bu taahhüdü nasıl silerim?

Yanıtlar:


1811

Yaptığınız işi koruyarak en son taahhüdü silin:

git reset --soft HEAD~1

Yaptığınız işi yok ederek en son taahhüdü silin :

git reset --hard HEAD~1

13

128
Ve KAFA ~ 1 taahhüt emin olun ... Ayrıca yapabilirsingit reset --hard origin
Daenyth

13
Düşünceler git remotebenim için kökeni listeliyor, git reset --hard origindiyor fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.. Neden?
trss

7
Bu harika. Hayatımı kurtardım.
NinjaBoy

2
git reset HEAD~1ayrıca tüm değişikliklerinizi koruyacak, ancak her şeyi saklamak yerine boş bir dizin bırakacaktır ( --softseçenek gibi ).
Holloway

139

Bulduğum en iyi cevabın neden sadece yorumlarda olduğunu merak ediyorum! ( Daenyth tarafından 86 oyla )

git reset --hard origin

Bu komut, yerel deponuzu, yerel deponuzda yaptığınız her değişiklikten kurtulmak için uzak havuzla eşitler. Ayrıca, kaynak noktanızdaki tam dalı almak için aşağıdakileri yapabilirsiniz.

git reset --hard origin/<branch>

16
Bunun için teşekkürler, açıklamayı biraz genişletmek: belirli bir şube için:git reset --hard origin/<branch>
cleary

4
Veya git reset --soft origin/<branch>, taahhütten kurtulmak, ancak yerel işi tutmak istiyorsanız.
riverhorse

1
i olsun fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.: Eğer dal gibi belirtmeniz gerekir,git reset --hard origin/feature/my-cool-stuff
Kip

Parlak! Bu aslında, sadece kafayı ayıran ve sizi asılı bırakan "kabul edilen" yanıtın aksine çalışır.
mae

55

Silmeyin: sadece bir taahhüt git cherry-pickyeterlidir.

Ancak yanlış dalda birkaç taahhüdünüz varsa , işte burada git rebase --ontoparlar:

Varsayalım:

 x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

, işaretlemek masterve istediğiniz yere taşıyabilirsiniz:

 git checkout master
 git branch tmp
 git checkout y
 git branch -f master

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- y branch, master branch

, y dalını olması gereken yere sıfırlayın:

 git checkout y
 git reset --hard HEAD~2 # ~1 in your case, 
                         # or ~n, n = number of commits to cancel

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- master branch
                ^
                |
                -- y branch

ve son olarak taahhütlerinizi taşıyın (yeniden uygulayın, yeni taahhütler verin)

 git rebase --onto tmp y master
 git branch -D tmp


 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

maalesef soru bu değildi.
KatariaA

1
@KatariaA Bu, yanlış dalda yapılan taahhüdü silmenin geçerli bir alternatifidir ve aynı durumda başkalarına yardımcı olacaktır (yanlış branşta iyi taahhüt).
VonC

14

Yapmayın git rebase -i FAR_ENOUGH_BACKve istemediğiniz taahhüt için satır bırakın.


6

Bu taahhüdü başka bir şubeye taşımak istiyorsanız, söz konusu taahhüdün SHA'sını alın

git rev-parse HEAD

Ardından geçerli dalı değiştirin

git checkout other-branch

Ve cherry-picktaahhütother-branch

git cherry-pick <sha-of-the-commit>

Deneyimlerime göre, bu, orijinal şubedeki taahhüdü geri almaz, böylece git reset --hard HEAD~1daha sonraları gerektirir . Bence reset --softo zaman şubeleri değiştirmek ve tekrar işlemek ekstra işten tasarruf etmiş olurdu. Sonra yine benim temel şeyler yapmak için SourceTree kullanıyordum, sadece benim hatadan sonra bu komut satırı-line.
jusopi

3

Referans olarak, sadece git reset --hard ile değil, aynı zamanda aşağıdaki komutla mevcut şubenizden "sabit kesim" yapabileceğinize inanıyorum:

git checkout -B <branch-name> <SHA>

Aslında, kontrol etmeyi umursamıyorsanız, şubeyi istediğiniz herhangi bir şeye ayarlayabilirsiniz:

git branch -f <branch-name> <SHA>

Bu, örneğin yeni taahhütleri (rebase kullanarak) kopyalamak için bir şubeden taahhütleri kaldırmanın programlı bir yolu olacaktır.

Diyelim ki, başka bir konumdan kaynakları alıp da şubeye döktüğünüz için master bağlantısı kesilmiş bir şubeniz var.

Artık değişiklikleri uyguladığınız bir şubeniz var, buna "konu" diyelim.

Şimdi konu dalınızın bir kopyasını oluşturacak ve daha sonra dal "dökümü" nde bulunan kaynak kodu dökümü üzerine yeniden oluşturacaksınız:

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

Şimdi değişiklikleriniz, topic_duplicate dalında "dump" ın başlangıç ​​noktasına göre yeniden uygulanıyor, ancak yalnızca "master" dan bu yana gerçekleşen taahhütler uygulanıyor. Master'dan bu yana değişiklikleriniz artık "döküm" ün üstünde yeniden uygulanıyor ancak sonuç "topic_duplicate" ile sonuçlanıyor.

Daha sonra "döküm" ü "topic_duplicate" ile değiştirebilirsiniz:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

Veya ile

git branch -M topic_duplicate dump

Veya sadece çöplüğü atarak

git branch -D dump

Belki de şu anki "topic_duplicate" i temizledikten sonra kiraz toplayabilirsiniz.

Söylemeye çalıştığım, farklı bir atadan yola çıkarak geçerli "yinelenen" dalı güncellemek istiyorsanız, önce bir " git reset --hard <last-commit-to-retain>veya" git branch -f topic_duplicate <last-commit-to-retain>ve sonra diğer taahhütleri ( konu dalı) yeniden basma veya kiraz toplama yoluyla.

Yeniden pazarlama, yalnızca taahhütleri zaten olan bir dalda çalışır, bu nedenle bunu her yapmak istediğinizde konu dalınızı çoğaltmanız gerekir.

Kiraz yetiştiriciliği çok daha kolaydır:

git cherry-pick master..topic

Böylece tüm sekans aşağıya inecektir:

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

Konu yinelenen dalınız kullanıma alındığında. Bu, daha önce seçilen kiraz işlemlerini geçerli kopyadan kaldıracak ve geçerli "dökümünüzün (farklı ata)" üstündeki "konu" da gerçekleşen tüm değişiklikleri yeniden uygulayacaktır. Yerel değişikliklerinizin hala geçerli olup olmadığını kontrol etmek için farklı bir "aşağı akış" ustası kullanırken, gelişiminizi "gerçek" akış yukarı master'a dayandırmak için oldukça uygun bir yol gibi görünüyor. Alternatif olarak sadece bir fark üretebilir ve daha sonra herhangi bir Git kaynak ağacının dışına uygulayabilirsiniz. Ancak bu şekilde, gerçek gelişiminiz gerçek yukarı akış ustasına karşı iken, dağıtımınızın sürümüne dayanan güncel bir değiştirilmiş (yamalı) sürüm tutabilirsiniz.

Sadece göstermek için:

  • reset, şubenizi farklı bir işleme yönlendirir (--hard ayrıca önceki işlemi de denetler, --soft eklenen dosyaları dizinde tutar (bu işlem tekrar yaparsanız kaydedilecektir) ve varsayılan (- karışık) önceki taahhüdü kontrol edin (yerel değişikliklerinizi silerek) ancak dizini temizler (taahhüt için henüz hiçbir şey eklenmedi)
  • bir şubeyi farklı bir taahhüde işaret etmeye zorlayabilirsiniz
  • bu taahhüdü anında kontrol ederek de yapabilirsiniz.
  • mevcut şubenizde mevcut olan taahhütlere ilişkin yeniden değerlendirme çalışmaları
  • farklı bir daldan kopyalamak için kiraz toplama aracı

Umarım bu birine yardımcı olur. Bunu yeniden yazmak demekti ama şimdi başaramıyorum. Saygılarımızla.


0

Benim için çalışan komutun ardından, tüm yerel taahhüt edilen değişiklikler kaldırılır ve yerel, uzak kaynak / ana dal ile aynı şekilde sıfırlanır.

git reset --hard kökenli

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.